如何在Java中限制文件大小

时间:2011-08-17 07:32:58

标签: java android

我正在我的应用程序中创建一个文件,我一直在写一些内容到这个文件中。

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

要求是我的文件应该受到限制,但它应该保留我写入文件的最新内容。

请告诉我它是否可以在Java中使用?如果有任何替代方法,请告诉我。

3 个答案:

答案 0 :(得分:7)

  

请告诉我是否可以使用Java?

这不能以简单的方式完成。您只能截断文件的最后一部分。 (这是来自底层文件系统的继承限制,并且由于与在文件中间插入字节的原因相同的原因。)

可以手动执行:

  1. 确定第一行的字节长度n
  2. i = n ... length of file
    1. 将pos i的字节写入pos i - n
  3. 将文件截断为length of file - n。{/ li>
      

    如果您有任何其他选择,请与我们联系。

    我建议您使用循环缓冲区或类似的东西来解决它。尽管如此,如果不是所有行都等长,你会遇到麻烦,除非你将缓冲区保留在内存中,并将其转储到(已清除的)文件中。

答案 1 :(得分: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

这样你只需要打开文件,索引到当前行(你知道因为你在你的程序中跟踪;否则,在重启时,循环找到星号),并覆盖它,填充它具有所选长度的空格。然后索引一条记录并用空格替换星号。

答案 2 :(得分:0)

我使用循环缓冲区。我用2个文件实现它的方式,如果第一个文件包含100行,则开始使用第二个文件。当该文件达到100行时,切换回写入第一个。这样你总有100到200行(一旦你第一次达到至少100行)。