在OutputStream中保存一个字节有什么区别

时间:2017-12-07 23:59:32

标签: java file serialization inputstream outputstream

你好我有下一个代码:

package com.jucepho;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

class Copy{
public Copy(byte[] buffer,int count) {
    this.buffer = buffer;
    this.count = count;
}
private byte[] buffer;
private int count;

public byte[] getBuffer() {
    return buffer;
}
public int getCount() {
    return count;
}
}

public class ReaderTwo {

public static void main(String[] args) throws IOException {
    InputStream is = new FileInputStream("ex.docx");
     OutputStream os = new FileOutputStream("exBu.docx");
     OutputStream os2 = new FileOutputStream("exBu2.docx");
    ArrayList<Copy> lista = new ArrayList<>();
    byte[] buffer = new byte[4096];
    int count;
    while ((count = is.read(buffer)) > 0)
    {
           os.write(buffer, 0, count);
        lista.add(new Copy(buffer,count));
    }

    for(Copy c: lista) {
        os2.write(c.getBuffer(), 0, c.getCount());
    }


}

}

我想读取超过5 GB的文件以保存它。所以我看到我必须以这种方式阅读它(Encrypting a large file with AES using JAVA

我的问题是,为什么

OutputStream os = new FileOutputStream("exBu.docx");

复制好数据,我的意思是文件正确但是

OutputStream os2 = new FileOutputStream("exBu2.docx");

不正确,已损坏或我不知道为什么我这样做,对吧?我在ArrayList中保存了相同的信息,所以为什么我的文件被破坏了。 (是的,我需要将所有信息保存在一个名为Copy的对象中,因为我将使用序列化并将其保存在其他HD中)

谢谢

1 个答案:

答案 0 :(得分:2)

new Copy(buffer,count)

这不会创建新的byte[],它只是将同一个数组一遍又一遍地传递到Copy实例中;下次将数据读入该数组时,将覆盖所有先前Copy个实例中的数组内容。

如果您希望Copy保持不变,请复制缓冲区:

new Copy(Arrays.copyOf(buffer, count), count)

(或在构造函数中执行:this.buffer = Arrays.copyOf(buffer, count);