一、什么是IO

Java中I/O操作主要是指使用Java进行输入,输出操作。 Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。

Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。

  Java.io是大多数面向数据流的输入/输出类的主要软件包。

  此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO。
JDK1.4版本开始引入了新I/O类库,它位于java.nio包中,新I/O类库利用通道和缓冲区等来提高I/O操作的效率。 流IO简单易用但效率较低。 块IO效率很高但编程比较复杂。

二、Java IO模型 :

java I/O 的设计使用到了 Decorator(装饰器)模式,按功能划分Stream,您可以动态装配这些 Stream,以便获得您需要的功能。

例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。

三、数据流的基本概念

数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。

数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。

对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。

不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。

  “流是磁盘或其它外围设备中存储的数据的源点或终点。”

在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。

比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。

外存、内存、缓存的比较

存储量(依次递减):    外存-->内存-->缓存

读取速度(依次递减):  缓存-->内存-->外存

对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:

     标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

基本流:

一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。

输入流:

 程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道。

输出流:

 程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。

为什么设计成数据流呢?

Input Stream不关心数据源来自何种设备(键盘,文件,网络) 

Output Stream不关心数据的目的是何种设备(键盘,文件,网络)

采用数据流的目的就是使得输出输入独立于设备。

四、I/O体系结构

简单介绍下上图:

你有没有发现,都是成对出现的, 初学者就很容易混淆,分不清是字节流还是字符流,大家只需要看最后这个单词,如果是 Stream 的话就是字节流,如果是 Reader/Writer 的话就是字符流。

在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了

Java I/O主要包括如下几个层次,包含三个部分:

1.流式部分――IO的主体部分;

2.非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;

3.其他类–文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

流式部分主要类:

Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。

对文件进行操作:

FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)

对管道进行操作:

PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)

PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。

字节/字符数组:

ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。

Buffered缓冲流:

BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。

转化流:

InputStreamReader/OutputStreamWriter,把字节转化成字符。

数据流:

DataInputStream,DataOutputStream。

因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?

可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。

数据流可以直接输出float类型或long类型,提高了数据读写的效率。

打印流:

printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。

对象流:

ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。

序列化流:

SequenceInputStream。

对象序列化:把对象直接转换成二进制,写入介质中。

注:

使用对象流需要实现Serializable接口,否则会报错。

而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.

非流式部分主要类:

File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。

File类:

在Java语言的java.io包中,由File类提供了描述文件和目录的操作与管理方法。 

但File类不是InputStream、OutputStream或Reader、Writer的子类,因为它不负责数据的输入输出,而专门用来管理磁盘文件与目录。

作用:File类主要用于命名文件、查询文件属性和处理文件目录。

File类共提供了四个不同的构造函数,以不同的参数形式灵活地接收文件和目录名信息。构造函数:

1)File (String pathname)

 例:File  f1=new File("FileTest1.txt"); //创建文件对象f1,f1所指的文件是在当前目录下创建的FileTest1.txt

2)File(URI uri)

3)File (String parent , String child)

 例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目录事先必须存在,否则异常

4)File (File parent , String child)

 例:  File  f4=new File("E:\\dir3");
File f5=new File(f4,"FileTest5.txt"); //在如果 E:\\dir3目录不存在则需要先使用f4.mkdir()先创建

一个对应于某磁盘文件或目录的File对象一经创建, 就可以通过调用它的方法来获得文件或目录的属性。

   1)public boolean exists( ) 判断文件或目录是否存在

   2)public boolean isFile( ) 判断是文件还是目录 

   3)public boolean isDirectory( ) 判断是文件还是目录

   4)public String getName( ) 返回文件名或目录名

   5)public String getPath( ) 返回文件或目录的路径。

   6)public long length( ) 获取文件的长度 

   7)public String[ ] list ( ) 将目录中所有文件名和目录名保存在字符串数组中返回。 

   8)public File[] listFiles() 返回某个目录下所有文件和目录的绝对路径,返回的是File数组

   9)public String getAbsolutePath() 返回文件或目录的绝对路径

   ....
