在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
端点。)