Чтение файлов разных типов в ByteBuffer

#java #file-io

#java #file-io

Вопрос:

В моем приложении Java (файловая система fuse) Мне нужно прочитать все типы файлов в ByteBuffer. Я сделал это, как показано ниже:

 public int read(final String path, final ByteBuffer buffer, final long size, final long offset, final FileInfoWrapper info)
    {

    Path p = Paths.get(path);
    try {
        byte[] data = Files.readAllBytes(p);
        buffer.put(ByteBuffer.wrap(data));
        return data.length;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  

но только файлы с расширениями * .txt читаются правильно (я думаю, что это из-за меньшего размера, большие файлы * .txt также не читаются правильно). Остальные типы файлов неправильно считываются.

Эти ошибки отображаются приложениями, зависящими от типа файла, при открытии файлов введите описание изображения здесь

Он выдает эти ошибки при чтении файлов, отличных от *.txt

 SEVERE: Exception thrown: java.nio.BufferOverflowException
java.nio.DirectByteBuffer.put(DirectByteBuffer.java:357)
java.nio.DirectByteBuffer.put(DirectByteBuffer.java:336)
org.organization.upesh.FirstMaven.SFS_360.read(SFS_360.java:132)
net.fusejna.LoggedFuseFilesystem$27.invoke(LoggedFuseFilesystem.java:437)
net.fusejna.LoggedFuseFilesystem$27.invoke(LoggedFuseFilesystem.java:433)
net.fusejna.LoggedFuseFilesystem.log(LoggedFuseFilesystem.java:355)
net.fusejna.LoggedFuseFilesystem.read(LoggedFuseFilesystem.java:432)
net.fusejna.FuseFilesystem._read(FuseFilesystem.java:234)
net.fusejna.StructFuseOperations$23.callback(StructFuseOperations.java:260)
sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:455)
com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:485)
  

А также процесс чтения происходит очень медленно.

Каков правильный способ правильного чтения всех типов файлов с хорошей скоростью.

PS какое бы решение вы ни предложили, чтение файла в ByteBuffer является обязательным, а также должно возвращать количество переданных байтов.

Комментарии:

1. Что вы имеете в виду под «неправильно прочитанным»? Как вы узнаете, прочитан ли файл «правильно» или нет? Все файлы — это просто наборы байтов, в текстовых файлах нет ничего особенного.

2. @Jesper . Мое приложение — это файловая система. Я отредактировал свой вопрос и добавил изображение ошибок, которые появляются у каждого приложения типа файла при открытии файла

3. Ну, это ваша проблема.. SEVERE: Exception thrown: java.nio.BufferOverflowException Вашего входного буфера недостаточно для размещения ваших данных. Попробуйте прочитать большой файл .txt того же размера, что и другие файлы, вы получите то же самое.

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

5. Как вы вызываете read метод? Что вы предоставляете в качестве buffer аргумента?

Ответ №1:

Пожалуйста, ознакомьтесь с сигнатурой функции того, что вы пытаетесь реализовать.

 public int read(final String path, final ByteBuffer buffer, final long size, final long offset, final FileInfoWrapper info)
  

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

Ответ №2:

Попробуйте использовать FileChannel.map() http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map (java.nio.каналы.FileChannel.MapMode, long, long)Это создает ByteBuffer, который отображается с помощью прямого ввода-вывода в файл. Он не будет пытаться загрузить все за один раз, но предоставит вам данные по мере необходимости.

Комментарии:

1. Не могли бы вы изменить мой код, чтобы сделать то же самое с помощью FileChannel.map()