File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:
1) public boolean renameTo( File newFile ); 重命名文件 2) public void delete( ); 删除文件 3) public boolean mkdir( ); 创建目录 4)public boolean createNewFile(); 创建文件

例子:输出一个目录中的所有文件名(目录可能是多级目录,如a目录中有b、c目录。。。)

FileUtils.java

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileUtils {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">listDir</span>(String dir) throws IOException {
File file = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> File(dir);
<span class="hljs-comment" style="box-sizing: border-box;">//传进来的可能不是一个目录</span>
<span class="hljs-keyword" style="box-sizing: border-box;">if</span> (!file.isDirectory()) {
<span class="hljs-keyword" style="box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="box-sizing: border-box;">new</span> IOException(dir+<span class="hljs-string" style="box-sizing: border-box;">"不是目录"</span>);
}
<span class="hljs-comment" style="box-sizing: border-box;">//传进来的可能是一个错误的路径</span>
<span class="hljs-keyword" style="box-sizing: border-box;">if</span> (file == <span class="hljs-keyword" style="box-sizing: border-box;">null</span>) {
<span class="hljs-keyword" style="box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="box-sizing: border-box;">new</span> IOException(<span class="hljs-string" style="box-sizing: border-box;">"没有此路径"</span>);
}
File[] files = file.listFiles();
<span class="hljs-keyword" style="box-sizing: border-box;">for</span> (File f : files) {
<span class="hljs-comment" style="box-sizing: border-box;">//有可能是一个多级目录,递归调用</span>
<span class="hljs-keyword" style="box-sizing: border-box;">if</span> (f.isDirectory()) {
listDir(f.getAbsolutePath());
<span class="hljs-comment" style="box-sizing: border-box;">//是文件就直接输出该文件的绝对路径</span>
}<span class="hljs-keyword" style="box-sizing: border-box;">else</span> {
System.<span class="hljs-keyword" style="box-sizing: border-box;">out</span>.println(f.getAbsolutePath());
}
}
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">24</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">24</span></li></ul>

Main.java

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> Main {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
FileUtils.listDir(<span class="hljs-string" style="box-sizing: border-box;">"E:\\ssh"</span>);
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li></ul>

结果:

这里就不多解释了,应该比较简单,代码中也有详细注释。

五、几种流的介绍

1、InputStream抽象类

InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 

继承自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit);

InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法: 

   

  (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。 

   

  (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 

   

  (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。 

   

  (4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用, 

   

  (5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取 

   

  (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.

主要的子类:

 1) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作     

 2) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 

 3) StringBufferInputStream:把一个String对象作为InputStream 

 4) PipedInputStream:实现了pipe的概念,主要在线程中使用 

 5) SequenceInputStream:把多个InputStream合并为一个InputStream

2、OutputStream抽象类

OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。 

   

  (1) public void write(byte b[ ]):将参数b中的字节写到输出流。 

   

  (2)public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。 

   

  (3) public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。 

   

  (4)public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。 

   

  (5) public void close( ) : 关闭输出流并释放与流相关的系统资源。

主要的子类:

 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 

 2) FileOutputStream:把信息存入文件中 

 3) PipedOutputStream:实现了pipe的概念,主要在线程中使用 

 4) SequenceOutputStream:把多个OutStream合并为一个OutStream

注:

流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时。

3、FileInputStream文件输入流

FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。

在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。

作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。

使用方法:

FileInputStream fis = new FileInputStream(“E:\a.txt”);

或 FileInputStream fis = new FileInputStream(“E:/a.txt”);

当然也可以传一个 File ,它还有好多个构造器。大家可以看看源码应该就懂了。

例子: 

