System.out 是
PrintStream
简单修饰FilterOutputStream
(好用API) 或者是实现了FilterOutputStream
接口 System.in 是InputStream
接口下的FileInputStream
- 二进制流, 使用
byte[]
- InputStream => File/Filter/ByteArray/PushbackInputStream => DataInputStream
- BfuferedInputStream 修饰缓冲
read()
- 字符集参数
- BfuferedInputStream 修饰缓冲
- OutputStream => File/Filter/ByteArrayOutputStream => DataOutputStream, PrintStream
- BufferedOutputStream 修饰缓冲
write()
autoflush flag
,append flag
- 字符集参数
- BufferedOutputStream 修饰缓冲
- InputStream => File/Filter/ByteArray/PushbackInputStream => DataInputStream
- 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
- 好用API
PrintStream
- 算数, 字符串
DataOutputStream
- 好用API
- 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
- skip, while(read())配合使用
- FilterWriter
- 好用API
PrintWriter
- 好用API
- 增强
- 关联
- InputStreamReader(char set)
- OutputStreamWriter(char set)
- Scanner
- By
InputStream
- By
Reader
- By
File
- By
- 关于字符集问题
- 凡是有二进制流构造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之神
PREVIOUSJava-CPP-Pattern