阅读时损坏的文件文本

时间:2015-02-19 00:59:13

标签: java io buffer inputstream

我有以下代码:

BlobDomain blobDomain = null;
OutputStream out = null;
try {
    blobDomain = new BlobDomain();
    out = blobDomain.getBinaryOutputStream();
    byte[] buffer = new byte[8192];
    int bytesRead = 0;
    while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
        out.write(buffer, 0, bytesRead);
        String line = (new String(buffer));
        fullText += line;
    }

} catch (Exception e) {
    //do nothing
}finally{            
    if (out != null)
        try {
            out.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
}

当我打印fullText时,我看到的较大文件是文本的末尾部分再次添加到fullText。所以全文最后会重复一些。关于这里有什么问题的任何建议?

1 个答案:

答案 0 :(得分:1)

你得到这个的原因是你每次都在写你的字符串整个缓冲区。因此,当您到达文件末尾时,您可能没有准确读取缓冲区大小的字节数。旧数据仍在缓冲区中,也将写入String。

解决此问题的一个选择可能是首先将数据写入String,然后将String写入输出流。这也应该比每次读取后添加到String更快。

将inputStream保存到String:

java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A");
fullText = s.hasNext() ? s.next() : "";

将字符串写入输出流:

out.write(fullText.getBytes());

如果您希望按原样保留代码,则在缓冲区上执行子字符串并仅检索读取的字节数。例如:

String line = (new String(buffer.substring(0,bytesRead));