使用FileInputStream和FileOutputStream读取和写入同一文件



我的代码的问题是读写的无限循环

我找不到这个问题的解决方案或概念。

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);
}

相关内容

  • 没有找到相关文章

最新更新