socket编程中InputStream提供的方法效率会不会太低? 看了方法都是一个字节一个字节去读取,如果我需要读取指定长度的数据,有没有办法通过缓存的方法来一起读取呢?不想用NIO,据说NIO挺麻烦。如果我要读一个比较大的文件的内容,一个字节一个字节的来读感觉效率很低,有没有别的API好用?能提供缓存机制的。有这方面经验的请说说自己的处理方法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以参考已有的框架Netty - the Java NIO Client Server Socket Framework:http://www.jboss.org/netty 那你用 BufferedInputStream 包装一下呗。网络传输本身就是一个字节一个字节读取的,不存在效率低的问题。 不知道你是哪个版本JDK。我用1.5的。Socket.getInputStream 得到的对象是个 SocketInputStream 实例。而 SocketInputStream 的read(byte[])方法,是一个native方法,是一次性读出的,不是一个字节一个字节读的。如果不放心的话,又担心NIO麻烦,那么你可以使用NIO的类,但是不使用NIO的框架。简单说,NIO的socketChannel,同时也支持阻塞式的读写,(而且默认就是阻塞的,要使用非阻塞方式,还必须显示设置),所以你可以用NIO socketChannel的 read(ByteBuffer)方式来一次读入批量数据。 1.5有这个SocketInputStream 实例吗?也就是通过socket得到getChannel() 然后通过这个来获取吗?这样效率最高? jdk会设计2个性能迥异的类实现相同功能么?况且io包就是装饰模式。 需要读取指定长度的数据可以用readFully(byte[] b); import java.io.*;public class Text { public static void main(String[] args) { try{ ByteArrayOutputStream b=new ByteArrayOutputStream(); DataOutputStream b1=new DataOutputStream(b); b1.writeDouble(Math.random()); b1.writeBoolean(true); ByteArrayInputStream b2=new ByteArrayInputStream(b.toByteArray()); DataInputStream b3=new DataInputStream(b2); System.out.println(b3.available()); System.out.println(b3.readDouble()); System.out.println(b3.readBoolean()); b1.close(); b3.close(); } catch(IOException ae) { System.out.println("出错了"); } }}这样是不是会好点? 怪事!大家进来讨论 我有一段 java程序需要完善 需要一个函数 关于MVC模式和多层体系结构 Java中的堆和栈有什么区别? 问一个关于Runtime.getRuntime().exec()的问题 请教一个问题,给分!! 2004年微软停止对其提供支持? 欢迎讨论! 请问,如何通过Java调用ActiveX控件? import javax.swing.JOptionPane;报错 关于ArrayList的 E remove(int index) 和boolean remove(Object o)方法 长度不确定时为什么要用stringbuffer类
我用1.5的。Socket.getInputStream 得到的对象是个 SocketInputStream 实例。
而 SocketInputStream 的read(byte[])方法,是一个native方法,是一次性读出的,不是一个字节一个字节读的。如果不放心的话,又担心NIO麻烦,那么你可以使用NIO的类,但是不使用NIO的框架。
简单说,NIO的socketChannel,同时也支持阻塞式的读写,(而且默认就是阻塞的,要使用非阻塞方式,还必须显示设置),所以你可以用NIO socketChannel的 read(ByteBuffer)方式来一次读入批量数据。
import java.io.*;
public class Text {
public static void main(String[] args) {
try{
ByteArrayOutputStream b=new ByteArrayOutputStream();
DataOutputStream b1=new DataOutputStream(b);
b1.writeDouble(Math.random());
b1.writeBoolean(true);
ByteArrayInputStream b2=new ByteArrayInputStream(b.toByteArray());
DataInputStream b3=new DataInputStream(b2);
System.out.println(b3.available());
System.out.println(b3.readDouble());
System.out.println(b3.readBoolean());
b1.close();
b3.close();
} catch(IOException ae) {
System.out.println("出错了");
}
}
}这样是不是会好点?