Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java reset()导致StreamCorruptedException_Java_Android_Stream - Fatal编程技术网

Java reset()导致StreamCorruptedException

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;

我有一个类,其中包含对文件uri的引用。该文件应该通过网络传输,可以很大(例如视频),我希望在实例(反)序列化期间透明地传输:

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()中调用它这是一个非常糟糕的主意,这就是为什么我放弃了整个方法。释放内存是在正确的位置调用时产生的效果。在错误的位置调用它会导致你所问的问题。我想你可以称之为一种效果,但它不是一种理想的效果。你很难将其描述为正确的答案。你没有正确的答案不知道是什么把它修好了。