在我的程序中,我正在尝试读取该文件,然后尝试使用txtFile方法覆盖该文件。 f是我正在阅读并对其内容进行操作的文件,现在想用新字符串s替换其内容。
String s = obj1.method(string);
toFile(s, f);
我的txtFile方法如下:
public static void txtFile(String cnvrt, File file)
{
try
{
PrintWriter printWriter = new PrintWriter (file);
printWriter.print(cnvrt);
printWriter.close ();
}
catch(Exception exception)
{
exception.printStackTrace();
}
}
执行此操作时,我的原始内容将被删除,文件将变空。请建议我如何使用printWriter类覆盖同一个文件?即使我使用FileWriter
和BufferedReader
,我也获得了空文件。有人能解释一下这种行为吗?
答案 0 :(得分:0)
根据您的代码和API,它应该有效(OP想要替换内容)。
请参阅http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File)
file - 要用作此writer的目标的文件。如果该文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。
<强>更新强>
在调用PrintWriter printWriter = new PrintWriter (file);
之前,您应该先关闭文件,以确保文件没有锁定。
此外,与PrintStream类不同,如果启用了自动刷新,则只有在调用println,printf或format方法之一时才会执行,而不是每当输出换行符时都会执行。
因此请使用printWriter.flush()
确保将内容刷新到磁盘。
当然,您应该检查以确保您写入的内容有效且不为空。
答案 1 :(得分:0)
如果你想用文件中的更改/更改/更新信息覆盖文件,我可以想到两种方法
1)使用StringBuilder
附加每条所需/更改的行,然后将StringBuilder#toString()
打印到文件中。这将使用更新的信息覆盖文件
2)将每个所需/更改的行写入临时文件,然后将临时文件重命名为旧文件名。见Answer
答案 2 :(得分:-1)
为什么不简单地删除并创建新的?
public static void txtFile(String cnvrt, File file)
{
PrintWriter printWriter = null;
String filepath = file.getAbsolutePath();
try {
if(file.exists()){
file.delete();
}
printWriter = new PrintWriter(new File(filepath));
printWriter.print(cnvrt);
printWriter.close ();
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
注意:捕获RuntimeException并不是一个好的编程习惯,除非你打算用它做什么。