父类 子类
--->System.in(实例类)
InputStream(抽象类,所有输入流的父类)|
--->FileInputStream
---->System.out(实例类)
OutpustStream(抽象类,所有输出流的父类)|
----> FileOutputStream
---->InputStreamWriter 非文件流输出
Writer(抽象类)----------- |
---->FilerWriter 文件流输出
----->InputStreamReader 非文件流读入
Reader(抽象类)----实现 |
----->FileReader 文件流读入
buffer类
BufferedReader 用来包装Reader类,如FileReader和InputSreamReader
BufferedWriter 用来包装Writer类,如FileWriter和OutputStreamWriter
--->包装InputStreamReader
BufferedReader|
--->包装FileReader
--->包装OutputStramWriter
BufferedWriter|
--->包装FileWriter
---->包装InputStream
BufferedInputStream|
---->包装FileInputStream
---->包装OutputStream
BufferedOutputStream|
---->包装FileOutputStream
当不明白输入或输出流该如何创建,以下思路
- 是否使用buffer缓存机制 包装/不包装
- 输入?输出 Input/Output Reader/Writer
- 文件还是非文件 FileInputStream/InputStream :FileReader/OutputStreamReader
- 使用Writer/Reader字符处理还是OutputStram/InputStream直接处理 :InputStreamWriter/System.out
如非buffer机制输出非文件字符处理是:
OutputStreamWriter
对应的buffer处理的是:
BufferedWriter bf=new BuffererdWriter(OutPutStreamWriter(System.out));
buffer
处理只是在输入/输出流外加一层壳
BufferedReader
- String readLine()
读一行
2.int read()
读一个字符
3.int read(char[] arr)
读满字符数组
4.int read(char[] arr,int off,int length)
从数组off下标开始读入,读取length长度
BufferedWriter
- newLine()
创建一行
StreamTokenizer
- ordinaryChars(char a,char b)
ascill码从a到b作为未标记字符(nextToken遇到未标记字符,会停止读取,返回其ascill码)- wordChars(char a,char b)
将ascill码从a到b作为普通字符处理- resetSyntax()
所有字符设置初始到默认状态- whitesapceChars(int a,int b)
将ascill码从a到b的字符会忽视,默认将空格和换行符跳过,每次遇到该字符会终止此次读取,下次继续读取时会默认跳过开头这些字符- int nextToken()
遇到非标记字符时,返回该字符的ascil码,若此次读取了一些内容,则返回ttype表示此次读取的数据类型如number和string分别存储在nval和sval
如果想读取long类型,由于nval存储double类型,long类型会精度丢失,所以可以先使用字符读取,再使用Long.parseLong()
st.ordinary(‘0’,‘9’);
st.wordChars(‘0’,‘9’)
st.nextToken();
Long res=Long.paseLong(st.sval);
st.resetSyntax(); //可以省略