2013-11-07 5 views
-1

Я делаю следующее: - создание пустого файла - блокировка файла - запись в файл - чтение назад содержаниене в состоянии прочитать файл с помощью java.nio.channels.FileChannel

public class TempClass { 
public static void main(String[] args) throws Exception{ 
    File file = new File("c:/newfile.txt"); 
    String content = "This is the text content123"; 

     if (!file.exists()) { 
      file.createNewFile(); 
     } 

     // get the content in bytes 
     byte[] contentInBytes = content.getBytes(); 

     FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel(); 

     FileLock lock = fileChannel.lock(); 

     //write to file 
     fileChannel.write(ByteBuffer.wrap (contentInBytes)); 

     //force any updates to this channel's file     
     fileChannel.force(false); 

     //reading back file contents 
     Double dFileSize = Math.floor(fileChannel.size()); 
     int fileSize = dFileSize.intValue(); 
     ByteBuffer readBuff = ByteBuffer.allocate(fileSize); 
     fileChannel.read(readBuff); 

     for (byte b : readBuff.array()) { 
      System.out.print((char)b); 
     } 
     lock.release(); 
     }  

} 

Однако Я вижу, что файл правильно написан с указанным мной контентом, но когда я его прочитал, он печатает квадратные символы для всех фактических символов в файле. Этот квадрат символ char эквивалент байта 0:

System.out.print((char)((byte)0)); 

Что здесь не так?

ответ

2

При чтении обратно файл, вы не сбросить положение, в котором FileChannel находится в настоящее время, таким образом, когда не выполняя

fileChannel.read(readBuff); 

Ничто не выделяется в буфер как FileChannel расположен в конце файл (в результате чего ваш код печати будет показывать значения, инициализированные 0).

Выполнение:

fileChannel.position(0); 

сбросить FileChannel в начале файла.

+0

yess great you just pin point, я должен 'fileChannel.position (0);' после 'fileChannel.write()' и перед 'fileChannel.read (readBuff);' – Mahesha999

+0

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

+0

Ну, просто используйте метод 'File.delete()' после того, как вы отпустите блокировку ... Я очень сомневаюсь, что какая-то программа получит блокировку между релизом блокировки и методом удаления, если они являются позициями сразу после друг друга. 'FileChannel' зарезервирован для выполнения ввода-вывода в файл, для его удаления используется сам объект« Файл ». – initramfs

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

  • Нет связанных вопросов^_^