使用 FilerReader 读取后文件内容被删除 Java
File contents getting deleted after reading it using FilerReader Java
最近在做code review,代码是这样的:
File j = new File(aFile);
System.out.println(j.length());
BufferedReader fileReader = new BufferedReader(new FileReader(j));
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
System.out.println(j.length());
我有两个问题:
j
是 aFile
的副本吗,因为我见过其他用于复制文件的巨大方法,例如 here.
第一个 System.out.println()
打印 32
,第二个在创建文件 reader 后打印 0
。那么,为什么内容会被删除?有人可以解释这里发生了什么吗?
我放了那些 System.out.println()
语句来检查文件是否为空。
解法:
通读答案后,我想我发现了代码的问题所在。如果 j
只是一个引用,那么 fileWriter
试图写入同一个文件并且它是循环的。我在这儿吗?
编辑: 这不是建议问题的重复,因为整个混乱都认为 j
是 aFile
的克隆或重复。
1) j
不是重复的,它是对包装实际文件的新文件对象的引用。
2) 此代码无法删除(甚至更改)该文件。还有代码吗?
你不会向我们展示一切吧?
提供的代码绝对不会更改或删除文件,正如您正在使用的 类 的名称所表明的那样:BufferedReader
、FileReader
(注意 Reader
。
我认为一旦您创建读取器,某些操作系统可能会锁定文件的可能性很小,因此甚至不允许 File
对象读取 length()
属性 了。但是,我无法在任何地方找到记录或报告,所以我非常怀疑。
我运行下面的代码,其中test
是一个包含0123456789
的纯文本文件(长度10
) :
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Whosebug {
public static void main(String[] args) {
File f = new File("test");
System.out.println("Length before: " + f.length());
try {
BufferedReader fileReader = new BufferedReader(new FileReader(f));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("Length after: " + f.length());
}
}
结果:
Length before: 10
Length after: 10
因此,我怀疑问题出在其他地方。
编辑:
既然 OP 更新了问题,我们终于有了相关的行:
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
这就是文件为空的原因 及其长度0
的原因。 FileWriter
将打开文件进行写入并覆盖现有内容(如果有)。您可以通过传入第二个参数来防止这种情况,使用 another constructor of FileWriter
,一个接受 append
标志的参数:
public FileWriter(String fileName, boolean append) throws IOException
public FileWriter(File file, boolean append) throws IOException
Constructs a FileWriter object given a File object/name. If the second argument is true, then bytes will be written to the end of the file rather than the beginning.
换句话说,如果您不想覆盖内容,请将上面的行更改为:
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath(), true);
1) Is j a duplicate of aFile, because I have seen other huge methods for copying files, like here and here.
它是一个从 aFile
构造的 File
对象,无论它是什么。这个过程与复制文件无关,无论是大文件还是大文件。 File
只是包装了一个文件 name。不是它的内容。您的第一个 link 也与复制文件无关。
2) The first result prints 32 and the second result after creating a file reader prints 0. So, why are the contents getting deleted?
显然这不是真正的代码。真正的考验是fileReader.read()
是否立即returns-1.
最近在做code review,代码是这样的:
File j = new File(aFile);
System.out.println(j.length());
BufferedReader fileReader = new BufferedReader(new FileReader(j));
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
System.out.println(j.length());
我有两个问题:
j
是aFile
的副本吗,因为我见过其他用于复制文件的巨大方法,例如 here.第一个
System.out.println()
打印32
,第二个在创建文件 reader 后打印0
。那么,为什么内容会被删除?有人可以解释这里发生了什么吗?
我放了那些 System.out.println()
语句来检查文件是否为空。
解法:
通读答案后,我想我发现了代码的问题所在。如果 j
只是一个引用,那么 fileWriter
试图写入同一个文件并且它是循环的。我在这儿吗?
编辑: 这不是建议问题的重复,因为整个混乱都认为 j
是 aFile
的克隆或重复。
1) j
不是重复的,它是对包装实际文件的新文件对象的引用。
2) 此代码无法删除(甚至更改)该文件。还有代码吗?
你不会向我们展示一切吧?
提供的代码绝对不会更改或删除文件,正如您正在使用的 类 的名称所表明的那样:BufferedReader
、FileReader
(注意 Reader
。
我认为一旦您创建读取器,某些操作系统可能会锁定文件的可能性很小,因此甚至不允许 File
对象读取 length()
属性 了。但是,我无法在任何地方找到记录或报告,所以我非常怀疑。
我运行下面的代码,其中test
是一个包含0123456789
的纯文本文件(长度10
) :
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Whosebug {
public static void main(String[] args) {
File f = new File("test");
System.out.println("Length before: " + f.length());
try {
BufferedReader fileReader = new BufferedReader(new FileReader(f));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("Length after: " + f.length());
}
}
结果:
Length before: 10
Length after: 10
因此,我怀疑问题出在其他地方。
编辑:
既然 OP 更新了问题,我们终于有了相关的行:
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
这就是文件为空的原因 及其长度0
的原因。 FileWriter
将打开文件进行写入并覆盖现有内容(如果有)。您可以通过传入第二个参数来防止这种情况,使用 another constructor of FileWriter
,一个接受 append
标志的参数:
public FileWriter(String fileName, boolean append) throws IOException
public FileWriter(File file, boolean append) throws IOException
Constructs a FileWriter object given a File object/name. If the second argument is true, then bytes will be written to the end of the file rather than the beginning.
换句话说,如果您不想覆盖内容,请将上面的行更改为:
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath(), true);
1) Is j a duplicate of aFile, because I have seen other huge methods for copying files, like here and here.
它是一个从 aFile
构造的 File
对象,无论它是什么。这个过程与复制文件无关,无论是大文件还是大文件。 File
只是包装了一个文件 name。不是它的内容。您的第一个 link 也与复制文件无关。
2) The first result prints 32 and the second result after creating a file reader prints 0. So, why are the contents getting deleted?
显然这不是真正的代码。真正的考验是fileReader.read()
是否立即returns-1.