zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/edwardru/p/5933490.html
Copyright © 2011-2022 走看看