看了方法都是一个字节一个字节去读取,如果我需要读取指定长度的数据,有没有办法通过缓存的方法来一起读取呢?不想用NIO,据说NIO挺麻烦。如果我要读一个比较大的文件的内容,一个字节一个字节的来读感觉效率很低,有没有别的API好用?能提供缓存机制的。有这方面经验的请说说自己的处理方法。<
看了方法都是一个字节一个字节去读取,如果我需要读取指定长度的数据,有没有办法通过缓存的方法来一起读取呢?不想用NIO,据说NIO挺麻烦。如果我要读一个比较大的文件的内容,一个字节一个字节的来读感觉效率很低,有没有别的API好用?能提供缓存机制的。有这方面经验的请说说自己的处理方法。<
可以参考已有的框架Netty - the Java NIO Client Server Socket Framework:http://www.jboss.org/netty
建议你去看看API
顶,
这方面的资料也想知道。
那你用 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("出错了");
}
}
}