将a.txt的内容显示在显示器上

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {

        FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(<span class="hljs-string" style="box-sizing: border-box;">"a.txt"</span>);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
System.<span class="hljs-keyword" style="box-sizing: border-box;">out</span>.print((<span class="hljs-keyword" style="box-sizing: border-box;">char</span>)a);
}
}
}
</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li></ul>

结果:

如果将 System.out.print((char)a) 改成 System.out.print(a) 又会是怎样呢?

怎么回事呢?不是字节流吗?读出来不就是一个字节,怎么输出一个整数了呢?

答:read()方法确实是读取一个字节,但返回值是 int 类型的,会将取出来的一个字节高位会补 0 成一个 int 型。所以输出来的应该这个数据的 ASCII 码。

使用键盘输入一段中文并输出到控制台,看看会是怎样?

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
System.<span class="hljs-keyword" style="box-sizing: border-box;">out</span>.print(a);
}
}
}
</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li></ul>

可以猜到应该会输出一些整数即 ASCII 码,因为读的时候是一个字节一个字节的读,而中文又不止一个字节,到底要几个字节来表示,这要取决于编码集(我这里的是拆成了三个字节,两个字节是用来标记一行的)。反正会拆成几个字节来读。

结果:

那么如果强转成 char 类型又会怎样呢?

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
System.<span class="hljs-keyword" style="box-sizing: border-box;">out</span>.print((<span class="hljs-keyword" style="box-sizing: border-box;">char</span>)a);
}
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li></ul>

结果:

我们看到输入哈,输出å,但这并不是我们想要的。为什么会这样呢?我们来看一下 å 的 ASCII 码,刚好是 229,这我们就知道它只取了第一字节ASCII码对应的字符。

ASCII 码表可在文章最后查看。

4、FileOutputStream文件输出流

FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。

作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据到文件

创建文件流的方式:

1)FileOutputStream(File file) 

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 

例: File f=new File (“d:/myjava/write.txt “); 

FileOutputStream out= new FileOutputStream (f);

2)FileOutputStream(File file, boolean append) 

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 append表示内容是否追加

3)FileOutputStream(FileDescriptor fdObj) 

创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一 

个到文件系统中的某个实际文件的现有连接。

4)FileOutputStream(String name) 

创建一个向具有指定名称的文件中写入数据的输出文件流。 

例:FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt “);

5)FileOutputStream(String name, boolean append) 

创建一个向具有指定 name 的文件中写入数据的输出文件流。 append表示内容是否追加

注:

(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;

(2)的读/写操作结束时,应调用close方法关闭流。

例子:

使用键盘输入一段内容,将内容保存在文件write.txt中

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileOutputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {

        FileOutputStream fos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileOutputStream(<span class="hljs-string" style="box-sizing: border-box;">"write.txt"</span>);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
fos.write(a);
}
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li></ul>

结果:

有同学会问了,刚才上面汉字的读取不是一个字节一个字节读,存到文件中的应该也是一个字节一个字节的,那么查看的时候不应该是乱码吗?

答:从键盘读取的时候确实是一个字节一个字节读取,存的时候也是一个字节一个字节存,只不过它会加点标志(不同的编码集标记的方式可能不一样)。(我这里的编码是每个汉字用三个字节编码,用两个字节来标记一行),到时候输出的时候它就会根据标记和汉字所占字节数来拼接成汉字。

我们来输出看一下:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
<span class="hljs-comment" style="box-sizing: border-box;">//哈: 229 147 136 13 10 </span>
<span class="hljs-comment" style="box-sizing: border-box;">//哈哈: 229 147 136 229 147 136 13 10 </span>
<span class="hljs-comment" style="box-sizing: border-box;">//哈哈哈: 229 147 136 229 147 136 229 147 136 13 10 </span>
<span class="hljs-comment" style="box-sizing: border-box;">//哈哈(两行)哈哈:229 147 136 229 147 136 13 10 229 147 136 229 147 136 13 10 </span>
FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(<span class="hljs-string" style="box-sizing: border-box;">"a.txt"</span>);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
System.<span class="hljs-keyword" style="box-sizing: border-box;">out</span>.print(a+<span class="hljs-string" style="box-sizing: border-box;">" "</span>);
}
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li></ul>

