我的代码的问题是读写的无限循环。
我找不到这个问题的解决方案或概念。
FileInputStream in = new FileInputStream("toto.txt");
FileOutputStream out = new FileOutputStream("toto.txt",false);
int m;
while ((m = in.read()) != 0) {
System.out.print(m);
out.write(m);
}
in.close();
out.close();
将循环条件更改为:
while ((m = in.read()) != -1)
我的代码在读写的无限循环中的问题。我找不到此问题的解决方案或概念。
您的代码有很多问题:
-
FileOutputStream
实例化后,文件将被视为空,因为您已将append
标志设置为false
。End方法read()
将始终返回-1
,因为没有要读取的内容。 -
条件不正确,方法
read()
,仅因为该控制进入循环,EOF(-1
(被重复写入文件。如果将条件固定为(m = in.read()) != -1
,则循环将被忽略,因为文件从一开始就是空白的。 -
如果您同时做这两件事:修复条件并将
append
标志更改为true
,那么您将获得另一种风格的无限循环。文件的所有内容都将被成功读取并重复附加到文件中。
因此,在任何情况下,同时读取和写入同一个文件都不是一个好主意。
关于异常处理的一个重要注意事项。
因为您的代码片段中没有catch
块,所以我假设您已经向main((添加了一个throws
——这不是一个好主意。只有在成功执行的情况下才会调用代码中的方法close()
,但如果发生异常,资源将永远不会被释放。
相反,我建议您使用尝试使用资源。这将为您提供一个隐式finally块,它将负责关闭资源,而不管是否发生异常(现在,如果发生异常,将不会执行对close()
的调用(。另一种选择是显式声明finally
块,并关闭其中的资源
尝试使用资源是一种更简洁、更干净的方式,可以确保资源得到释放。
还可以考虑使用缓冲的高级流包装这两个流以提高性能。这将大大减少应用程序访问文件系统所需的时间。
try (var in = new BufferedInputStream(new FileInputStream("source.txt"));
var out = new BufferedOutputStream(new FileOutputStream("destination.txt", false))) {
int next; // a subsequent byte that has been read from the source
while ((next = in.read()) != -1) {
out.write(next);
}
} catch (IOException e) {
e.printStackTrace();
}
它进入一个无限循环,因为读取将看到过去写入的结果。
无法使用FileInputStream和FileOutputStream读取和写入同一文件。如果要读取/写入同一文件,请使用RandomAccessFile。如果要在文件中的特定位置进行书写,也可以指定位置。
如果你想写到文件的末尾,然后读取文件上的所有行,那么这里有一个例子:
RandomAccessFile file = new RandomAccessFile("toto.txt", "rw");
file.seek(file.length());
file.writeBytes("This is a temp file");
file.seek(0); //sets the pointer to the first byte
String line;
while((line = file.readLine()) != null) {
System.out.println(line);
}