桥接转换流
InputStreamReader
和
OutputStreamWriter
是
java.io
包中用于处理字符流的最基本的类,用来在字节 流和字符流之间作为中介:从字节输入流读入字节,并按编码规范转换为字符;往字节输出流写字符时 先将字符按编码规范转换为字节。使用这两者进行字符处理时,在构造方法中应指定一定的平台规范, 以便把以字节方式表示的流转换为特定平台上的字符表示。
转换流可以在构造时指定其编码字符集
InputStreamReader
用于将一个
InputStream
类型的输入流自动转换为
Reader
字符流
OutputStreamWriter
用于将一个
Writer
字符输出流转换为
OutputStream
字节输出流
InputStreamReader
构造器
- InputStreamReader(InputStream)
- InputStreamReader(InputStream, String)
- InputStreamReader(InputStream, Charset)
- InputStreamReader(InputStream, CharsetDecorder)
Reader r=new InputStreamReader(System.in);
int kk=r.read(); //例如输入的是“中国”,这里实际读取的是"中"
//因为这里读取的是一个字节,所以输入"中国",实际读取的是"中"的一个字节,输出显示为?
kk=System.in.read();
System.out.println("输入的是:"+(char)kk);
InputSteram is=new InputStreamReader(System.in,”iso8859-1”);
Reader r=new InputStreamReader(System.in, "gbk");
int kk=r.read(); //例如输入的是"中国",实际读取的是"中"
System.out.println("输入的是:"+(char)kk);
注意:一般不建议自行设置编码字符集,除非是必须的
缓冲流
缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的效率,同时增加了一些新方法。
以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比 较高的时候,其性能表现不佳。为了解决以上弊端,采用缓存流。
缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到 缓存中的数据读取完毕,再到硬盘中读取。
构造方法
- BufferedReader(Reader)不定义缓存大小,默认8192
- BufferedReader(Reader in, int size)size为自定义缓冲区的大小
- BufferedWriter(Writer)
- BufferedWriter(Writer out, int size)size为自定义缓冲区的大小
- BufferedInputStream(InputStream)
- BufferedInputStream(InputStream in, int size)size为自定义缓冲区的大小
- BufferedOutputStream(OutputStream)
- BufferedOutputStream(OuputStream out, int size)size为自定义缓冲区的大小
缓冲输入流的方法
BuffedReader
提供了一个方法
readLine():String
,但是
BufferedInputStream
中并没有这个
- BufferedReader提供了readLine方法用于读取一行字符串,以\r或\n分割(换行符)
- 如果读取内容为null,则表示读取到了流的末尾
- readLine方法会自动剔除本行内容末尾的换行符
- BufferedWriter提供了newLine方法用于写入一个行分隔符
对于输出的缓冲流,写入的数据会先在内存中缓存,使用
flush
方法会使内存中的数据立即写出
键盘录入
System.in:InputStream
用于指代系统默认的输入设备
—
键盘
方法
read():int
可以实现代码执行到这里则会阻塞等待,只要输入数据为止
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入数据");
String temp="";
while((temp=br.readLine()).trim().length()>0){
if("quit".equals(temp)) break;
System.out.println(temp);
}
br.close();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("只有缓冲区满才自动进行输出显示");
bw.flush(); //刷新缓冲区,否则看不到输出内容
System.in.read();
bw.close(); //关闭输出时会首先自动进行刷新缓冲区