第9章输入输出流File类FileInputStream类FileOutputStream类FileReader类和FileWriter类使用文件对话框打开和保存文件RandomAccessFile类数据流数组流象流序列化与对象克隆文件锁FileLockProcess类中的流带进度条的输入流9.1I/OStreamJava的I/O流库提供大量的流类(在包java.io中)所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类流的不同层次流被组织成不同的层次。最粗略的,数据流可以分为输入流(inputstream)和输出流(outputstream)。输入流只能读不能写,而输出流只能写不能读File字节流和字符流字节流InputStream&OutputStream字节流用来读写8位的数据。由于在读写中不会对数据作任何转换,所以可以用来直接处理二进制的数据。字节流分为输入流InputStream和输出流OutputStream,所有其他的字节流都是它们的子类。字符流reader&writer字符流以16位的Unicode码表示的字符为基本处理单位。包括两个抽象类Reader和Writer。Reader和Writer使用的是Unicode,可以对不同格式的流进行操作,提供国际化的支持。从Reader和Writer派生出的子类的对象都能对Unicode字符流进行操作,由这些对象来实现与外设的连接。File类File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作构造方法有3个(创建File类对象)File(Stringfilename);File(StringdirectoryPath,Stringfilename);File(Filef,Stringfilename);File类获取文件或目录的属性获取文件或目录的属性publicbooleanexists();//判断文件或目录是否存在publicbooleanisFile();//判断是否文件publicbooleanisDirectory();//判断是否目录publicStringgetName();//返回文件名或目录名publicStringgetPath();//返回文件或目录的路径publiclonglength();//返回文件的字节数publicbooleancanRead();//可读文件则返回truepublicbooleancanWrite();publicString[]list();//将目录中的所有文件名保存publicbooleanequals(Filef);//两File对象相同返回truepubliclonglastModified();//返回文件最后修改日期File类对文件或目录的操作对文件或目录的操作publicbooleanrenameTo(FilenewFile);publicvoiddelete();//删除当前文件publicbooleanmkdir();//创建当前目录的子目录publicStringgetParent();//返回文件的父目录File类的使用,详见java.io.File例子9.1输入/输出流的分类java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)按处理数据单位不同可以分为字节流和字符流。按照功能不同可以分为节点流和处理流。JSDK所提供的所有流类型位于包java.io内都分别继承自四种抽象流类型。节点流和处理流节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存)处理流(也称过滤流、包装流、缓冲流)是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。数据源程序节点流数据目节点流数据目数据源程序处理流处理流节点流类型类型字符流字节流File(文件)FileReaderFileWriterFileInputStreamFileOutputStreamMemoryArrayCharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStreamMemoryStringStringReaderStringWriter-Pipe(管道)PipedReaderPipedWriterPipedInputStreamPipedOutputStream处理流类型处理类型字符流字节流BufferingBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStreamFilteringFilterReaderFilterWriterFilterInputStreamFilterOutputStreamConvertingbetweenbytesandcharacterInputStreamReaderOutputStreamWriterObjectSerialization-ObjectInputStreamObjectOutputStreamDataconversion-DataInputStreamDataOutputStreamCountingLineNumberReaderLineNumberInputStreamPrintingPrintWriterPrintStreamPeekingaheadPusbackReaderPushbackInputStreamInputStream继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。InputStream方法intread()从输入流中读一个字节的二进制数据,然后以此数据为低位字节,配上一个全零字节,形成一个0~255之间的整数返回。它是一个抽象方法,需要在子类中具体实现。读取结束时,它会得到-1intread(byte[]b[])将多个字节读到数组中,填满整个数组intread(byte[]b[],intoff,intlen)从输入流中读取长度为len的数据,从数组b中索引为off的位置开始放置读入的数据,读毕返回读取的字节数voidclose()数据流关闭,同时释放与该数据流相关的资源也可以由运行时系统自动关闭InputStream方法intavailable()返回目前可以从数据流中读取的字节数(实际的读操作所读得的字节数可能大于该返回值)longskip(longl)跳过数据流中指定数量的字节不读,返回值表示实际跳过的字节数voidmark(intmarkarea)标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小voidreset()执行完read()操作后,调用方法reset()将回到输入数据流中被标记的位置OutputStream继承自OutputSteam的流是用于程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。OutputStream的基本方法voidwrite(intb)throwsIOException向输出流中写入一个字节数据,该字节数据为参数b的低8位voidwrite(byte[]b)throwsIOException将一个字节类型的数组中的数据写入输出流voidwrite(byte[]b,intoff,intlen)throwsIOException将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流。voidclose()throwsIOException关闭流释放内存资源voidflush()throwsIOException将输出流中缓冲的数据全部写出到目的地良好的编程习惯先flush()再close()字节流举例输出从键盘上输入的字符importjava.io.*;publicclassByteStreamTest{publicstaticvoidmain(Stringargs[]){InputStreamis=System.in;intx;try{System.out.println(输入一个字符:);x=is.read();is.skip(2);System.out.println(x);System.out.println(输入多个字符:);while((x=is.read())!=-1){System.out.println(x);}}catch(Exceptione){}}}Reader继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色的为处理流。Reader的基本方法intread()throwsIOException读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。intread(char[]cbuf)throwsIOException读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1intread(char[]cbuf,intoff,intlen)throwsIOException读取length个字符并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1voidclose()throwsIOException关闭流释放内存资源Writer继承自Writer的流都是用于程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。Writer的基本方法voidwrite(intc)throwsIOException向输出流中写入一个字符数据,该字节数据为参数b的低16位voidwrite(char[]cbuf)throwsIOException将一个字符类型的数组中的数据写入输出流voidwrite(char[]cbuf,intoffset,intlength)throwsIOException将一个字符类型的数组中的从指定位置(offset)开始的length个字符写入到输出流voidwrite(Stringstring)throwsIOException将一个字符串中的字符写入到输出流voidwrite(Stringstring,intoffset,intlength)throwsIOException将一个字符串从offset开始的length个字符写入到输出流voidclose()throwsIOException关闭流释放内存资源voidflush()throwsIOException将输出流中缓冲的数据全部写出到目的地字符流举例输出从键盘上输入的字符序列importjava.io.*;publicclassCharStreamTest{publicstaticvoidmain(Stringargs[]){BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));Stringstr;try{System.out.println(输入一行字符串:);str=br.readLine();System.out.println(str);System.out.println(输入多行字符串:);while(!(str=br.readLine()).e