黑马软件工程师_ 关于标准输入输出流的一些深入讨论

黑马程序员_ 关于标准输入输出流的一些深入讨论

------- 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中的方法了