繁体   English   中英

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

[英]Having an issue writing to DataOutputStream and reading from RandomAccessFile with a buffer

    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()处获得了索引超出范围的异常。 我可能错误地滥用了参数offset和length。 每次读取块时,是否都应该将偏移量移动到块的大小吗? 也许我只需要读更少的时间并使用较小的缓冲区?

目前,我可以执行此实现,但是我担心内存使用情况:

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

谢谢你的帮助!

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

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

您的循环包含许多错误。 偏移量是缓冲区的偏移量,而不是文件的偏移量,您几乎不需要使用它。 您不必提前偏移。 您正在测试bytesRead,但在初始化后再也不会对其进行设置。 在增加计数之前,您无需检查EOS。 写入时未使用读取计数,因此会将垃圾写入文件中。

暂无
暂无

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

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