有一个程序IO.java,java代码怎么变成程序如下。发现输入1之后,还没等到输入宽,程序就直接输出了637。为什么?

初学者如笔者我对于IO最头疼的地方是的io类太多了,分不清其区别。其实多思考一下分清这些区别也不是太难。

我们首先来看一幅图,该图清楚地展示了基本常用到的IO流(浏览大体框架即可,下面再看具体类):


可见IO流分为字节流和字符流。

流(Stream)的概念来源于UNIX中的管道(pipe)概念,在unix中,管道是一条不间断的字节流,用来实现程序和进程间的通信,或者读写外围设备、外部文件等。流,必须有源端和目的端,可以是文件,内存或者网络等。流的创建是为了更方便的处理数据的输入输出。简单的来说:输入流就是从外部文件输入到内存,输出流主要是从内存输出到文件。我们用Eclipse开发小程序在控制台输入数据就属于输入流,即从控制台输入到内存。

其次对于字节流和字符流的区别:

字节流处理单元为1个字节,操作字节和字节数组,而字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。那么既然磁盘存储都是按字节,内存中处理为何还需要字符流呢?字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点!

那开发中究竟用字节流好还是用字符流好呢?

在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。我们建议尽量尝试使用字符流,一旦程序无法成功编译,就不得不使用面向字节的类库,即字节流。

上图中可以看到InputStream和OutputStream属于字节流,分别是输入字节流和输出字节流。而Reader和Writer属于字符流,分别对应输入字符流和输出字符流。本文不针对具体某一类示例,对于示例可以移步:。

而后三类属于FilterInputStream,这些类构造方法的参数为InputStream的实例,比如说( in) 。然而InputStream是抽象类,无法直接实例化,所以我们可以放前三类的实例对象进去。

也许下面这段话可以帮助理解:

InputStream是不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。BufferedInputStream带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!这是两者的区别。

为什么说字节流主要是操作byte类型的数组呢?请看以下示例:

可见要想读取InputStream实现类中的数据,需要用到byte[] 数组,然后将其转化为字符串并输出。

同时以上代码展示了BufferedInputStream的构造方法的一种参数形式。

在程序中一个字符等于两个字节,java提供了ReaderWriter两个专门操作字符流的类。两者同样是抽象类。已Reader为例,其常用的子类有:,,,,, 。

文章开头图中的ByteArrayReader其实应为此处的CharArrayReader,其构造函数的参数要接收字符数组。

StringReader是源为一个字符串的字符流,即其构造函数的参数要接收字符串。

另外,InputStreamReader和OutputStreamWriter这两个类是字节流和字符流之间的适配器类,它们承担编码转换的任务。

BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 其构造方法的参数为Reader子类。

其中被注释的部分也是一种使用BufferedReader读取文件的方法。

可见BufferedReader也就是所谓的字符流的代表处理的对象是字符数组或者字符串。
输出字符流和输入字符流同理,暂不赘述。


我要回帖

更多关于 java代码怎么变成程序 的文章

 

随机推荐