从InputStream读取并写入OutputStream

Ama*_*mac 3 java

这应该非常简单,我搜索过谷歌,但没有看到有人提到我注意到的问题.我见过的所有东西都是基本相同的东西.像这样:

byte [] buffer = new byte[256];
int bytesRead = 0;
while((bytesRead = input.read(buffer)) != -1)
{
    output.write(buffer, 0, bytesRead);
}
Run Code Online (Sandbox Code Playgroud)

我知道当达到EOF时read()返回-1,但是如果文件小于缓冲区甚至相同大小怎么办?例如,正在读入一个200字节的文件.我假设它读取了200个字节,但返回-1.这与javadocs匹配,但它也意味着永远不会调用write().我本来希望实际告诉我它读取200个字节,并在下一次迭代时返回-1.

我该如何解决这个"问题"?

Lou*_*man 12

仅供参考,番石榴ByteStreams.copy(InputStream, OutputStream),你可以直接使用,或者看看它是如何解决这个问题.


msi*_*msi 7

你的代码

byte [] buffer = new byte[256];
int bytesRead = 0;
while((bytesRead = input.read(buffer)) != -1) {
    output.write(buffer, 0, bytesRead);
}
Run Code Online (Sandbox Code Playgroud)

工作正常.

例如,假设您有一个包含300个字符(600字节)的文件:

步骤1.缓冲区将读取256个字节并将其重写为输出; 344离开EOF

步骤2.缓冲区将读取256个字节并将其重写为输出; 88离开EOF

步骤3.缓冲区将读取88个字节(byteRead == 88)并将其重写为输出; EOF离开了

第4步.EOF(input.read(buffer)返回-1)

...编辑

以上步骤不是理论.我通过使用以下代码重写实际文件内容来获得此信息:

static void rewrite() throws IOException {
    InputStream input = new FileInputStream("file1.txt");
    OutputStream output = new FileOutputStream("file2.txt");
    byte[] buffer = new byte[256];
    int bytesRead = 0;
    while ((bytesRead = input.read(buffer)) != -1) {
        System.out.println(bytesRead);
        output.write(buffer, 0, bytesRead);
    }
}
Run Code Online (Sandbox Code Playgroud)

也许你的配置还有别的问题.