1、第第1010章章 JavaJava语言语言的输入输出的输入输出与文件处理与文件处理2本章主要内容本章主要内容流的概念流的概念处理字节流的基本类:处理字节流的基本类:InputStream和和OutputStream处理字符流的基本类:处理字符流的基本类:Reader和和Writer标准输入输出标准输入输出文件管理类:文件管理类:File310.1 Java10.1 Java语言的输入输出类库语言的输入输出类库输入输出是指程序与外部设备或其他计算输入输出是指程序与外部设备或其他计算机进行交互的操作。机进行交互的操作。JavaJava语言把这些输入与输出操作用流来实语言把这些输入与输出操作用流来实
2、现,用统一的接口来表示。现,用统一的接口来表示。JavaJava语言的输入输出功能必须借助于输入语言的输入输出功能必须借助于输入输出类库输出类库java.iojava.io包来实现。包来实现。410.1.1 流的概念流的概念流流(Stream)(Stream)是指计算机各部件之间的数据流动。是指计算机各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出按照数据的传输方向,流可分为输入流与输出流,从流的内容上划分,流分为字符流和字节流,从流的内容上划分,流分为字符流和字节流。流。输入输出流输入输出流 数据流分为输入流和输出流两大类。数据流是数据流分为输入流和输出流两大类。数据流是Jav
3、aJava程序发送和接收数据的一个通道,通常应程序发送和接收数据的一个通道,通常应用程序中使用输入流读出数据,输出流写入数用程序中使用输入流读出数据,输出流写入数据,就好像数据流入到程序或从程序中流出。据,就好像数据流入到程序或从程序中流出。过程如教材图过程如教材图10.110.1所示。所示。510.1.1 流的概念流的概念流式输入输出的最大特点是数据的获取和发送流式输入输出的最大特点是数据的获取和发送是沿着数据序列顺序进行,每一个数据都必须是沿着数据序列顺序进行,每一个数据都必须等待排在它前面的数据读入或送出之后才能被等待排在它前面的数据读入或送出之后才能被读写,每次读写操作处理的都是序列中
4、剩余的读写,每次读写操作处理的都是序列中剩余的未读写数据中的第一个,而不能随意选择输入未读写数据中的第一个,而不能随意选择输入输出的位置。输出的位置。缓冲流缓冲流为一个流配有一个缓冲区为一个流配有一个缓冲区(Buffer)(Buffer),一个缓冲,一个缓冲区就是专门用于传送数据的一块内存区就是专门用于传送数据的一块内存 。当向。当向一个缓冲流写入数据时,系统将数据发送到缓一个缓冲流写入数据时,系统将数据发送到缓冲区,而不是直接发送到外部设备。缓冲区自冲区,而不是直接发送到外部设备。缓冲区自动记录数据,当缓冲区满时,系统将数据全部动记录数据,当缓冲区满时,系统将数据全部发送到相应的外部设备。输
5、出雷同。发送到相应的外部设备。输出雷同。610.1.2 输入输出流类库输入输出流类库要要java.iojava.io包中有四个基本类:包中有四个基本类:InputStreamInputStream、OutputStreamOutputStream及及ReaderReader、WriterWriter类,它们分别类,它们分别处理字节流和字符流。它们之间的相互关系如处理字节流和字符流。它们之间的相互关系如下:下:InputStreamInputStream、OutputStreamOutputStream、ReaderReader与与WriterWriter是抽象类,用于数据流的输入输出;是抽象类
6、,用于数据流的输入输出;FileFile是文是文件类,用于对磁盘文件与文件夹的管理;件类,用于对磁盘文件与文件夹的管理;RandomAccessFileRandomAccessFile是随机访问文件类,用于实是随机访问文件类,用于实现对磁盘文件的随机读写操作。现对磁盘文件的随机读写操作。输入输入/输出输出流流字节流:字节流:处理字节数据(基本类型为 InputStream、OutputStream)字符流:字符流:处理字符数据(基本类型为Reader、Writer)710.2 使用使用InputStream和和OutputStream流类流类InputStreamInputStream和和Ou
7、tputStreamOutputStream类是类是JavaJava语言语言里用来处理以位里用来处理以位(bit)(bit)为主的流,它除了可为主的流,它除了可用来处理二进制文件用来处理二进制文件(binary file)(binary file)的数据的数据之外,也可用来处理纯文本文件。之外,也可用来处理纯文本文件。810.2.1 基本的输入输出流基本的输入输出流 InputStreamInputStream类常用的方法及功能见教材表类常用的方法及功能见教材表10.110.1。由于由于InputStreamInputStream是抽象类,所以程序中创是抽象类,所以程序中创建的输入流对象一般是
8、建的输入流对象一般是InputStreamInputStream某个子某个子类的对象,通过调用该对象继承的类的对象,通过调用该对象继承的read()read()方方法就可实现对相应外设的输入操作法就可实现对相应外设的输入操作。注意:流中的方法都声明抛出异常,注意:流中的方法都声明抛出异常,所以程序中调用流方法时必须处理异常,所以程序中调用流方法时必须处理异常,否则编译不能通过。否则编译不能通过。910.2.1 基本的输入输出流基本的输入输出流 OutputStreamOutputStream类常用的方法及功能见教材表类常用的方法及功能见教材表10.210.2。由于由于OutputStreamO
9、utputStream是抽象类,所以程序中创是抽象类,所以程序中创建的输出流对象一般是建的输出流对象一般是OutputStreamOutputStream某个子某个子类的对象,通过调用该对象继承的类的对象,通过调用该对象继承的write()write()方法就可以实现对相应外设的输出操作。方法就可以实现对相应外设的输出操作。1010.2.2 输入输出流的应用输入输出流的应用文件输入文件输入(FileInputStreamFileInputStream)输出流输出流(FileOutputStreamFileOutputStream)主要负责完成对本地磁盘文主要负责完成对本地磁盘文件的顺序输入与输
10、出操作。件的顺序输入与输出操作。FileInputStreamFileInputStream类的对象表示一个文件字节输入类的对象表示一个文件字节输入流,从中可读取一个字节或一批字节。流,从中可读取一个字节或一批字节。FileOutputStreamFileOutputStream类的对象表示一个字节文件输类的对象表示一个字节文件输出流,可向流中写入一个字节或一批字节。在生出流,可向流中写入一个字节或一批字节。在生成该类的对象时,若指定的文件不存在,则创建成该类的对象时,若指定的文件不存在,则创建一个新的文件,若已存在,则清除原文件的内容。一个新的文件,若已存在,则清除原文件的内容。FileIn
11、putStreamFileInputStream类和类和FileOutputStreamFileOutputStream类的构造类的构造方法见教材表方法见教材表10.310.3和和10.410.4。见例见例10.1和和10.2在程序中创建一个文本文件,从键盘输入一串字符,读取该文件的在程序中创建一个文本文件,从键盘输入一串字符,读取该文件的内容显示在屏幕上面。内容显示在屏幕上面。/filename:App10_1.java 利用输入输出流读写文本文件import java.io.*;class App10_1 public static void main(String args)FileIn
12、putStream fin;FileOutputStream fout;char ch;int data;try fin=new FileInputStream(FileDescriptor.in);fout=new FileOutputStream(d:cgjmyfile.txt);System.out.println(请输入一串字符,并以#结束:);while(ch=(char)fin.read()!=#)fout.write(ch);fin.close();fout.close();System.out.println();fin=new FileInputStream(d:cgjmyf
13、ile.txt);fout=new FileOutputStream(FileDescriptor.out);while(fin.available()0)data=fin.read();fout.write(data);fin.close();fout.close();catch(FileNotFoundException e)System.out.println(文件没找到!);catch(IOException e)11用用FileInputStream、FileOutputStream来实现对二进制图来实现对二进制图像文件的复制。像文件的复制。/filename:App10_2.jav
14、a 读写二进制文件import java.io.*;public class App10_2 public static void main(String args)throws IOException FileInputStream fi=new FileInputStream(d:cgj风景.jpg);FileOutputStream fo=new FileOutputStream(d:cgj风景1.jpg);System.out.println(文件的大小=+fi.available();byte b=new bytefi.available();fi.read(b);fo.write(
15、b);System.out.println(文件已被拷贝并被更名);fi.close();fo.close();121310.2.2 输入输出流的应用输入输出流的应用顺序输入流顺序输入流(SequenceInputStream)它它是是InputStreamInputStream的直接子类,其功能是将多个输的直接子类,其功能是将多个输入流顺序连接在一起,形成单一的输入数据流,入流顺序连接在一起,形成单一的输入数据流,没有对应的输出数据流存在。没有对应的输出数据流存在。管道输入输出流管道输入输出流 它它提供了利用管道方式进行数据输入输出管理的提供了利用管道方式进行数据输入输出管理的类。管道流用来
16、将一个程序或线程的输出连接到类。管道流用来将一个程序或线程的输出连接到另外一个程序或线程作为输入,使得相连线程能另外一个程序或线程作为输入,使得相连线程能够通过够通过PipedInputStreamPipedInputStream和和PipedOutputStreamPipedOutputStream类类进行数据交换,从而可以实现程序内部线程间的进行数据交换,从而可以实现程序内部线程间的通信或不同程序间的通信。通信或不同程序间的通信。10.2.2 输入输出流的应用输入输出流的应用过滤输入输出流过滤输入输出流 过滤输入流类过滤输入流类FilterInputStreamFilterInputStr
17、eam和过滤输出流类和过滤输出流类FilterOutputStreamFilterOutputStream,分别实现了在数据的读、写,分别实现了在数据的读、写操作的同时进行数据处理,它们是操作的同时进行数据处理,它们是InputStreamInputStream和和OutputStreamOutputStream类的直接子类。类的直接子类。标准输入输出 JavaJava系统事先在系统事先在SystemSystem类中定义了静态流对象类中定义了静态流对象 System.inSystem.in对应于输入流,通常指键盘输入设备;对应于输入流,通常指键盘输入设备;System.outSystem.ou
18、t对应于输出流,通常指显示器;对应于输出流,通常指显示器;System.errSystem.err对应于标准错误输出设备。对应于标准错误输出设备。14见例见例10.4从键盘输入一串字符并显示在屏幕上,且显示System.in和System.out所属的类。/filename:App10_4.java 数据流的应用import java.io.*;public class App10_4 public static void main(String args)try byte b=new byte128;System.out.print(请输入字符:);int count=System.in.r
19、ead(b);System.out.println(输入的是:);for(int i=0;icount;i+)System.out.print(bi+);System.out.println();for(int i=0;icount-2;i+)System.out.print(char)bi+);System.out.println();System.out.println(输入的字符个数为+count);Class InClass=System.in.getClass();Class OutClass=System.out.getClass();System.out.println(in所在
20、的类是:+InClass.toString();System.out.println(out所在的类是:+OutClass.toString();catch(IOException e)1510.3 使用使用Reader和和Writer流类流类虽然虽然ReaderReader和和WriteWrite类可用来处理字符串类可用来处理字符串的读取和写入的操作,但通常我们并不的读取和写入的操作,但通常我们并不直接使用这两个类,而是使用它们的子直接使用这两个类,而是使用它们的子类来创建对象,再利用对象来处理读写类来创建对象,再利用对象来处理读写操作操作1610.3.1使用使用FileReader类读取文
21、件类读取文件在使用在使用FileReaderFileReader类读取文件时,必须先类读取文件时,必须先调用调用FileReader()FileReader()构造方法创建构造方法创建FileReaderFileReader类的对象,再利用它来调用类的对象,再利用它来调用read()read()方法,方法,FileReader()FileReader()构造方法见教构造方法见教材表材表10.1310.13。17见例见例10.5利用FileReader类读取D:java文件夹下的文本文件test.txt。18/filename:App10_5.java FileReader类的使用import
22、java.io.*;public class App10_5 public static void main(String args)throws IOException char c=new char500;FileReader fr=new FileReader(d:javatest.txt);int num=fr.read(c);String str=new String(c,0,num);System.out.println(读取的字符个数为:+num+,其内容如下:);System.out.println(str);fr.close();10.3.2 使用使用FileWriter类写
23、入文件类写入文件FileWriterFileWriter类继承自类继承自OutputStreamWriterOutputStreamWriter类,而类,而OutputStreamWriterOutputStreamWriter类又继承自类又继承自WriterWriter类,因此类,因此WriterWriter类与类与OutputStreamWriterOutputStreamWriter类所提供的方法均可类所提供的方法均可供供FileWriterFileWriter类所创建的对象使用。类所创建的对象使用。19见例见例10.6利用FileWriter类将字符数组与字符串写到文件中20/file
24、name:App10_6.java FileWriter类的使用import java.io.*;public class App10_6 public static void main(String args)throws IOException FileWriter fw=new FileWriter(d:javatest.txt);char c=H,e,l,l,o,r,n;String str=欢迎使用Java!;fw.write(c);fw.write(str);fw.close();10.3.3 使用使用BufferedReader类读取文件类读取文件BufferedReaderBu
25、fferedReader类继承自类继承自ReaderReader类,类,BufferedReaderBufferedReader类是用来读取缓冲区里的类是用来读取缓冲区里的数据。使用数据。使用BufferedReaderBufferedReader类来读取缓冲类来读取缓冲区中的数据之前,必须先创建区中的数据之前,必须先创建FileReaderFileReader类对象,再以该对象为参数来创建类对象,再以该对象为参数来创建BufferedReaderBufferedReader类的对象,然后才可以利类的对象,然后才可以利用此对象来读取缓冲区中的数据。用此对象来读取缓冲区中的数据。21见例见例10
26、.7利用字符输入流类利用字符输入流类BufferedReader读取文本文件读取文本文件/filename:App10_7.java BufferedReader类的使用import java.io.*;public class App10_7 public static void main(String args)throws IOException String thisLine;int count=0;try FileReader fr=new FileReader(d:javatest.txt);BufferedReader bfr=new BufferedReader(fr);whi
27、le(thisLine=bfr.readLine()!=null)count+;System.out.println(thisLine);System.out.println(共读取了+count+行);bfr.close();catch(IOException ioe)System.out.println(错误!+ioe);2210.3.4 使用使用BufferedWriter类类写入文件写入文件使用使用BufferedWriterBufferedWriter类将数据写入缓冲区类将数据写入缓冲区的过程与使用的过程与使用BufferedReaderBufferedReader类从缓冲区类从缓冲
28、区里读出数据的过程相似。首先必须先创建里读出数据的过程相似。首先必须先创建FileWriterFileWriter类对象,再以该对象为参数来类对象,再以该对象为参数来创建创建BufferedWriterBufferedWriter类的对象,然后就可类的对象,然后就可以利用此对象来将数据写入缓冲区中。所以利用此对象来将数据写入缓冲区中。所不同的是,缓冲区内的数据最后必须要用不同的是,缓冲区内的数据最后必须要用flush()flush()方法将缓冲区清空,也就是将缓冲方法将缓冲区清空,也就是将缓冲区中的数据全部写到文件内。区中的数据全部写到文件内。23见例见例10.8利用缓冲区输入输出流进行文件复
29、制/filename:App10_8.java import java.io.*;public class App10_8 public static void main(String args)throws IOException String str=new String();try BufferedReader in=new BufferedReader(new FileReader(d:javatest.txt);BufferedWriter out=new BufferedWriter(new FileWriter(d:javatest1.txt);while(str=in.read
30、Line()!=null)System.out.println(str);out.write(str);out.newLine();out.flush();in.close();out.close();catch(IOException ioe)System.out.println(错误!+ioe);2410.4 文件的处理与随机访问文件的处理与随机访问在在java.iojava.io包中定义了一个包中定义了一个FileFile类专门用来管类专门用来管理磁盘文件和文件夹,而不负责数据的输入输理磁盘文件和文件夹,而不负责数据的输入输出。出。每个每个FileFile类对象表示一个磁盘文件或文件夹,
31、类对象表示一个磁盘文件或文件夹,其对象属性中包含了文件或文件夹的相关信息,其对象属性中包含了文件或文件夹的相关信息,如文件名、长度、所含文件个数等,调用它的如文件名、长度、所含文件个数等,调用它的方法可以完成对文件或文件夹的管理操作,如方法可以完成对文件或文件夹的管理操作,如创建、删除等。创建、删除等。JavaJava语言中还定义了一个功能更强大,使用更语言中还定义了一个功能更强大,使用更方便的类方便的类RandomAccessFileRandomAccessFile,它可以实现对文,它可以实现对文件的随机读写。件的随机读写。该该类也是在类也是在java.iojava.io包中定义包中定义的的。25