黑马软件工程师_ 关于标准输入输出流的一些深入讨论
------- android培训、java培训、期待与您交流! ----------
当我们在java中使用标准输入输出流的时候,也就是system.out和system.in的时候
它们分别对应的是控制台和键盘,system.out我们经常使用,对于system.in却不是经常使用。。
在jdk中system.in是这样定义的
public staticfinal InputStream in
说明对应的流是一个InputStream的实例
也就是字节读取流对象
所以,我们可以这样去定义
InputStream in =system.in;
从而使用对应字节读取流的方法
int available()
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
voidclose()
关闭此输入流并释放与该流关联的所有系统资源。
voidmark(int readlimit)
在此输入流中标记当前的位置。
boolean markSupported()
测试此输入流是否支持 mark 和 reset 方法。
abstract int read()
从输入流中读取数据的下一个字节。
intread(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
intread(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入 byte 数组。
voidreset()
将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
longskip(long n)
跳过和丢弃此输入流中数据的 n 个字节。
所以,可以通过int a=in.read();去读取键盘录入的信息
而为什么在读取的时候如果定义
int a=in.read();
int b=in.read();
int c=in.read();
当你输入 一个字符后回车后,a,b,c都能得到值,这是因为在读取的时候
在window下是换行是‘\r’’\n’
所以读到的是这两个字符分别是 b 和c的值
当我们感觉上边的输入数据的方法是如此的繁琐的时候。
就想到了一个方法readLine.但是很不幸,这个方法是字符流的方法。
下边来说一下字符流和字节流的相互转化使用其各自的方法
在jdk中,我们找到了一个类
InputStreamReader
InputStreamReader正是字节流通向字符流的桥梁。
是我们可以将system.in转成一个字符流
代码如下:
InputStream in =System.in;
InputStreamReaderisr = new InputStreamReader(in);//完成了转化
这样我们就可以使用bufferedReader去装饰inputStreamReader
BufferedReader br = new BufferedReader(isr);
从而实现了使用BufferedReader的readLine();
而对于system.out来说,也一样,
OutputStream os = System.out;
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
从而就可以使用BufferedWriter中的方法了