2016-10-02 2 views
-1

У меня возникли трудности с пониманием прочитанной записи с помощью MappedByteBuffer. Вот класс, который у меня есть, который читает содержимое локального файла и допускает изменение его содержимого. Я использую java версию 8.MappedByteBuffer запись в файл не работает

public class MappedByteBufferExample { 
public static void main(String[] args) { 
    try (RandomAccessFile file = new RandomAccessFile("resources\\MappedByteBufferExample.txt", "rw"); 
      FileChannel fileChannel = file.getChannel();) { 
     long size = fileChannel.size(); 
     MappedByteBuffer mappedBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size); 

     System.out.println("Text from File : -----"); 
     while (mappedBuffer.remaining() > 0) { 
      System.out.print((char) mappedBuffer.get()); 
     } 
     System.out.println("\n"); 

     for (int index = 0; index < (mappedBuffer.limit()/2); index++) { 
      byte b1 = mappedBuffer.get(index); 
      byte b2 = mappedBuffer.get(mappedBuffer.limit() - index - 1); 
      mappedBuffer.put(index, b2); 
      mappedBuffer.put(mappedBuffer.limit() - index - 1, b1); 
     } 
     //mappedBuffer.force(); I tried with this but no change in result. 
     //mappedBuffer.load(); I tried with this but no change in result. 
     mappedBuffer.load(); 
     mappedBuffer.flip(); 
     System.out.println("Text Reversed : -----"); 
     while (mappedBuffer.remaining() > 0) { 
      System.out.print((char) mappedBuffer.get()); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}} 

Содержимое файла - Розы красные!
Исполняя этот вывод файла в консоли:

Текст из файла: -----

Розы красные!

Текст Перевернутый: -----

DER эпоха sesoR

Но содержимое файла не изменяется. На выполнении этой программы на второй раз, выход на консоль:

Текст из файла: -----

DER эпоха sesoR

Текст Перевернутый: -----

Розы красные!

Содержимое файла по-прежнему не изменилось. Я пробовал методы load() и force() по одному и оба, но без изменений в результате Вот мои вопросы:

1) Почему содержимое локального файла не изменяется?

2) Какие изменения необходимо выполнить этой программе для записи данных в файл?

3) Почему/Как MappedByteBuffer считывает обратный текст на второй итерации, хотя содержимое файла не отменено?

+0

Нагрузка и флип не нужны. 'flip' просто необходим для println, поскольку он сбрасывает позицию чтения. Однако только при закрытии текст записывается обратно (в данном случае). «\ r \ n» станет «\ n \ r». –

+0

Вы не представили никаких доказательств того, что файл не изменен, и основные доказательства того, что это так. – EJP

ответ

2

Содержимое файла изменено. Обычные редакторы (например, блокнот ++ или eclipse) не замечают изменения, потому что файл datetime не изменяется с помощью RandomAccessFile. Но если вы действительно перезагрузите файл вручную после запуска, вы должны увидеть изменения.

+0

Спасибо @Heri. Я был обманут Notepad ++. Он не перезагружал контент. Ваш комментарий спас мое время. – JohnySam

0

Поскольку вы актуальная проблема была решена, некоторые замечания:

  • Поскольку Java 1.7, вы не нуждаются в RandomAccessFile объезд, чтобы открыть FileChannel
  • The Charset API позволяет преобразовывать ByteBufferправильно (литье byte до char подходит только для подмножества, напримертекущая кодовая страница Windows) и без необходимости итерации по байтам вручную
  • Цикл обменивать можно записать прямолинейно с помощью двух индексов, а не перерасчета второй индекс (и конечный индекс Петля в) в каждой итерации

Соединяя эти точки вместе, упрощенный вариант выглядит следующим образом:

try(FileChannel fileChannel = FileChannel.open(
     Paths.get("resources\\MappedByteBufferExample.txt"), 
     StandardOpenOption.READ, StandardOpenOption.WRITE)) { 
    long size = fileChannel.size(); 
    MappedByteBuffer mappedBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size); 

    System.out.println("Text from File : -----"); 
    System.out.append(Charset.defaultCharset().decode(mappedBuffer)).println("\n"); 

    for(int index1 = 0, index2=(int)size-1; index1<index2; index1++, index2--) { 
     byte b1 = mappedBuffer.get(index1), b2 = mappedBuffer.get(index2); 
     mappedBuffer.put(index1, b2).put(index2, b1); 
    } 
    mappedBuffer.force(); 
    mappedBuffer.flip(); 
    System.out.println("Text Reversed : -----"); 
    System.out.append(Charset.defaultCharset().decode(mappedBuffer)).println("\n"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Имейте в виду, что цикл чтения всегда будет показывать измененное состояние, независимо от того, была ли она записывается в файл. Таким образом, независимо от того, помещается ли force() перед циклом считывания или в конце блока, это не имеет значения.

+0

Спасибо, что поделились своими полезными замечаниями, Хольгер. – JohnySam

Смежные вопросы