0

我试图让这段代码工作。这是一个基本的 I/O 系统,它复制一个文件并将其粘贴到具有所选名称的同一目录中。它应该很简单,但由于某种原因程序运行,它创建了第二个文件,但随后卡住了。Java 进程的 CPU 占用率约为 5%,并且文件从未完成。它只复制一些数据,然后我想它在某个地方陷入了无限循环。

我已经将我的代码与Oracle 网站上的字节流教程进行了比较。

额外:我只是要求它输出它正在读取的内容,并且它卡在读取 value 的无限循环中255。如果这有帮助。另外,我直接从 Oracle 网站编译了代码,它也做了同样的事情。

据我所知,这似乎是一致的。谁能告诉我我做错了什么?谢谢你。

(PS:我使用的是 Eclipse 4.2.0)。

这就是我复制文件的方法:

package fileIO;

import java.io.*;

import system.Debug;

public class fileUtil {

    public static void copyFileTo(String file2Copy, String file2Paste) {
        FileInputStream fin = null;
        FileOutputStream fout = null;

        try {
            fin = new FileInputStream(file2Copy);
            fout = new FileOutputStream(file2Paste);

            int aByte;
            while ((aByte = fin.read()) != -1) {
                fout.write(aByte);
            }
        } catch (FileNotFoundException e) {
            Debug.out("Error: File Not Found: " + file2Copy);
        } catch (IOException e) {
            Debug.out("Error: File IO Exception Copying: " + file2Copy);
        } catch (Exception e) {
            Debug.out("Error: General Exception Closing Streams:" + file2Copy);
        } finally {
            try {
                fin.close();
                fout.close();
            } catch (IOException e) {
                Debug.out("Error: File IO Exception Closing Streams: " + file2Copy);
            } catch (Exception e) {
                Debug.out("Error: General Exception Closing Streams:" + file2Copy);
            }
        }
    }
}

在我的程序主类中,我运行这个:

fileUtil.copyFileTo("google.bmp", "google(1).bmp");
4

3 回答 3

1

尝试fout.flush()在关闭 OutputStream 之前执行此操作。

于 2013-03-21T11:50:01.510 回答
0

...或者不要发明麻烦重新发明轮子:使用经过验证的 Apache commons-io 中的FileUtils.copyFile,它可以在一行中完成。

(请注意:此评论并不像看起来那么无辜:File.rename在 Windows 共享上效果不佳 - commons-io始终是做这些事情的安全选择)

编辑

  1. Stackoverflow 不是“家庭作业”的好去处——或者你至少必须这么说。这并不是说你的问题不真实。您的目标不同:您想学习一些东西,我们希望以最少的维护使其可靠地工作。
  2. ...这引出了我的第二点:当你在职业生涯中时,永远不要再编程了。正如您所发现的,即使您让它工作,它也可能效率极低,错误处理错误等等。对于 IO 尤其如此,它总是比看起来更棘手。
  3. 最后,既然我给了你一个在 Apache 2.0 许可下非常受信任的库的链接,也许你可以看看源代码
于 2013-03-21T12:14:54.843 回答
0

好的,所以我发现了发生了什么。是一个非常愚蠢的错误。

我会把我的骄傲放在一边,以防其他人有这个问题。这不是无限循环,只是使用 ByteStreams 进行复制需要 AGES。我期待从小图像文件中获得快速结果,但即使是小图像文件也需要很长时间才能复制。我让它运行了 30 秒,程序正常终止,我得到了我的图像副本。

感谢上帝,它已经解决了,我开始担心了。

于 2013-03-21T22:39:07.737 回答