Java FileWriter 覆盖
Posted
技术标签:
【中文标题】Java FileWriter 覆盖【英文标题】:Java FileWriter overwrite 【发布时间】:2010-12-09 15:50:12 【问题描述】:每当有新数据作为 InputStream 可用时,我有一段代码会生成新数据。每次都会覆盖相同的文件。有时文件在写入之前变为 0 kb。 Web 服务会定期读取这些文件。我需要避免文件为 0 字节的情况。
它是如何做到的?在这种情况下,锁会有帮助吗?如果浏览器进来读取一个被锁定的文件,浏览器是否会继续显示缓存中的旧数据,直到锁定被释放并且文件可以再次读取。
try
String outputFile = "output.html";
FileWriter fWriter = new FileWriter(outputFile);
//write the data ...
fWriter .flush();
outputFile = "anotheroutput.html";
fWriter = new FileWriter(outputFile);
//write the data ...
fWriter .flush();
fWriter.close();
catch(Exception e)
e.prinStackTrace();
【问题讨论】:
我想你正在寻找File.length()
。此方法以字节为单位返回文件大小。
【参考方案1】:
尝试写入临时文件(在同一文件系统中),一旦文件写入完成,使用 File.renameTo() 将其移动到位。如果您的底层文件系统支持原子移动操作(大多数都支持),那么您应该获得所需的行为。如果您在 Windows 上运行,则必须确保在读取后关闭文件,否则文件移动将失败。
public class Data
private final File file;
protected Data(String fileName)
this.file = new File(filename);
/* above is in some class somehwere
* then your code brings new info to the file
*/
//
public synchronized accessFile(String data)
try
// Create temporary file
String tempFilename = UUID.randomUUID().toString() + ".tmp";
File tempFile = new File(tempFilename);
//write the data ...
FileWriter fWriter = new FileWriter(tempFile);
fWriter.write(data);
fWriter.flush();
fWriter.close();
// Move the new file in place
if (!tempFile.renameTo(file))
// You may want to retry if move fails?
throw new IOException("Move Failed");
catch(Exception e)
// Do something sensible with the exception.
e.prinStackTrace();
【讨论】:
【参考方案2】:FileWriter fWriter = new FileWriter(fileName,true);
尝试使用上述方法 :-)
【讨论】:
【参考方案3】:您的要求不是很明确。你想每次都写一个新的名称文件,或者你想追加到同一个文件,或者你想覆盖同一个文件?无论如何,这三种情况都很简单,您可以通过 API 进行管理。
如果问题是 Web 服务正在读取尚未完成的文件,即处于写入阶段。在您的网络服务中,您应该检查该文件是否为只读,然后只有您读取该文件。在写入阶段,一旦写入完成,将文件设置为只读。
发生 0Kb 文件是因为您再次覆盖同一文件。覆盖会清理所有数据,然后开始写入新内容。
【讨论】:
【参考方案4】:public class Data
String fileName;
protected Data(String fileName)
this.fileName= fileName;
return; // return from constructor often not needed.
/* above is in some class somehwere
* then your code brings new info to the file
*/
//
public synchronized accessFile(String data)
try
// File name to be class member.
FileWriter fWriter = new FileWriter(fileName);
//write the data ...
fWriter.write(data);
fWriter .flush();
fWriter .close();
return;
catch(Exception e)
e.prinStackTrace();
这不是必需的:
outputFile = "anotheroutput.html";
fWriter = new FileWriter(outputFile);
//write the data ...
fWriter .flush();
fWriter.close();
那是因为处理文件是 Data 类的方法
【讨论】:
!?您假设访问该文件的所有程序都在同一个 JVM 中,因此“同步”关键字可防止多个例程同时使用该文件。 JVM 之外的进程呢?电脑外? (如果文件通过网络共享) Jason,我试图提出一些东西来实现扁平化(我不知道它叫什么,我一直这样做)的概念,你可以通过填写复制粘贴缓冲区并展开循环,我会在 op 注意到它后进入 sync() 并锁定 - 我现在正忙于 JCE,当他得到零长度无事可做时,留在 op工作...这与您在我的...上提到的另一个相似...呵呵,网站所有者->我们可以在所有繁重的脚本中获得代码编辑器吗???.....真的,真的会有所帮助(大时代!)以上是关于Java FileWriter 覆盖的主要内容,如果未能解决你的问题,请参考以下文章