在我的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)
而且阅读过程也很慢。
以正确的速度正确读取所有类型文件的正确方法是什么。
P.S。无论你建议什么解决方案,将文件读入ByteBuffer都是必须的,也必须返回传输的字节数。
答案 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)
如您所见,那里有size
和offset
个参数。该函数应该最多从文件中读取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映射到文件。它不会尝试一次性加载所有内容,但会根据需要为您提供数据。