写入DataOutputStream并使用缓冲区从RandomAccessFile读取时遇到问题

时间:2013-02-05 19:23:15

标签: java file-io buffer dataoutputstream

    DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());

    int bytesRead = 0;
    int offset = 0;
    byte[] bytes = new byte[1048576]; // read 1MB at a time
    RandomAccessFile f = new RandomAccessFile(xmlFile, "rw");
    while(bytesRead != -1){
        offset += f.read(bytes, offset, bytes.length);
        if (bytesRead != -1){
             lWriter.write(bytes, 0, bytes.length);
        }
}

使用此代码,我在f.read()处获得了一个超出范围的索引异常。我可能错误地使用了偏移和长度的参数。不是每次我读入一个块,我应该移动块的大小的偏移?也许我只需要在较少的时间阅读并使用较小的缓冲区?

目前我有这个实现工作,但我担心内存使用:

DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());      
lWriter.write(fileToBytes(xmlFile));

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在Java中复制流的规范方法如下:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
    // bytesRead += count; // if you are counting
}

您的循环包含许多错误。偏移量是缓冲区的偏移量,而不是文件的偏移量,您根本不必使用它。您不必提前抵消。您正在测试bytesRead但从未在初始化后设置它。在推进计数之前,您没有检查EOS。您在写作时没有使用读取计数,因此您正在将垃圾写入文件。