我在使用InputStreams时遇到一个现有问题,我想提高从该通道读取的性能。因此,我用ReadableByteChannel阅读。

结果,使用以下代码可以更快地读取内容:

public static String readAll(InputStream is, String charset, int size) throws IOException{

    try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
        java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocate(size);

        try(ReadableByteChannel channel = Channels.newChannel(is)){

            int bytesRead = 0;

            do{
                bytesRead = channel.read(buffer);
                bos.write(buffer.array(), 0, bytesRead);
                buffer.clear();
            }
            while(bytesRead >= size);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        String ans = bos.toString(charset);
        return ans;
    }
}


问题是:它不会每次读到最后!如果我尝试读取文件,则效果很好。如果我从网络套接字读取(例如,手动请求WebPage),它有时会在两者之间停止。

我该怎么做才能读到最后?

我不想使用这样的东西:

StringBuilder result = new StringBuilder();
while(true){
    int ans = is.read();
    if(ans == -1) break;
    result.append((char)ans);
}
return result.toString();


因为此实施速度很慢。

我希望你能帮助我解决我的问题。也许我的代码有一些错误。

最佳答案

您的复制循环是完全错误的。没有理由为什么bytesRead应该永远是>= size,并且在流结束时行为不当。应该是这样的:

while ((bytesRead = channel.read(buffer)) > 0)
{
    bos.write(buffer.array(), 0, bytesRead);
    buffer.clear();
}


通过适当的调整将传输限制为size个字节,这是不平凡的。

但是,除非直接终止,否则直接使用InputStream在现有的InputStream上进行所有分层都不可能“快得多”。除非您使用InputStream的想法是您发布的内容,否则这会非常缓慢。尝试使用'BufferedInputStream

08-16 16:32