【问题标题】:FileInputStream is not ending in javaFileInputStream 没有以 java 结尾
【发布时间】:2013-12-10 17:03:22
【问题描述】:

当我遇到这段代码时,我正在练习在 Java 中使用字节流:

import java.io.*;
public class CopyBytes_practice {
public static void main(String args[]) throws IOException {
    FileInputStream f=null;
    FileOutputStream fo=null;
    int c;
    int d;
    try {
        f=new FileInputStream("a.png");
        fo=new FileOutputStream("b.png");
        c=f.read();
        while(c != -1){
            fo.write(c);
        }
    } finally {
        if (f != null) {
            f.close();
        }
        if (fo != null) {
            fo.close();
        }
    }
}

我使用了一个 35kb a.png 文件和一个 0kb b.png 文件来执行代码,但是代码一直运行——在我手动停止 JVM 之前,b.png 的大小达到了 905mb。

我很困惑,为什么没有返回文件结束状态?是不是二进制文件不支持,还是有其他问题?

【问题讨论】:

    标签: java file io stream


    【解决方案1】:

    是的,因为它是一个无限循环,所以你需要告诉循环在哪里停止。换句话说,循环应该一直读取直到它到达文件的末尾。

     while ((c= f.read()) != -1){
        fo.write(c);
     }
    

    【讨论】:

    • 因为 c 仍然等于第一个字节值,所以 read() 在到达文件末尾时返回 -1。每次调用 read() 都会跳转到下一个块 @user2869389
    【解决方案2】:

    你错过了一些重要的事情

    c=f.read(); // <-- Read in one byte ...
    while(c != -1){
      fo.write(c);
      c=f.read(); // <--- Add this, to Read in the next byte (or -1)...
    }
    

    所以你在无限循环,并从你的源代码中写入第一个byte

    【讨论】:

    • 解决了...但我不明白,你能解释一下c=f.read();做了什么吗???
    • 您只读取源文件的第一个字节并永远写入它。它永远不会是“-1”,所以它永远不会停止。调用 c=f.read 会继续处理源文件直到结束。
    • 哦,我现在明白了,这意味着写 while((c=f.read()) != -1) 本来可以让我开心的,ryt?谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2023-04-02
    • 2015-09-25
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多