将文件的一部分复制到Java中的字节数组

时间:2012-03-12 15:53:11

标签: java

有没有办法读取要导入字节数组的文件的一部分?

我想知道如何,因为我只能找到将整个文件转换为字节数组的方法,这是一个非常繁重的内存饥饿操作。

4 个答案:

答案 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();
}