第10章Java数据流主讲:程细柱韶关学院计算机科学学院第10章Java数据流输入输出过程涉及到计算机的内存和外设,所谓输入输出就是内存与外设之间数据传输的过程。输入输出都是相对于计算机内存来说的,将数据从外设传递给内存称为输入,数据由内存传递到外设称为输出。在Java中,把这些不同类型的输入、输出源抽象为流(Stream)。而其中输入或输出的数据则称为数据流(DataStream),用统一的接口来表示。10.1数据流的基本概念数据流是指一组有顺序的、有起点和终点的字节集合。从数据流中读取数据时,必须有一个数据源与该数据流相连。数据的类型不同,所以数据流可划分为不同的集合。根据数据的特点,集合又划分为各个子集,从而形成层次关系,输入数据流只能读不能写,而输出数据流只能写不能读。10.1.1输入数据流输入数据流(InputStream)只能读不能写的数据流,用于从外设向计算机内存传递数据。java.io包的输入数据流由抽象类InputStream继承而来,并且实现了其中所有方法。从数据流中读取数据时,必须有一个数据源与该数据流相连。输入数据流中提供了read()方法,用来读取数据,所读取的数据都默认为字节类型。当结束对一个数据流的操作时应该将其关闭,同时释放与该数据流相关的资源,用到的方法即是close()。建议程序中显式关闭输入输出流。10.1.2输出数据流输出数据流(OutputStream)只能写不能读的流,用于从计算机内存向外设输出数据。write()系列方法是输出的主要方法,方法的使用方式和所带的参数与read()方法非常类似。当结束对输出数据流的操作时也应该使用close()方法将其关闭。10.2基本字节数据流类10.2.1文件数据流文件输入输出数据流有:FileInputStream、FileOutputStream,这两个类用来进行文件的I/O处理,其数据源都是外存中的文件。例10-1建立数据源和数据终点FileInputStreaminputfile=newFileInputStream(myInputFile.txt);FileOutputStreamoutfile=newFileOutputStream(myOutputFile.txt);10.2.1文件数据流(续)例10-2将数据写入文件FileOutputStreamout=newFileOutputStream(myOutputFile.txt);out.write('H');out.write(69);out.write(76);out.write('L');out.write('O');out.write('!');out.close();//文件myOutputFile.txt中会保存字符串HELLO!。程序10-1I/O操作示例。p194packagep10_1_fileoutputstreamtest;importjava.io.*;publicclassFileOutputStreamTest{publicstaticvoidmain(Stringargs[]){try{FileOutputStreaminputoutput=newFileOutputStream(myNameCardFile.txt);inputoutput.write('C');inputoutput.write(69);inputoutput.write(76);inputoutput.write('L');inputoutput.write('O');inputoutput.write('!');inputoutput.close();}catch(FileNotFoundExceptione){System.out.println(Error:Cannotopenfileforwriting.);}catch(IOExceptione){System.out.println(Error:Cannotwritetofile.);}try{FileInputStreaminputoutput=newFileInputStream(myNameCardFile.txt);InputStreamReaderdis=newInputStreamReader(inputoutput);BufferedReaderreader=newBufferedReader(dis);Strings;while((s=reader.readLine())!=null)System.out.println(s+);inputoutput.close();}catch(FileNotFoundExceptione){System.out.println(Error:Cannotopenfileforreading.);}catch(EOFExceptione){System.out.println(Error:EOFencountered,filemaybecorrupted.);}catch(IOExceptione){System.out.println(Error:Cannotreadfromfile.);}}}10.2.2过滤器数据流基本数据输入输出操作只能提供对字节或字符的处理,当需要处理其他类型时,例如整数、浮点数或字符串时,需要使用一个过滤器类来包装输入流。过滤器流在创建时与一个已经存在的数据流相连,这样在从这样的数据流中读取数据时,它提供的是对一个原始输入数据流的内容进行了特定处理的数据。过滤器数据流包括:缓冲区数据流、数据流等。缓冲区数据流有BufferedInputStream和BufferedOutputStream,它们是在数据流上增加了一个缓冲区。当读写数据时,数据以块为单位先进入缓冲区(块的大小可以进行设置),其后的读写操作则作用于缓冲区。缓冲区数据流示例例10-3缓冲区数据流示例使用默认的缓冲区大小:FileInputStreamfis1=newFileInputStream(myFile);//基本输入数据流InputStreamis=newBufferedInputStream(fis1);//缓冲区输入数据流FileOutputStreamfos1=newFileOutputStream(myFile);//基本输出数据流OutputStreamos=newBufferedOutputStream(fos1);//缓冲区输出数据流缓冲区数据流示例FileInputStreamfis2=newFileInputStream(myFile);InputStreamis=newBufferedInputStream(fis2,1024);//设定缓冲区大小FileOutputStreamfos2=newFileOutputStream(myFile);OutputStreamos=newBufferedOutputStream(fos2,1024);//设定缓冲区大小因为使用了缓冲区,所以在关闭缓冲区输出流之前,需要使用flush()方法,强制输出缓冲区中未来得及写入文件的数据,保证数据的完整性。10.3基本字符流Java的输入输出类InputStreamReader和OutputStreamWriter专门用于处理字符流。例10-4读者、写者的构造方法InputStreamReader(InputStreamin);//默认规范InputStreamReader(InputStreamin,Stringenc);//指定规范encOutputStreamWriter(OutputStreamout);//默认规范OutputStreamWriter(OutputStreamout,Stringenc);//指定规范enc另外还有BufferedReader和BufferedWriter类缓冲区读者写者示例在使用缓冲区数据流时,都要记住在BufferedWriter中使用flush()方法,以强制清空缓冲区中的剩余内容,防止数据丢失。见程序10-2:importjava.io.*;classFileToUnicode{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream(“file1.txt);InputStreamReaderdis=newInputStreamReader(fis);BufferedReaderreader=newBufferedReader(dis);Strings;intcount=1;//记行数缓冲区读者写者示例while((s=reader.readLine())!=null){System.out.println(Line+count+:+s);count++;}dis.close();}catch(IOExceptione){System.out.println(e);}}//main()}//class//程序10-2中,每从文件“file1.txt”中读出一行,就将其显示出来,并在行首加上字符串“Line”及行号。程序10-3完善程序8-8。//p197当单击“确定”按钮时,将文本区的内容保存在文件中,源代码见如下TXT文件:p10_3_swingcomponentdemo.txt运行结果如下:10.4文件的处理10.4.1File类要创建一个新的File对象可以使用以下三种构造方法:第一种方法:FilemyFile=newFile(“文件名);第二种方法:myFile=newFile(“目录”,“文件名);第三种方法:FilemyDir=newFile(“目录);myFile=newFle(myDir,“文件名);创建File类的对象后,可以获取其文件信息。程序10-4文件操作示例。//p201packagep10_4_usefile;importjava.io.*;publicclassUseFile{publicstaticvoidmain(String[]args){Filef=newFile(test/test.txt);System.out.println(Thefileisexists?--+f.exists());System.out.println(Thefilecanwrite?--+f.canWrite());System.out.println(Thefilecanread?--+f.canRead());System.out.println(Thefileisafile?--+f.isFile());System.out.println(Thefileisadirectory?--+f.isDirectory());System.out.println(Thefileisabsolutepath?--+f.isAbsolute());System.out.println(Thefile'snameis?--+f.getName());System.out.println(Thefile'spathis?--+f.getPath());System.out.println(Thefile'sabsolutepathis?--+f.getAbsolutePath());System.out.println(Thefile'sparentpathis?--+f.getParent());System.out.println(Thefile'slastmodiferedtimeis?--+f.lastModified());System.out.println(Thefile'slengthis?--+f.length());Filenewfile=newFile(test/newFile.txt);f