第13章I/O流熟练使用File类的常用方法;理解流,及其层次结构;能熟练使用字节流和字符流类对文件进行读写操作。31.1File类Filef=newFile(my.txt);f.createNewFile();f.mkdir();Filef=newFile(F:\\myjavaclass8\\1.txt);f.createNewFile();FilefDir=newFile(File.separator+myjavaclass8);StringstrFile=File.separator+“1.txt;Filef=newFile(fDir,strFile);f.createNewFile();File[]arrFile=f.listFiles();File[]arrFile=f.listFiles(newTest());publicbooleanaccept(Filedir,Stringname){returnname.indexOf(.java)!=-1;}13.2流的概念流是程序和外界进行数据交换的通道;它是一种抽象观念,如从键盘输入数据、将结果输出到显示器、打开与保存文件等操作皆视为流的处理。我们可通过它来读写数据,甚至可以通过它连接数据来源(datasource),并可以将数据保存。使用流的好处是:能非常灵活地在文件中保存数据或从文件中读取数据。stream(流)流是指一连串流动的数据信号,是以先进先出的方式发送和接收数据的通道。‘A’‘B’‘C’‘D’‘E’‘F’InputStream来自数据源的数据流OutputStream流向目的地的数据流流(续)13.3流相关类的层次结构Java有一套完整的输入/输出类层次结构,它们是建立在4个抽象类的基础上的;Java中的流主要有字节流和字符流。流的类型根据流动方向的不同,流分为输入流和输出流;对于输入和输出流,由于传输格式的不同,又分为字节流和字符流:字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。字节输入输出流层次InputStreamStringBufferInputStreamFileInputStreamByteArrayInputStreamFilterInputStreamObjectInputStreamPipedInputStreamSequenceInputStreamLineNumberInputStreamDataInputStreamBufferedInputStreamPushbackInputStreamOutputStreamFileOutputStreamByteArrayOutputStreamFilterOutputStreamObjectOutputStreamPipedOutputStreamPrintStreamDataOutputStreamBufferedOutputStream字符输入输出流层次ReaderBufferedReaderCharArrayReaderFilterReaderPipedReaderStringReaderFileReaderLineNumberReaderPushbackReaderInputStreamReaderWriterBufferedWriterCharArrayWriterFilterWriterPipedWriterPrintWriterFileWriterOutputStreamWriterStringWriter13.4字节流不管是输入流还是输出流,用完以后都必须关闭,且应放在finally子句中;读写操作都会抛异常,必须进行处理;汉字最好用字符流操作。13.4.3文件输入/输出流importjava.io.*;classStreamTest{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfis=newFileInputStream(1.txt);byte[]buf=newbyte[1024];intlen=fis.read(buf);System.out.println(newString(buf,0,len));fis.close();FileOutputStreamfos=newFileOutputStream(1.txt);fos.write(aaj;akajaa;pvzoi.getBytes());fos.close();}}其构造方法参数中的字符串可以是路径也可以是文件名13.4.5连接字节输入流importjava.io.*;publicclassSequenceTest{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfis1=newFileInputStream(1.txt);FileInputStreamfis2=newFileInputStream(2.txt);SequenceInputStreamsis=newSequenceInputStream(fis2,fis1);byte[]buf=newbyte[1024];intlen1=sis.read(buf);intlen2=sis.read(buf,len1,1024-len1);System.out.println(newString(buf,0,len1+len2));sis.close();}}当有多个流连接在一起时,关闭最外层流就可以了13.4.6过滤字节流它本身不是流,是一种用于扩展底层流功能的装饰器,它的子类,分别用来扩展字节流的某一种功能;它必须先创建对应字节流对象,再以它为参数来创建过滤字节流类的象,然后利用此对象扩展字节流的功能,就像把字节流包覆于其中;关闭文件时,一般只关闭外层流即可。13.4.6.1缓冲输入/输出流BufferedInputStream的特点是:不断的从底层流中读取数据,可以减少I/O请求次数,提高效率;BufferedInputStream的特点是:先将数据写到缓冲里,缓冲满后再一次性写入,可以减少I/O请求次数,提高效率;一般在关闭前调用flush方法,将数据强制写入。importjava.io.*;classStreamTest{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfis=newFileInputStream(1.txt);BufferedInputStreambis=newBufferedInputStream(fis);byte[]buf=newbyte[1024];intlen=bis.read(buf);System.out.println(newString(buf,0,100));bis.close();FileOutputStreamfos=newFileOutputStream(1.txt);BufferedOutputStreambos=newBufferedOutputStream(fos);bos.write(aaj;akajaa;pvzoi.getBytes());bos.flush();bos.close();}}13.4.6.2格式化输出流PrintStream类的特点是:可以直接写基本数据类型和字符串;可指定自动刷新缓存;方法不会抛出异常标准类库中System等类都使用了它;importjava.io.*;classStreamTest{publicstaticvoidmain(String[]args)throwsIOException{FileOutputStreamfos=newFileOutputStream(1.txt);BufferedOutputStreambos=newBufferedOutputStream(fos);PrintStreamps=newPrintStream(fos,true);ps.print(aaj;akajaa;pvzoi);ps.close();}}13.4.6.3数据输入/输出流DataInput接口抽象出来的行为是:从二进制流中读取字节,并根据Java基本数据类型进行重构;DataOutput接口抽象出来的行为是:将数据从任意Java基本数据类型转换为一系列字节,并将这些字节写入字节流;DataInputStream和DataOutputStream分别实现了这两个接口;DataOutputStream的特点是:可以写基本数据类型;DataInputStream的特点是:可以读基本数据类型,读时文件到尾不会返回-1,而是抛出异常;因此,这两种流通常成对使用,否则容易发生异常;用这两种流时,读写的顺序应相同,否则读出的数据不对。importjava.io.*;classStreamTest{publicstaticvoidmain(String[]args)throwsIOException{FileOutputStreamfos=newFileOutputStream(1.txt);BufferedOutputStreambos=newBufferedOutputStream(fos);DataOutputStreamdos=newDataOutputStream(bos);byteb=3;inti=78;charch='a';floatf=4.5f;dos.writeByte(b);dos.writeInt(i);dos.writeChar(ch);dos.writeFloat(f);dos.flush();dos.close();FileInputStreamfis=newFileInputStream(1.txt);BufferedInputStreambis=newBufferedInputStream(fis);DataInputStreamdis=newDataInputStream(bis);System.out.println(dis.readByte());System.out.println(dis.readInt());System.out.println(dis.readChar());System.out.println(dis.readFloat());dis.close();}}13.4.6.11自定义流importjava.io.*;classMyOutputStreamextendsFilterOutputStream{MyOutputStream(OutputStreamout){super(out);}publicvoidwrite(intx)throwsIOException{super.write(x+10);}}自定义输出流时,一般只覆盖一个write方法:write(intx),因为在内部,别的write方法都调用它;注意:方法要抛出异常importjava.io.*;classMyInputStreamextendsFilterInputStream{MyInputStream(InputStreamin){super(in);}publicintread()throwsIOException{intx=super.read();return((x==-1)?-1:(x-10));}publicintread(byte[]b,intoffset,intl