• InputStream,InputStreamReader和Reader的关系


    InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流

    Reader:读取的是字符流

    InputStreamReader:从字节到字符的桥梁。InputStreamReader(InputStream.read("filename"));

    reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了。

    java.io.Reader 和 java.io.InputStream 组成了Java 输入类。

    Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。

    Reader支持16位的Unicode字符输出,

    InputStream支持8位的字符输出。

    Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,

    1byte = 8bits

    InputStream、OutputStream是用来处理8位元的流,

    Reader、Writer是用来处理16位元的流。

    而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。

    值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。

    在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:

    FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。

    相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。

    另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。

    相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。

     关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅 读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
      byte[] b = new byte[count];
      int readCount = 0; // 已经成功读取的字节的个数
      while (readCount < count) {
       readCount += in.read(bytes, readCount, count - readCount);
      }
          用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)

  • 相关阅读:
    李阳疯狂英语精选365句
    线程 notify,与notifyAll 的区别
    关于Logger,Tomcat 的Logger是如何工作的
    知豆 源
    关于好多继承的问题,我们应该如何去理解
    5+1+2
    wu xing
    ALBPM Time Question
    推荐书集
    “疯狂”的定义
  • 原文地址:https://www.cnblogs.com/jsStudyjj/p/5331811.html
Copyright © 2020-2023  润新知