结果:

这里的结果是哈哈(两行)哈哈的输出结果,当然也分别测了四种情况,为了更好的对比:

当 a.txt 的内容为哈、哈哈、哈哈、哈哈(两行)哈哈的时候,存的时候各是什么情况,代码中都写了,大家可以看看。可以发现标记一行的是13 10 这两个字节。不要问我这明明就是个整数不是占4个字节,为什么说是一个字节?read() 的返回值为 int,取出的 byte 高位补0成int。那么怎么拼接的呢?比如:内容为哈的时候,首先找到标记的位置,用(所占字节数-2)/3=汉字的个数,而每个汉字占三个字节,这不就可以三个三个字节拼接出来了吗。

5、缓冲输入输出流 BufferedInputStream/ BufferedOutputStream(也称包装流)

计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。

为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。

为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。

缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。

这样可以减少访问硬盘的次数,提高传输效率。

BufferedInputStream:当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。

BufferedOutputStream :当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。

a、将文件读入内存:

将BufferedInputStream与FileInputStream相接

FileInputStream in=new FileInputStream( “file1.txt “);

BufferedInputStream bin=new BufferedInputStream(in);

b、将内存写入文件:

将BufferedOutputStream与 FileOutputStream相接

FileOutputStreamout=new FileOutputStream(“file2.txt”);

BufferedOutputStream bin=new BufferedInputStream(out);

c、键盘输入流读到内存 

将BufferedReader与标准的数据流相接

InputStreamReader sin=new InputStreamReader (System.in) ;

BufferedReader bin=new BufferedReader(sin);

例子:从键盘输入一串内容存到file1.txt文件中

<code class="hljs cs has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
BufferedReader br = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedReader(<span class="hljs-keyword" style="box-sizing: border-box;">new</span> InputStreamReader(System.<span class="hljs-keyword" style="box-sizing: border-box;">in</span>));
BufferedWriter bw = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedWriter(<span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileWriter(<span class="hljs-keyword" style="box-sizing: border-box;">new</span> File(<span class="hljs-string" style="box-sizing: border-box;">"file1.txt"</span>)));
String s;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((s = br.readLine()).length() > <span class="hljs-number" style="box-sizing: border-box;">0</span>) {
bw.write(s, <span class="hljs-number" style="box-sizing: border-box;">0</span>, s.length());
}
}
}
</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li></ul>

结果:

大家可以看到,我们刚才在键盘上输入的内容并没有存入到这个文件中,这不是操蛋吗?这样只是为了引出包装流的一个特性即因为它是包装流拥有缓存区,每次的读取的数据都存在缓存区中,当缓存区满了的时候才会写入到硬盘上。但是默认的缓存区大小为8192个字节,当然你也可以指定缓存区的大小。显然刚才输入的字符串并没有装满。

指定缓存区的大小:包装流的构造器

如 BufferedWriter(Writer out, int size) 

创建一个使用给定大小输出缓冲区的新缓冲字符输出流。size为缓存区的大小

所以就需要我们手动的去刷新缓冲区。调用包装流的 flush() 方法。这个方法的作用就是将缓存区的内容写入到硬盘上并清空缓存区。

当然能不能不写 flush()方法也让它刷新呢?

答:可以,调用 close() 方法关闭流即可。当你调用 close()方法时它会先刷新缓存区。这就是刚才上面所说要记得用完之后要关闭流。不过最好有使用到包装流的时候两个方法都记得写上。

程序说明:

从键盘读入字符,并写入到文件中BufferedReader类的方法:String readLine()

