我正试图让这段代码工作。它是一个基本的I/O系统,复制一个文件并将其粘贴到具有所选名称的同一目录中。这应该很简单,但由于某些原因,程序运行时,它创建了第二个文件,但随后卡住了。Java进程的CPU占用率在5%左右,文件永远不会完成。它只复制了一些数据,然后我想象它在某个地方陷入了无限循环。
我已经将我的代码与Oracle网站上的字节流教程进行了比较。
EXTRA:我只是要求它输出它正在读取的内容,它被困在读取值255
的无限循环中。如果有帮助的话。另外,我直接从Oracle网站编译代码,它做同样的事情。
据我所知,这似乎是一致的。谁能告诉我我哪里做错了?谢谢你。
(p。S:我正在使用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");
在关闭OutputStream之前尝试执行fout.flush()
好了,我知道发生了什么。真是个愚蠢的错误。
如果别人也有这个问题,我就把自尊心放在一边。这不是一个无限循环,只是使用ByteStreams进行复制需要花费AGES。我期望从小图像文件中获得快速结果,但即使是小图像文件也需要很长时间才能复制。我让它运行30秒,程序正常终止,我得到了我的图像副本。谢天谢地总算解决了,我还在担心呢
…或者不要自找麻烦重新发明轮子:使用FileUtils。copyFile来自经过验证的Apache commons-io,它在一行内完成。
(注意:这个评论并不像看起来那么无辜:File.rename
在Windows共享上不能很好地工作- commons-io是总是做这些事情的安全赌注)
编辑
- Stackoverflow不是一个"家庭作业"的好地方——或者你至少必须这么说。这并不是说你的问题不真实。这是你的目标不同:你想学习一些东西,我们想让它以最少的维护可靠地工作。
- …这就引出了我的第二点:当你在职业生涯中,永远不要再编写这样的程序。正如您所发现的那样,即使您使它工作,它也可能非常低效,处理错误不正确,等等。对于IO来说尤其如此,总是比看起来更棘手。
- 最后,既然我给了你一个链接到Apache 2.0许可下的一个很受信任的库,也许你可以看看源代码?