在ByteBuffer中读取不同类型的文件

时间:2014-06-20 19:55:44

标签: 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文件也无法正确读取)。其他文件类型未正确读取。

打开文件时,文件类型特定的应用程序会显示这些错误 enter image description here

在读取* .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)

而且阅读过程也很慢。

以正确的速度正确读取所有类型文件的正确方法是什么。

P.S。无论你建议什么解决方案,将文件读入ByteBuffer都是必须的,也必须返回传输的字节数。

2 个答案:

答案 0 :(得分:1)

请阅读what you're trying to implement的功能签名。

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

如您所见,那里有sizeoffset个参数。该函数应该最多从文件中读取size个字节数,并且应该从文件的偏移量offset中读取它们。该功能不应该读取所​​有内容。 provided example filesystem显示了如何执行此操作。

答案 1 :(得分:0)

尝试使用FileChannel.map() http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map(java.nio.channels.FileChannel.MapMode,%20long,%20long) 这将创建一个ByteBuffer,它将直接IO映射到文件。它不会尝试一次性加载所有内容,但会根据需要为您提供数据。