如何写/读到文本文件的开头?

时间:2011-10-18 01:26:31

标签: java file text

修改 这是我的文件阅读器,我可以从下到上阅读它,看看从下到上写它是多么困难。

        BufferedReader mainChat = new BufferedReader(new FileReader("./messages/messages.txt"));
    String str;
    while ((str = mainChat.readLine()) != null) 
    {
        System.out.println(str);
    }
    mainChat.close();

或(旧问题)

如何让它将下一个String放在文件的开头,然后插入一个新行(将其他行向下移动)?

FileWriter chatBuffer = new FileWriter("./messages/messages.txt",true);
BufferedWriter mainChat = new BufferedWriter(chatBuffer);
mainChat.write(message);
mainChat.newLine();
mainChat.flush();
mainChat.close();

4 个答案:

答案 0 :(得分:6)

有人可以纠正我,但我很确定在大多数操作系统中,没有其他选择,只能读取整个文件,然后再写回来。

我认为主要原因是,在大多数现代操作系统中,光盘上的所有文件都始于边界的开头。问题是,您无法告诉文件分配表您的文件早于该点开始。

因此,必须重写文件中的所有后续字节。我不知道任何操作系统例程只需一步即可完成。

所以,我会使用BufferedReader将整个文件存储到VectorStringBuffer中,然后先用前缀字符串将其全部写回来。

-

修改

一种为大型文件节省内存的方法,阅读@ Saury的randomaccessfile建议,将是:

file has N bytes to start with
we want to add on "hello world"
open the file for append
append 11 spaces
i=N
loop {
   go back to byte i
   read a byte 
   move to byte i+11
   write that byte back
   i--
} until i==0
then move to byte 0
write "hello world" 

答案 1 :(得分:0)

使用RandomAccessFile以相反的顺序读取/写入文件。有关详细信息,请参阅以下链接。

http://www.java2s.com/Code/Java/File-Input-Output/UseRandomAccessFiletoreverseafile.htm
http://download.oracle.com/javase/1.5.0/docs/api/java/io/RandomAccessFile.html

答案 2 :(得分:0)

如果可以,请使用Apache Common IO中的FileUtils来简化此操作。但是,它仍然需要读取整个文件,因此对于大文件来说会很慢。

 List<String> newList = Arrays.asList("3");
 File file = new File("./messages/messages.txt");
 newList.addAll(FileUtils.readLines(file));
 FileUtils.writeLines(file, newList);

FileUtils也有读/写方法来处理编码。

答案 3 :(得分:0)

正如在此处所建议的那样,预先挂起到文件是相当困难的,并且确实与文件如何存储在硬盘驱动器上有关。操作系统无法自然地提供操作,因此您必须自己制作,最明显的答案是阅读整个文件并再次编写。这对您来说可能没问题,但会产生重要的成本,并且可能成为您应用程序性能的瓶颈。

追加是自然的选择但据我所知,这会使文件阅读不自然。

根据您的具体情况,有很多方法可以解决这个问题。

如果在您的应用程序中编写此文件不是时间关键且文件不会变得太大,您可以咬紧牙关并读取整个文件,添加信息并再次写入。 apache的common-io的FileUtils将帮助您简化操作,read the file as a list of strings,将新行添加到列表中write the list again

如果写作对时间至关重要,但可以控制读数或文件。也就是说,如果要由另一个程序读取该文件。您可以在行列表中加载文件并反转列表。来自common-io库的FileUtils和标准JDK中Collections类中的辅助函数应该可以很好地完成这个任务。

如果写入是时间关键但是文件是通过普通文本编辑器读取的,那么您可以创建一个小类或程序来读取该文件并将其写入具有首选顺序的另一个文件中。