Как мне написать / прочитать начало текстового файла? - PullRequest
3 голосов
/ 18 октября 2011

EDIT Это мой файл-ридер, могу ли я сделать так, чтобы он читал снизу вверх, видя, как трудно заставить его писать снизу вверх.

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

ИЛИ (старый вопрос)

Как сделать так, чтобы следующая строка помещалась в начало файла, а затем вставлялась новая строка (чтобы сдвинуть другие строки вниз)?

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

Ответы [ 4 ]

6 голосов
/ 18 октября 2011

Кто-то может исправить меня, но я почти уверен, что в большинстве операционных систем нет другого выбора, кроме как прочитать весь файл, а затем записать его обратно.

Полагаю, основная причина в том, чтов большинстве современных ОС все файлы на диске начинаются с начала границы.Проблема в том, что вы не можете указать таблице размещения файлов, что ваш файл запускается раньше, чем эта точка.

Поэтому все последующие байты в файле должны быть переписаны.Я не знаю ни одной подпрограммы ОС, которая делает это за один шаг.

Итак, я бы использовал BufferedReader, чтобы сохранить весь файл в Vector или StringBuffer, а затем записать все обратносначала с предварительно добавленной строкой.

-

Редактировать

Способ экономии памяти для больших файлов при чтении предложения @ 1016 * Saury будет:

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" 

вуаля

0 голосов
/ 18 октября 2011

Как было предложено здесь, предварительное ожидание файла довольно сложно и действительно связано с тем, как файлы хранятся на жестком диске. Операция, естественно, недоступна из ОС, поэтому вам придется сделать ее самостоятельно, и наиболее очевидные ответы на нее включают чтение всего файла и запись его снова. это может быть хорошо для вас, но повлечет за собой важные расходы и может стать узким местом для производительности вашего приложения.

Добавление будет естественным выбором, но, насколько я понимаю, чтение файла будет неестественным.

Есть много способов справиться с этим в зависимости от специфики вашей ситуации.

Если запись этого файла не является критичной по времени в вашем приложении, и файл не становится слишком большим, вы можете укусить пулю и прочитать весь файл, добавить информацию и записать ее снова. FileUtils common-io от apache поможет вам упростить операцию, в которой вы можете прочитать файл как список строк , добавить новые строки в список и напишите список снова .

Если запись критична по времени, но вы можете контролировать чтение или файл. То есть, если файл должен быть прочитан другой из ваших программ. Вы можете загрузить файл в список строк и перевернуть список. И снова FileUtils из библиотеки common-io и вспомогательные функции в классе Collections в стандартном JDK должны хорошо справиться с задачей.

Если запись критична по времени, но файл предназначен для чтения в обычном текстовом редакторе, вы можете создать небольшой класс или программу, которая будет читать файл и записывать его в другой файл в предпочтительном порядке.

0 голосов
/ 18 октября 2011

Используйте FileUtils из Apache Common IO, чтобы упростить это, если можете. Тем не менее, он все еще должен прочитать весь файл, поэтому он будет медленным для больших файлов.

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

FileUtils также имеет методы чтения / записи, которые заботятся о кодировании.

0 голосов
/ 18 октября 2011

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...