繁体   English   中英

RandomAccessFile和读/写开始完成位置

[英]RandomAccessFile and read/write start-finish position

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

问题是...

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

  • A)用RandomAccessFile读取它(以避免OutOfMemory错误)
  • B)读取4Mb片段(缓冲区)
  • C)将每个4Mb片段写入文件B.dat
  • D)因此,将文件B.dat复制为文件A.dat

但是我有一个问题...如果我有一个文件长度不能由4Mb划分,则数据会丢失并且文件会损坏:(

例如...我有媒体文件。 它的长度是15.8Mb,所以我只能得到15.8Mb / 4Mb = 3整块。 然后我只能写那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)的结果,找出实际读入缓冲区的数据量RandomAccessFile.read(byte[], int, int)并使用该数字来限制写回输出文件的量。

编辑

上面有一些解释。 以下是关键部分:

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

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

    for ( int len = 0; 

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

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

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

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

然后,对于已读取的每个块,将其写入输出流。 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
}

看到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM