问题描述
做了个测试如果用if(channel.read(buffer)!=-1)只读取一次速度很快可以4,5M的流在188ms左右(但是由于不确定是否结束,所以不能从根本上解决问题),但如果用while(channel.read(buffer)!=-1),在最后一次时速度很慢基本在15秒左右,网上看了好多资料试了都不行,高手请帮忙,谢谢。注:如果使用HttpsURLConnection方式循环的话,速度感觉慢在2秒以上。privatevoidsendPostNew(Stringhost,intport,Stringpath,Stringparams,StringcharSet){try{SocketChannelchannel=null;//=================================================StringBuffersb=newStringBuffer("POST"+path+"HTTP/1.1rn");sb.append("Host:"+host+"rn");sb.append("Content-Length:"+params.length()+"rn");sb.append("Content-Type:application/x-www-form-urlencodedrn");sb.append("rn");sb.append(params);sb.append("rn");Charsetcharset=Charset.forName(charSet);//InetSocketAddresssocketAddress=newInetSocketAddress(host,port);//step1:打开连接channel=SocketChannel.open(socketAddress);//channel.configureBlocking(false);//step2:发送请求,使用GBK编码channel.write(charset.encode(sb.toString()));//step3:读取数据ByteBufferbuffer=ByteBuffer.allocateDirect((1024*1024*100));StringBuilderstringBuilder=newStringBuilder((1024));while(channel.read(buffer)!=-1){buffer.flip();//flip方法在读缓冲区字节操作之前调用.CharBuffercharBuffer=charset.decode(buffer);//System.out.println(charBuffer);stringBuilder.append(charBuffer);System.out.println(stringBuilder);//使用Charset.decode方法将字节转换为字符串buffer.clear();//清空缓冲}channel.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocklogger.error(e.toString());e.printStackTrace();}}
解决方案
解决方案二:
这咱问题不会只有我遇到了吧。。。在线等待。