Java-IO

System.out 是PrintStream 简单修饰FilterOutputStream(好用API) 或者是实现了FilterOutputStream接口 System.in 是 InputStream接口下的FileInputStream

  • 二进制流, 使用byte[]
    • InputStream => File/Filter/ByteArray/PushbackInputStream => DataInputStream
      • BfuferedInputStream 修饰缓冲read()
      • 字符集参数
    • OutputStream => File/Filter/ByteArrayOutputStream => DataOutputStream, PrintStream
      • BufferedOutputStream 修饰缓冲write()
      • autoflush flag, append flag
      • 字符集参数
  • By fileName
  • 接口InputStream, OutputStream
  • 媒体类File{Input, Output}Stream, Piped{Input, Output}Stream, Sequence{Input, Output不适用}Stream, ByteArray{Input, Output}Stream, Filter{Input, Output}Stream

ByteArray*Stream 意味着内存(b[], offset, count, toByteArray()), File*Stream意味着磁盘(fileName) SequenceInputStream 意味着(i1, i2)或Enumeration ? extends InputStream Fielter*Stream 是接口

  • 实现Fileter\*Stream接口增强
    • 增强能力Buffered\*Stream
    • FilterOutputStream
      • 好用APIPrintStream
      • 算数, 字符串DataOutputStream
    • FilterInputStream
      • 算数, 字符串DataInputStream
      • skip, while(read())配合使用LineNumberInputStream
      • 允许unread3(b/b[]/b[], o, c)PushBackInputStream
  • 文本流, 字符流, 使用 char[]
    • Reader => File/PipeReader
    • Writer => File/PipeWriter => PrintWriter(好用API)
      • autoflush flag, append flag
    • 常用输入
      • BufferedReader => o.readLine(), o.read()
  • By fileName

  • 接口Reader, Writer
  • 媒介类FileReader, PipedReader, CharArrayReader, StringReader需要文件, 管道, String, char[]作构造参数, 而后低级read3操作
  • 媒介类FileWriter, PipedWriter, CharArrayWriter, StringWriter需要文件, 管道, 构造, 但内部生成String, char[]需要调用方法返回值使用输出结果.

    意味着同二进制流

  • 过滤器接口(FilterReader, FilterWriter)实现增强
    • 增强BufferedReader => readLine()
    • 增强BufferedWriter => write(c/str, o, c/c[], o, c)
    • FilterReader
      • skip, while(read())配合使用LineNumberReader
      • 允许unread3(c[])PushBackReader
    • FilterWriter
      • 好用APIPrintWriter
  • 关联
    • InputStreamReader(char set)
    • OutputStreamWriter(char set)
  • Scanner
    • By InputStream
    • By Reader
    • By File
  • 关于字符集问题
  • 凡是有二进制流构造String(byte[], c, o), 构造文本流/字符流媒介类或转换类, 一定需要字符集信息, 默认取自JVM/OS/Platfoem, 遗憾的是, 文本流, 只能缺省, 不能指定编码
  • GBK, GB2312 属于DBCS, 属于ANSI扩展ASCII码范畴, 此范畴还有Shift_JIS, Big5, 但是英文输入法切换为全角才是DBCS, 半角仍然为ASCII/UTF8
  • Unicode(U+XXXX)实现方式为utf-8, utf-16, utf-32对应CPP类型wchat_t, char16_t, char32_t和字面值u8, u, U标识, 同时wchar_t也是C宽字符类型对应字面值L标识
  • utf-8 是最牛逼的

  • 关于流转化问题, 分级构造问题
    • 可以自己将二进制流构造为字符流, 意义在于
      • 没有直接的字符流媒介类, 如System.in
      • 需求为二流共用
      • 搞事情, 玩, 玩, 玩
    • 字符流过滤器只能加在字符流上, 二进制流过滤器只能加在二进制流上
    • 转换后, 将能继续使用过滤器加强在字符流上(显然该字符流不属于哪一个媒介类, 属于转换而来)
PrintWriter pw = new PrintWriter(
					new BufferedWriter(
						new OutStreamWriter(
							new BufferedOutputStream(
								new PipedOutputStream(pipe)), 	"GB2312")))
  • 关于File目录, 路径 <=> 文件操作
  • TBD

  • Java I/O 牛逼
  • 牛逼 OOP之神