如何在Java中限制文件大小

4

我正在创建一个应用程序文件,并且不断向该文件中写入一些内容。

但是当我的文件达到某个大小时,比如说100行,我想要删除第一行并将新的一行写在底部。

需求是我的文件应该有限制,但它应该保持我已经写入文件的最新内容。

请告诉我这是否可能在Java中实现?如果有其他替代方法,请告诉我。


也许你可以编写一段代码,当文件行数超过100行时,将其拆分为另一个文件并删除旧文件?当然,这会比你原本想要的更加耗费CPU时间,但它可以解决你的问题。 - newbie
3个回答

7
请告诉我在Java中是否可能实现此功能?
这无法简单地完成。您只能截断文件的最后一部分。(这是底层文件系统的一个固有限制,由于与在文件中间插入字节相同的原因。)
您可以手动执行以下操作:
1. 找出第一行的字节长度n。 2. 对于i = n ... 文件长度 1. 将位置i处的字节写入位置i-n。 3. 截断文件至长度为文件长度-n。
请告诉我是否有任何其他替代方法。
我建议您使用循环缓冲区或类似的东西来解决它。但是,如果不是所有行都等长,除非将缓冲区保留在内存中并将其转储到(清除的)文件中,否则会遇到麻烦。

4
这是可行的,但根据您的实现方式,可能会非常缓慢。至少将前100行保存在内存中的数据结构(如Vector),这样您就不必每次读取文件,而只需在删除第一个元素并追加新的最后一个元素时进行写入。
另一种选择是将每行都存储在自己的文件中。然后,每当超过100行时,您只需要删除一个文件并创建一个新文件。
[稍晚] 如果您的行有可预测的大小,则可以考虑使用固定长度记录。每行以空格开头,接着是文本,然后是用于填充记录的空格,并在末尾添加换行符(如果需要)。每次写入记录时,都要在其前面加上一个星号,表示该记录是当前行,并进入上一行(使用模运算符使其自动环绕),并将那个星号替换为一个空格。例如,一个包含10行日志的示例如下:
 this happened at that time                        
 blah blah happened                             
*this is the current record
 this was the fourth event to occur after startup
 this was the fifth event to occur after startup
 this was the sixth event to occur after startup
 this was the seventh event to occur after startup
 this was the eighth event to occur after startup
 this was the ninth event to occur after startup
 this was the tenth event to occur after startup

这样,您只需要打开文件,索引到当前行(因为您在程序中进行了跟踪,所以您知道当前行),并覆盖它,用空格填充到所选长度。然后索引回一个记录,并用空格替换星号。


0
我会使用循环缓冲区。我将用两个文件实现它,并在第一个文件包含100行时开始使用第二个文件。当第一个文件达到100行时,切换回写入第一个文件。这样你就始终有100到200行总数(第一次至少达到100行)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接