作用:读一行字符串,以回车符为结束。

BufferedWriter类的方法:bout.write(String s,offset,len)

作用:从缓冲区将字符串s从offset开始,len长度的字符串写到某处。

当然包装流中还有许多方法(主要方法):

void write(char ch);//写入单个字符。

void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
void write(String s,int off,int len)//写入字符串的某一部分。 void newLine()//写入一个行分隔符。 void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。 void close();//关闭此流,再关闭前会先刷新他。

6、Writer/Reader字符流

a、Reader抽象类

用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

子类简单介绍:

(1) 用指定字符数组作为参数:CharArrayReader(char[]) 

    将字符数组作为输入流:CharArrayReader(char[], int, int)
读取字符串,构造函数如下: public StringReader(String s); 2) CharArrayReader:与ByteArrayInputStream对应 3) StringReader : 与StringBufferInputStream对应 4) InputStreamReader
从输入流读取字节,在将它们转换成字符:Public inputstreamReader(inputstream is); 5) FilterReader: 允许过滤字符流
protected filterReader(Reader r); 6) BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
Public BufferReader(Reader r);

主要方法:

  (1)  public int read() throws IOException; //读取一个字符,返回值为读取的字符 

 (2)  public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/ 

  (3)  public abstract int read(char cbuf[],int off,int len) throws IOException; /*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/

b、 Writer抽象类

写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

子类简单介绍:

1) FileWrite: 与FileOutputStream对应

  将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。 

  Public FileWrite(file f);

2)  chararrayWrite:与ByteArrayOutputStream对应 ,将字符缓冲器用作输出。

   Public CharArrayWrite(); 

   

3) PrintWrite:生成格式化输出 

   public PrintWriter(outputstream os); 

   

4) filterWriter:用于写入过滤字符流 

   protected FilterWriter(Writer w); 

   

5) PipedWriter:与PipedOutputStream对应

6) StringWriter:无与之对应的以字节为导向的stream

主要方法:

  (1)  public void write(int c) throws IOException; //将整型值c的低16位写入输出流
  
  (2) public void write(char cbuf[]) throws IOException; //将字符数组cbuf[]写入输出流
  
  (3) public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流
  
  (4) public void write(String str) throws IOException; //将字符串str中的字符写入输出流
  
  (5) public void write(String str,int off,int len) throws IOException; //将字符串str 中从索引off开始处的len个字符写入输出流
  
  (6) flush( ) //刷空输出流,并输出所有被缓存的字节。
  
  (7)close() 关闭流 public abstract void close() throws IOException

当然这些子类我这里就不一一去详细介绍了,我相信大家看懂了字符流的用法,再去学习字符流的话应该不在话下的。

7、输入流和输出流的应用

这里就介绍的文件输入流和文件输出流一起使用的情况。

例子:利用程序将文件a.CHM 拷贝到a.chm中。

这里分别用了四种方式,也算对这些的流的速率的一个对比,这四种情况分别是:

1)基本字节流每次读一个字节

2)基本字节流每次读一组字节

3)高效字节流每次读一个字节(即包装流)

4)高效字节流每次读一组字节(即包装流)

<code class="hljs java has-numbering" style="display: block; padding: 0px; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);"><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box;">CopyDemo</span> {</span>

    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> IOException {
String source = <span class="hljs-string" style="box-sizing: border-box;">"a.CHM"</span>;
String dict = <span class="hljs-string" style="box-sizing: border-box;">"copy.chm"</span>;
<span class="hljs-keyword" style="box-sizing: border-box;">long</span> startTime = System.currentTimeMillis();
method4(source, dict);
<span class="hljs-keyword" style="box-sizing: border-box;">long</span> endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+<span class="hljs-string" style="box-sizing: border-box;">"毫秒"</span>);
} <span class="hljs-comment" style="box-sizing: border-box;">// 基本字节流每次读一个字节</span>
<span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method1</span>(String source, String dict) <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> IOException {
FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(source);
FileOutputStream fos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileOutputStream(dict);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
fos.write(a);
}
fos.close();
fis.close();
} <span class="hljs-comment" style="box-sizing: border-box;">// 基本字节流每次读一组字节</span>
<span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method2</span>(String source, String dict) <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> IOException {
FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(source);
FileOutputStream fos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileOutputStream(dict);
<span class="hljs-keyword" style="box-sizing: border-box;">byte</span>[] b = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> <span class="hljs-keyword" style="box-sizing: border-box;">byte</span>[<span class="hljs-number" style="box-sizing: border-box;">1024</span>];
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> len;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((len = fis.read(b)) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
fos.write(b, <span class="hljs-number" style="box-sizing: border-box;">0</span>, len);
}
fos.close();
fis.close();
} <span class="hljs-comment" style="box-sizing: border-box;">// 高效字节流每次读一个字节</span>
<span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method3</span>(String source, String dict) <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> IOException {
FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(source);
BufferedInputStream bis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedInputStream(fis);
FileOutputStream fos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileOutputStream(dict);
BufferedOutputStream bos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedOutputStream(fos);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
fos.write(a);
}
bos.close();
bis.close();
} <span class="hljs-comment" style="box-sizing: border-box;">// 基本字节流每次读一组字节</span>
<span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">static</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method4</span>(String source, String dict) <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> IOException {
FileInputStream fis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileInputStream(source);
BufferedInputStream bis = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedInputStream(fis);
FileOutputStream fos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> FileOutputStream(dict);
BufferedOutputStream bos = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> BufferedOutputStream(fos);
<span class="hljs-keyword" style="box-sizing: border-box;">byte</span>[] b = <span class="hljs-keyword" style="box-sizing: border-box;">new</span> <span class="hljs-keyword" style="box-sizing: border-box;">byte</span>[<span class="hljs-number" style="box-sizing: border-box;">1024</span>];
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> len;
<span class="hljs-keyword" style="box-sizing: border-box;">while</span> ((len = fis.read(b)) != -<span class="hljs-number" style="box-sizing: border-box;">1</span>) {
fos.write(b, <span class="hljs-number" style="box-sizing: border-box;">0</span>, len);
}
bos.close();
bis.close();
}
}</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">36</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">37</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">38</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">39</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">40</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">41</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">42</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">43</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">44</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">45</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">46</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">47</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">48</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">49</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">50</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">51</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">52</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">53</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">54</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">55</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">56</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">57</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">58</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">59</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">60</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">61</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">62</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">63</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">64</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">65</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">7</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">8</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">9</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">10</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">11</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">12</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">13</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">14</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">15</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">16</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">17</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">18</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">19</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">20</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">21</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">22</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">23</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">24</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">25</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">26</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">27</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">28</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">29</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">30</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">31</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">32</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">33</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">34</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">35</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">36</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">37</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">38</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">39</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">40</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">41</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">42</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">43</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">44</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">45</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">46</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">47</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">48</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">49</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">50</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">51</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">52</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">53</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">54</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">55</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">56</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">57</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">58</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">59</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">60</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">61</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">62</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">63</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">64</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:Courier New;font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">65</span></li></ul>

当然测试的文件尽量大点,不然差别不是很明显,我这里的a.CHM文件的大小为35.2 MB。当然用时也跟计算机性能有点关系。当然文件大点差别就更加明显点。

在我电脑上的四种情况的用时为:

1.221196毫秒

2.346毫秒

3.220454毫秒

4.335毫秒

这里1和3,2和4比较,可以发现包装流更加高效,为什么呢?

比较下2和4,把这个搞懂,其他的也就懂了。

这两个从硬盘上读取内容的时间应该差不多,但时间就差在写的时间上了,缓存区一般在内存,内存的速度是很快的,将数据写入到硬盘的速度是很慢的,所以我们只需要减少写入硬盘的次数即可。包装流的默认缓存区大小为8192字节,包装流读取8次才写一次,所以包装流的效率是大大增加了。

六、Java IO 的一般使用原则

一)按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二)按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三)按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四)按数据格式分:

1 、二进制格式(只要不能确定是纯文本的,比如图片、音频、视频) : InputStream, OutputStream 及其所有带 Stream 结尾的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五)按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六)特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

由于篇幅有限,还有一些细节的这里就不多说了,想要了解的话可以加我QQ460821714一起讨论。

ASCII 码对照表

下表列出了字符集中的 0 - 127 (0x00 - 0x7F)。

 

下表列出了字符集中的 128 - 255 (0x80 - 0xFF)。

 

注:

数值 8、9、10 和 13 可以分别转换为退格符、制表符、换行符和回车符。这些字符都没有图形表示,但是对于不同的应用程序,这些字符可能会影响文本的显示效果。

“空” 表示在当前平台上不支持的字符。

Java基础学习总结(47)——JAVA输入输出流再回忆的更多相关文章

  1. Java基础IO类之字节输入输出流

    一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...

  2. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  3. Java基础学习笔记一 Java介绍

    java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...

  4. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  5. Java基础学习笔记九 Java基础语法之this和super

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  6. JAVA基础学习——1.0 Java概述

    Java语言 SUN公司  1995年推出的高级编程语言 ■  主要应用方向 Web开发和Android开发 ■  主要特点 平台无关性:能运行于不同的平台上    安全性:去掉了指针操作,内存由操作 ...

  7. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  8. Java基础学习总结(50)——Java事务处理总结

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  9. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

随机推荐

  1. Civil3D二次开发常见问题总结

    Civil3D二次开发常见问题总结 AutoCAD命令提示"未知命令**--"的原因:在Initialize方法内报出异常就会导致这种情况.O__O"-(或是少加了dll ...

  2. [ES6] Proxy & Reflect

    Proxy and Reflect API works nicely together. About how to use Proxy, check this post. Let's see abou ...

  3. [Tailwind] Style Elements on hover and focus with Tailwind’s State Variants

    In this lesson, we learn how to target specific states of elements and apply styles only when those ...

  4. mysql设置远程訪问数据库的多种方法

    问题:MySQL权限设置正确,但仍无法远程訪问.通过telnet发现3306port未打开. 分析:MySQL默认仅仅绑定127.0.0.1,即:仅仅有在本机才干訪问3306port. 解决:找到My ...

  5. JBoss vs. Tomcat

    JBoss 支持Servlet.Web Server和其它J2EE Features Servlet引擎使用Tomcat的内核 SSL性能比Tomcat快4倍(据说) 支持.net.PHP.CGI 支 ...

  6. vijos- P1385盗窃-月之眼 (水题 + python)

    P1385盗窃-月之眼 Accepted 标签:怪盗基德 VS OIBH[显示标签] 背景 怪盗基德 VS OIBH 第三话 描写叙述 怪盗基德第三次来到熟悉的OIBH总部.屡屡失败的OIBH这次看守 ...

  7. OpenCV+海康威视摄像头的实时读取

    OpenCV+海康威视摄像头的实时读取 本文由 @lonelyrains出品.转载请注明出处. 文章链接: http://blog.csdn.net/lonelyrains/article/detai ...

  8. String与StringBuffer的差别

    String 是一个常量,即一旦创建不可更改 输出结果为:helloworldjeok 看似.string变量name的值改变了,事实上此name非彼name. 输出结果为: sex:hello wo ...

  9. BZOJ 4012 树链剖分+主席树

    思路: http://blog.csdn.net/lych_cys/article/details/50763073 lych的题解-- 写得很详细 //By SiriusRen #include & ...

  10. js 数据类型判断

    判断type类型 isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } ...