gpt4 book ai didi

java - RandomAccessFile 和读/写起止位置

转载 作者:行者123 更新时间:2023-12-01 15:54:51 25 4
gpt4 key购买 nike

我已经搜索了很多,但仍然找不到......所以我希望你能帮助我理解:)

问题是...

我有一个大文件 A.dat,我想要

  • A) 使用 RandomAccessFile 读取它(以避免内存不足错误)
  • B) 以 4Mb(缓冲区)为单位读取
  • C) 将每个 4Mb 的片段写入文件B.dat
  • D) 所以要制作文件 B.dat 作为以下副本文件A.dat

但是我有一个问题...如果我有一个长度不能被 4Mb 除尽的文件,数据就会丢失并且文件会损坏:(

例如...我有媒体文件。它的长度是15.8Mb,所以我只能得到15.8Mb/4Mb=3整 block 。然后我只能写那 3 个字节的片段,其余的就会丢失:(或者问题是文件是否小于缓冲区大小 (4Mb)...

我认为这不应该是一项艰巨的任务,但我看不到任何标准教程来展示如何解决此类问题......

我非常希望您能帮我解决这个问题。

最佳答案

RandomAccessFile 在这种情况下似乎没有用。使用传统的基于流的 I/O 是最好的,并且肯定不会导致内存不足错误,除非您做错了。这实际上是您需要的所有代码(未经测试):

InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream("a.dat");
out = new FileInputStream("b.dat");
byte[] buffer = new byte[4*1024*1042]; //4 MiB
for ( int len = 0; (len = in.read(buffer)) != -1; ) {
out.write(buffer, 0, len);
}
} finally {
if ( in != null )
try { in.close() } catch (IOException ignore) {}
if ( out != null )
try { out.close() } catch (IOException ignore) {}
}

如果您由于某种无法告诉我们的原因确实需要 RandomAccessFile,则方法本质上是相同的。使用 RandomAccessFile.read(byte[], int, int) 的结果找出实际读入缓冲区的数据量,并使用该数字来限制写回输出文件的数据量。

编辑

以上内容需要一些解释。以下是关键部分:

    byte[] buffer = new byte[4*1024*1042]; //4 MiB

这将初始化一个 4 二进制兆字节的字节数组,该数组一次保存文件的一个 block 。

    for ( int len = 0; 

在 for 循环中,我们首先声明一个值 len,该值将记录我们读入的字节数。

(len = in.read(buffer)) != -1; 

然后我们在InputStream上调用read。这会将字节读入字节数组,直到缓冲区已满,或者没有更多数据可供读取(到达文件末尾)。该方法返回实际读取的字节数并分配给len。如果该值为 -1,则意味着流已关闭,因此我们退出循环。

) {
out.write(buffer, 0, len);
}

然后,对于我们读取的每个 block ,我们将其写入输出流。 buffer 表示我们要从字节数组写入,0 表示我们要从数组的开头开始,len 表示要写入多少字节。请记住,如果我们的缓冲区未填充,则 len 将被相应设置,并且只会写入数组的一部分。

我给了你惯用的版本,它可能更难理解。这是做同样事情的更直接的方法:

int numberOfBytesRead;
while ( true ) {
numberOfBytesRead = in.read(buffer); //read bytes into buffer
if ( numberOfBytesRead == -1 ) break; //end of stream
out.write(buffer, 0, numberOfBytesRead); //write the same # of bytes we read
}

参见

关于java - RandomAccessFile 和读/写起止位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5280902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com