Java程序设计——第8章流处理第8章文件和流I/O流概述文件及文件字节流处理文件字符流的处理过滤流对象的序列化其他常用的流学习目标Java.io包中流的分类会读写文件理解和会使用过滤流使用对象流保存对象的状态8.1I/O流概述Java输入/输出流的功能读写外存文件读写缓冲网络数据通信多线程间的通信Java把这些不同类型的输入、输出源抽象为流(stream),统一处理输入流输出流流的划分按数据流的读写方向不同,分为:输入流输出流按流的数据单位不同,分为字节流(InputStream/OutputStream)字符流(Reader/Writer)按流建立方式,分为节点流过滤流8.1.1I/O流的层次ObjectRandomAccessFileInputStreamOutputStreamSequenceInputStreamStringBufferInputStreamFilterInputStreamByteArrayInputStreamPipedInputStreamFileInputStreamDataInputStreamPushbackInputStreamLineNumberInputStreamBufferedInputStreamFilterOutputStreamByteArrayOutputStreamPipedOutputStreamFileOutputStreamPrintStreamBufferedOutputStreamDataOutputStream2.字符流(Reader/Writer)FilterReaderPipedReaderStringReaderInputStreamReaderCharArrayReaderBufferedReaderPushbackReaderFileReaderLineNumberReaderReaderFilterWriterPipedWriterStringWriterOutputStreamWriterCharArrayWriterBufferedWriterFileWriterWriterFilterWriter分类字节输入流字节输出流字符输入流字符输出流抽象基类InputStreamOutputStreamReaderWriter访问文件FileInputStreamFileOutputStreamFileReaderFileWriter访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter访问字符串StringReaderStringWriter缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter转换流InputStreamReaderOutputStreamWriter对象流ObjectInputStreamObjectOutputStream打印流PrintStreamPrintWriter特殊流DataInputStreamDataOutputStream8.2文件处理I/O处理中,最常见的是对文件的操作,java.io包中有关文件处理的类有:File、FileInputStream、FileOutputStream、FileReader、FileWriter、RamdomAccessFile等File类用来描述文件对象的属性,不用来进行文件的读/写操作它既可以表示文件,也可以表示目录使用它提供的方法,我们可以得到所指对象的描述信息,包括名称、存在否、读/写权限、路径等等。8.2.1File文件类注意:当我们在Windows环境使用路径时,其分隔符不能是单一的“\”符号,因为符号“\”已经被转意了。例如:c:\jbuilder3\java\bin(×)c:\\jbilder3\\java\\bin(√)publicFile(Stringpath);publicFile(Stringpath,Stringname)publicFile(Filedir,Stringname);StringgetName();StringgetPath();StringgetAbsolutePath();StringgetParent();StringrenameTo(FilenewName);File类常用方法:◇文件属性相关方法booleanexists();booleancanWrite();booleancanRead();booleanisFile();booleanisDirectory();longlastModified();longlength();booleandelete();booleancreateNewFile()booleanmkdir();String[]list();String[]list(FilenameFilterfilter)P189【例8-1】读取文件夹中所有java源文件构造方法:FileInputStream(Filefile)FileInputStream(Stringname)FileOutputStream(Filefile)FileOutputStream(Filefile,booleanappend)FileOutputStream(Stringname)FileOutputStream(Stringname,booleanappend)FileInputStream和FileOutputStream1.FileInputStream◇从字节流中读取数据:intread();intread(byteb[]);intread(byteb[],intoff,intlen);intavailable();longskip(longn);close();◇使用字节输入流中的标记:booleanmarkSupported();voidmark(intreadlimit);voidreset();//把读指针重新指向用mark方法所记录的位置P189【例8-2】顺序读取文本文件并输出2.FileOutputStream◇往字节输出流中写入数据:voidwrite(intb);voidwrite(byteb[]);voidwrite(byteb[],intoff,intlen);voidflush();voidclose();try{FileInputStreamfis=newFileInputStream(D:\\text.txt);FileOutputStreamfos=newFileOutputStream(“D:\\text2.txt”);//输出流System.out.print(contentoftextis:);intb;while((b=fis.read())!=-1){System.out.print((char)b);fos.write(b);//写入}fis.close();fos.close();}catch(Exceptione){System.out.println(e);}8.4字符流的处理汉字在文件中占用两个字节,如果使用字节流,读取不当会出现乱码。Java中提供了处理以16位的Unicode码表示的字符流的类,即以Reader和Writer为基类派生出的一系列类。Reader和WriterReader和Writer这两个类是抽象类,只是提供了一系列用于字符流处理的接口,可通过使用由它们派生出来的子类对象来处理字符流。FileReader和FileWriter主要用来处理文件字符流构造方法FileReader(Filefile)FileReader(StringfileName)FileWriter(Filefile)FileWriter(StringfileName)FileWriter(StringfileName,booleanappend)1.FileReader和FileWriter1.FileReader类◇读取字符publicintread()throwsIOException;publicintread(charcbuf[])publicintread(charcbuf[],intoff,intlen)◇关闭流publicabstractvoidclose()2.FileWriter类向输出流写入字符publicvoidwrite(intc)publicvoidwrite(charcbuf[])publicabstractvoidwrite(charcbuf[],intoff,intlen)publicvoidwrite(Stringstr)publicvoidwrite(Stringstr,intoff,intlen)◇flush()输出所有被缓存的字节。◇关闭流publicabstractvoidclose()try{FileReaderfis=newFileReader(D:\\text.txt);FileWriterfos=newFileWriter(“D:\\text2.txt”);System.out.print(contentoftextis:);intb;while((b=fis.read())!=-1){System.out.print((char)b);fos.write(b);}fis.close();fos.close();}catch(Exceptione){System.out.println(e);}8.2.3随机访问文件InputStream和OutputStream是顺序访问流,即只能对文件进行顺序地读/写。RandomAccessFile随机访问文件允许对文件内容进行随机读/写。RandomAccessFile类创建的流可以从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。RandomAccessFile类既不是InputStream的子类,也不是OutputStream的子类。RandomAccessFile介绍◇构造方法:RandomAccessFile(Stringname,Stringmode);参数mode是打开方式,r表示只读,rw表示可读写。RandomAccessFile(Filefile,Stringmode);◇文件流指针的操作intread()write(intb)Intread(byte[]b)write(byte[]b)stringreadLine()booleanreadBoolean()writeBoolean()intreadInt()writeInt(intv)floatreadFloat()writeFloat(floatf)charreadChar()writeChar(charc)writeChars(Strings)voidseek(longpos);longgetLength();intskipBytes(intn);P191【例8-3】使用RandomAccessFile读写整形数据8.4.2InputStreamReader和OutputStreamWriterJava.io包中用于将字节流转化为字符流◇生成流对象publicInputStreamReader(InputStreamin);publicOutputStreamWriter(OutputStreamout);publicOutputStreamWriter(OutputStreamout,