我在使用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
。