Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将文件的一部分复制到字节数组_Java - Fatal编程技术网

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

在Java中将文件的一部分复制到字节数组,java,Java,有没有办法读取要导入到字节数组中的部分文件 我想知道怎么做,因为我只能找到将整个文件转换为字节数组的方法,这是一个非常消耗内存的操作。我会使用随机访问文件: public static byte[] readFileSegment(File file, long index, int count) { RandomAccessFile raf = new RandomAccessFile(file, "r"); byte[] buffer = new byte[count];

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


我想知道怎么做,因为我只能找到将整个文件转换为字节数组的方法,这是一个非常消耗内存的操作。

我会使用
随机访问文件

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等还有其他选择,但这应该很简单。

我会使用
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等还有其他选择,但这应该很简单。

您可以使用RandomAccessFile或带有skip的FileInputStream


我最喜欢使用内存映射文件,因为它只将您使用的内容加载到内存中,几乎不使用堆(无论您使用了多少)

您可以使用RandomAccessFile或带有skip的FileInputStream


我最喜欢的是使用内存映射文件,因为它只将您使用的内容加载到内存中,几乎不使用堆(无论您使用了多少堆)

当然-您执行的步骤与将整个文件读取到字节数组的步骤大致相同,只是您丢弃了所需文件的一部分,而不是将其添加到数组中

这就提出了一个非常相关的问题,即如何检测所需截面的边界。如果它类似于一个特定的哨兵字节(例如
11111111
),那么这就非常简单。如果您想要一些固定的偏移量,就更容易了,只需丢弃前n个字节,然后存储下面的m个字节

然而,如果您检测到某种字节序列,那么事情就变得更复杂了,因为您必须维护到目前为止匹配的部分的局部变量,如果它与整个序列不匹配,则丢弃它,或者如果整个序列匹配,则将其全部添加到输出中


不过,在一天结束时,这个概念很简单——像加载所有文件时那样从文件中读取字节,但只有当它们是您想要的部分时,才将它们实际放入输出数组。

当然——您执行的步骤与将整个文件读取到字节数组大致相同,除了丢弃所需的文件部分,而不是将它们添加到数组中

这就提出了一个非常相关的问题,即如何检测所需截面的边界。如果它类似于一个特定的哨兵字节(例如
11111111
),那么这就非常简单。如果您想要一些固定的偏移量,就更容易了,只需丢弃前n个字节,然后存储下面的m个字节

然而,如果您检测到某种字节序列,那么事情就变得更复杂了,因为您必须维护到目前为止匹配的部分的局部变量,如果它与整个序列不匹配,则丢弃它,或者如果整个序列匹配,则将其全部添加到输出中


不过,在一天结束时,这个概念很简单——像加载所有文件时那样从文件中读取字节,但只有当它们是您想要的部分时,才将它们实际放入输出数组。

这实际上对我起到了作用,我需要将文件的开头部分设置为特定的字节大小:

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

这实际上对我很有用,因为我需要将文件的开头部分设置为某个字节大小:

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

缺少第二个参数:RandomAccessFile raf=new RandomAccessFile(文件,“r”);您还应该支持long而不是int。这是我的版本:@StefanReich:两个都修好了,谢谢。(我保留了第三个参数
count
而不是提供一个
long
端点。)您缺少第二个参数:RandomAccessFile raf=new RandomAccessFile(文件,“r”);您还应该支持long而不是int。这是我的版本:@StefanReich:两个都修好了,谢谢。(我保留了第三个参数
count
,而不是提供一个
long
端点。)