Java reset()导致StreamCorruptedException
我有一个类,其中包含对文件uri的引用。该文件应该通过网络传输,可以很大(例如视频),我希望在实例(反)序列化期间透明地传输:Java reset()导致StreamCorruptedException,java,android,stream,Java,Android,Stream,我有一个类,其中包含对文件uri的引用。该文件应该通过网络传输,可以很大(例如视频),我希望在实例(反)序列化期间透明地传输: public class NetworkAttachment implements Serializable { private static final long serialVersionUID = 1L; private final String name; // file name private final long length;
public class NetworkAttachment implements Serializable {
private static final long serialVersionUID = 1L;
private final String name; // file name
private final long length; // file length
private final long lastModified; // last modification time
private final String type; // mime type
private transient final Context context;
private transient final Uri uri;
[...]
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // write all non-transient fields
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
if (parcelFileDescriptor != null) {
FileInputStream fis = new FileInputStream(parcelFileDescriptor.getFileDescriptor());
byte[] buffer = new byte[1024 * 1024]; // 1 MB temp buffer
int len;
while ((len = fis.read(buffer)) != -1) {
oos.write(buffer, 0, len);
// reset the cache else OOM exception
oos.reset();
}
}
}
}
另一方面,实例由等效代码读取:
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject(); // read all non-transient fields
File file = new File(name);
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024 * 1024]; // 1 MB temp buffer
int len;
while ((len = ois.read(buffer)) != -1) { // <--- StreamCorruptedException
fos.write(buffer, 0, len);
}
}
private void readObject(ObjectInputStream ois)抛出ClassNotFoundException、IOException{
ois.defaultReadObject();//读取所有非瞬态字段
文件文件=新文件(名称);
FileOutputStream fos=新的FileOutputStream(文件);
字节[]缓冲区=新字节[1024*1024];//1 MB临时缓冲区
内伦;
虽然((len=ois.read(buffer))!=-1{/,但我用了不同的方式实现了它(不使用ObjectOutputStream),但问题在于JDK的不兼容性——Android端运行JDK 6(由Google提供),服务器运行JDK 7(由Oracle提供)。可能流式代码和reset()中有一些代码更改兼容性没有得到保持。您不应该在writeObject()方法中调用reset()
。在调用代码的外部调用它。它在任何地方都不会有太大的效果,在写循环中调用它是毫无意义的。定义“多效果”--我观察到的效果是它释放了内存。没有reset()我看到一个OOM异常,而reset()我没有看到。无法在writeObject()外部调用它,因为OOM异常是由文件输入流(200+MB)生成的文件的极端大小引起的。但您是对的,在writeObject()中调用它这是一个非常糟糕的主意,这就是为什么我放弃了整个方法。释放内存是在正确的位置调用时产生的效果。在错误的位置调用它会导致你所问的问题。我想你可以称之为一种效果,但它不是一种理想的效果。你很难将其描述为正确的答案。你没有正确的答案不知道是什么把它修好了。