有没有办法读取要导入字节数组的文件的一部分?
我想知道如何,因为我只能找到将整个文件转换为字节数组的方法,这是一个非常繁重的内存饥饿操作。
答案 0 :(得分:5)
我使用RandomAccessFile
:
public static byte[] readFileSegment(File file, long index, int count) {
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] buffer = new byte[count];
try {
raf.seek(index);
raf.readFully(buffer, 0, count);
return buffer;
} finally {
raf.close();
}
}
还有其他替代方案可以使用内存映射文件,NIO等 - 但这应该很简单。
答案 1 :(得分:1)
您可以使用RandomAccessFile或带跳过的FileInputStream。
我最喜欢的是使用内存映射文件,因为它只会将你使用的内容加载到内存中,并且几乎不使用任何堆(无论你使用多少)
答案 2 :(得分:0)
当然 - 您执行的步骤与将整个文件读取到字节数组的步骤大致相同,只是您丢弃了所需文件的一部分,而不是将它们添加到数组中。
这就提出了一个非常相关的问题,即如何检测所需部分的边界。如果它类似于特定的标记字节(例如11111111
),那么这很简单。如果你想要一些固定的偏移,只需丢弃第一个 n 字节,然后存储以下 m 字节,这就更容易了。
但是,如果您正在检测某种字节序列,那么事情就会更加复杂,因为您必须维护到目前为止匹配的部分的局部变量,如果它与之匹配,则丢弃它如果整个序列匹配,则将整个序列或全部添加到输出中。
在一天结束时,概念很简单 - 从文件中读取字节就像加载所有文件一样,但实际上只有在它们是你想要的部分时才将它们放在输出数组中
答案 3 :(得分:0)
这实际上对我有用,我需要将文件的开头部分放到某个字节大小:
try
{
int myDesiredCapacity = 100000; // 100KB
FileInputStream is = new FileInputStream(otherFile);
FileChannel fileChannel = is.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(myDesiredCapacity);
byte[] bytes;
int byteCount = fileChannel.read(bb);
if(byteCount >= 0)
{
bb.flip();
bytes = bb.array();
FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
fileOutputStream.write(bytes);
fileOutputStream.close();
bb.clear();
}
}
catch(IOException e)
{
e.printStackTrace();
}