[英]RandomAccessFile and read/write start-finish position
我已经搜索了很多,但仍然找不到...所以希望您能帮助我理解:)
问题是...
我有大文件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.