FileInputStream和FileOutputStream:读取和写入同一个文件



我创建了一个文本文件,内容为"Hello"我试着从文件中读取这些字符,然后再把它写回同一个文件。

假设: 1。文件现在的内容是"Hello"(重写)2. 文件现在的内容是"HelloHello"(附加)3.文件现在的内容是infinite "Hello"(或者抛出异常)

实际结果:原始"Hello"字符从文本文件中删除,文件为空。

实际测试

@Test
public void testCopyStream() throws IOException {
File workingDir = new File(System.getProperty("user.dir"));
File testFile = new File(workingDir, "/test.txt");
FileReader fin = new FileReader(testFile);
FileWriter fos = new FileWriter(testFile);
copyStream(fin, fos);
fin.close();
fos.close();
}

我创建了以下方法用于"copying"InputStreamOutputStream的数据:

private void copyStream(Reader in, Writer out) throws IOException {
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
}

我尝试使用调试器来找出问题,调试器显示b = in.read()在while循环的第一次迭代中被分配为-1。然后我在检查文件内容的同时一步一步地执行代码,发现"Hello"关键字在语句final FileWriter fos = new FileWriter(testFile);执行后被从文件中删除。

我首先认为这是由于InputStreamOutputStream指向同一个文件,所以文件得到某种"锁定";JVM的执行安全?

所以我试着交换这两行:

FileWriter fos = new FileWriter(testFile);
FileReader fin = new FileReader(testFile);

结果是一样的:文件内容在语句FileWriter fos = new FileWriter(testFile);

之后被删除我的问题是:为什么内容被FileWriter清理?这是一些与文件描述符相关的行为吗?是否有一种方法可以读取和写入同一个文件?

只是供参考,

  1. copyStream()方法工作正常,我已经用其他测试测试了它。
  2. 不是用append()方法代替write()方法

语句FileWriter fos = new FileWriter(testFile);截断现有文件

使用流访问来读写同一个文件是没有意义的,因为这不会给出可靠的结果。如果你想读/写同一个文件,使用RandomAccessFile:这需要查找当前位置,并在文件的不同位置执行读或写操作。

https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html

FileWriter实际上在写入之前删除文件中的所有内容。要保留文本,请使用

new FileWriter(file, true);

true参数是文件写入器的追加参数。否则它会覆盖所有

最新更新