FileInputStream 和 FileOutputStream:读写同一个文件
FileInputStream and FileOutputStream: Read and write to the same file
我创建了一个内容为“Hello”的文本文件,我试图从文件中读取这些字符并将其再次写回同一个文件。
假设:
1。该文件现在的内容为“Hello”(已覆盖)
2.文件现在有内容“HelloHello”(附加)
3.文件现在有无限的内容“你好”(或抛出异常)
实际结果:
原来的“你好”字符从文本文件中删除,文件留空。
实测
@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();
}
我创建了以下方法来将 InputStream
中的数据“复制”到 OutputStream
:
private void copyStream(Reader in, Writer out) throws IOException {
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
}
我尝试使用调试器找出问题所在,调试器显示 b = in.read()
在 while 循环的第一次迭代时被赋值 -1
。然后我在检查文件内容的同时逐步执行代码,发现在语句final FileWriter fos = new FileWriter(testFile);
执行后,“Hello”关键字立即从文件中删除。
我首先认为这是由于 InputStream
和 OutputStream
指向同一个文件,所以该文件被 JVM 某种程度上“锁定”以确保执行安全?
所以我尝试交换这两行:
FileWriter fos = new FileWriter(testFile);
FileReader fin = new FileReader(testFile);
结果是一样的:文件内容在语句 FileWriter fos = new FileWriter(testFile);
之后被删除了
我的问题是:为什么内容被 FileWriter
清除了?。这是与 FileDescriptor 相关的一些行为吗?有没有办法读写同一个文件?
仅供参考,
copyStream()
方法没问题,我用其他测试测试过。
- 不是用
append()
方法代替write()
FileWriter
实际上是在写入之前删除文件中的所有内容。要保留文本,请使用
new FileWriter(file, true);
true参数是filewriter的append参数。否则它只会覆盖一切
语句 FileWriter fos = new FileWriter(testFile);
截断现有文件。
您使用流式访问来读写同一文件没有意义,因为这不会提供可靠的结果。如果要读取/写入同一文件,请使用 RandomAccessFile:这会调用查找当前位置并在文件的不同位置执行读取或写入。
https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html
我创建了一个内容为“Hello”的文本文件,我试图从文件中读取这些字符并将其再次写回同一个文件。
假设: 1。该文件现在的内容为“Hello”(已覆盖) 2.文件现在有内容“HelloHello”(附加) 3.文件现在有无限的内容“你好”(或抛出异常)
实际结果: 原来的“你好”字符从文本文件中删除,文件留空。
实测
@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();
}
我创建了以下方法来将 InputStream
中的数据“复制”到 OutputStream
:
private void copyStream(Reader in, Writer out) throws IOException {
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
}
我尝试使用调试器找出问题所在,调试器显示 b = in.read()
在 while 循环的第一次迭代时被赋值 -1
。然后我在检查文件内容的同时逐步执行代码,发现在语句final FileWriter fos = new FileWriter(testFile);
执行后,“Hello”关键字立即从文件中删除。
我首先认为这是由于 InputStream
和 OutputStream
指向同一个文件,所以该文件被 JVM 某种程度上“锁定”以确保执行安全?
所以我尝试交换这两行:
FileWriter fos = new FileWriter(testFile);
FileReader fin = new FileReader(testFile);
结果是一样的:文件内容在语句 FileWriter fos = new FileWriter(testFile);
我的问题是:为什么内容被 FileWriter
清除了?。这是与 FileDescriptor 相关的一些行为吗?有没有办法读写同一个文件?
仅供参考,
copyStream()
方法没问题,我用其他测试测试过。- 不是用
append()
方法代替write()
FileWriter
实际上是在写入之前删除文件中的所有内容。要保留文本,请使用
new FileWriter(file, true);
true参数是filewriter的append参数。否则它只会覆盖一切
语句 FileWriter fos = new FileWriter(testFile);
截断现有文件。
您使用流式访问来读写同一文件没有意义,因为这不会提供可靠的结果。如果要读取/写入同一文件,请使用 RandomAccessFile:这会调用查找当前位置并在文件的不同位置执行读取或写入。
https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html