看了方法都是一个字节一个字节去读取,如果我需要读取指定长度的数据,有没有办法通过缓存的方法来一起读取呢?不想用NIO,据说NIO挺麻烦。如果我要读一个比较大的文件的内容,一个字节一个字节的来读感觉效率很低,有没有别的API好用?能提供缓存机制的。有这方面经验的请说说自己的处理方法。

解决方案 »

  1.   

    可以参考已有的框架Netty - the Java NIO Client Server Socket Framework:http://www.jboss.org/netty
      

  2.   

    那你用 BufferedInputStream 包装一下呗。网络传输本身就是一个字节一个字节读取的,不存在效率低的问题。
      

  3.   

    不知道你是哪个版本JDK。
    我用1.5的。Socket.getInputStream 得到的对象是个 SocketInputStream 实例。
    而 SocketInputStream 的read(byte[])方法,是一个native方法,是一次性读出的,不是一个字节一个字节读的。如果不放心的话,又担心NIO麻烦,那么你可以使用NIO的类,但是不使用NIO的框架。
    简单说,NIO的socketChannel,同时也支持阻塞式的读写,(而且默认就是阻塞的,要使用非阻塞方式,还必须显示设置),所以你可以用NIO socketChannel的 read(ByteBuffer)方式来一次读入批量数据。
      

  4.   

    1.5有这个SocketInputStream 实例吗?也就是通过socket得到getChannel() 然后通过这个来获取吗?这样效率最高?
      

  5.   

    jdk会设计2个性能迥异的类实现相同功能么?况且io包就是装饰模式。
      

  6.   

    需要读取指定长度的数据可以用readFully(byte[] b);
      

  7.   


    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("出错了");
    }
    }
    }这样是不是会好点?