1、 教学提示:教学提示:从本章开始 ,将介绍Java中较为高级的内容 。本章介绍Java的I/O(输入/输出)系统,主要包括文件的基本操作 , Java 中流的概念及其应用,以及随机访问文件。学习完本章内容后,读者对Java的I/O系统将有一个整体上的认识,并有能力实现一般的输入/输出应用。 教学目标:教学目标:熟悉对文件及目录的基本操作,熟悉Java I/O系统中各个类的作用及它们之间的关系 ,掌握随机访问文件的方法 。通过上机实践,掌握上述内容的综合应用。 对于任何程序设计语言的对于任何程序设计语言的I/O系统来说,在对文件进行读写数据操系统来说,在对文件进行读写数据操作作(不管以何种方式进
2、行不管以何种方式进行)之前,如何找到或定位正确的文件之前,如何找到或定位正确的文件 ( 或目或目录录),如何获取文件,如何获取文件(或目录或目录)的属性信息的属性信息(如是否只读、修改时间如是否只读、修改时间 、文、文件大小等件大小等),如何创建和删除文件,如何创建和删除文件 (或目录或目录 ) ,是首先必须解决的基础,是首先必须解决的基础性问题。对文件性问题。对文件(及目录及目录) 的这些基本操作,是整个的这些基本操作,是整个 I/O 系统的基石。系统的基石。本节就先介绍本节就先介绍Java 提供的用以协助处理文件提供的用以协助处理文件 ( 及目录及目录 ) 相关事务的类相关事务的类File
3、。10.1.1 获取文件名清单获取文件名清单10.1.2 获取文件属性信息获取文件属性信息10.1.3 建立和删除文件建立和删除文件 类类File的名字很容易让人产生误解的名字很容易让人产生误解 ,以为,以为 File 对象代表的就是文对象代表的就是文件,事实上并不只是如此件,事实上并不只是如此 。File对象不仅可以与文件建立关联对象不仅可以与文件建立关联 ,而且,而且可以与目录建立关联,还可以与一组文件或目录建立关联,甚至可以可以与目录建立关联,还可以与一组文件或目录建立关联,甚至可以及一组文件及目录的混合体建立关联及一组文件及目录的混合体建立关联 。如果。如果 File对象与一组文件或目
4、对象与一组文件或目录甚至这两者的混合体相关联,可以使用该对象的录甚至这两者的混合体相关联,可以使用该对象的list()方法获取它们方法获取它们的名称列表。的名称列表。list()方法返回一个方法返回一个 String 数组,每个数组元素为一个文数组,每个数组元素为一个文件或目录的名称。件或目录的名称。 返回 File对象拥有很多获取相关联文件的属性信息的方法,它们的详对象拥有很多获取相关联文件的属性信息的方法,它们的详细介绍见细介绍见表表10.1。返回方方 法法说说 明明boolean canRead()判断关联文件或目录是否可读判断关联文件或目录是否可读boolean canWrite()判
5、断关联文件或目录是否可写判断关联文件或目录是否可写boolean exists()判断关联文件或目录是否存在判断关联文件或目录是否存在String getAbsolutePath()获取关联文件或目录的绝对路径获取关联文件或目录的绝对路径String getCanonicalPath()获取关联文件或目录的规范路径获取关联文件或目录的规范路径String getName()获取关联文件或目录的名字获取关联文件或目录的名字String getParent()获取关联文件或目录的上一级目录名获取关联文件或目录的上一级目录名String getPath()获取关联文件或目录的路径名获取关联文件或目录
6、的路径名boolean isAbsolute()判断关联文件名或目录名是否绝对路径判断关联文件名或目录名是否绝对路径boolean isDirectory()判断所关联的是否目录判断所关联的是否目录boolean isFile()判断所关联的是否文件判断所关联的是否文件boolean isHidden()判断关联文件或目录是否隐藏判断关联文件或目录是否隐藏long lastModified()获取最后修改时间,距获取最后修改时间,距1970年年1月月1日日0:00:00的毫秒数的毫秒数long length()获取关联文件的大小,单位字节,若所关联的是目录,则返回获取关联文件的大小,单位字节,
7、若所关联的是目录,则返回0Boolean setLastModified(long time)修改关联文件或目录的最后修改时间修改关联文件或目录的最后修改时间boolean setReadonly()设置关联文件或目录为只读设置关联文件或目录为只读返回 File对象中关于建立和删除文件对象中关于建立和删除文件(或目录或目录)的方法见的方法见表表10.2。返回方方 法法说说 明明boolean createNewFile()当不存在所关联文件时,新建一个名为该关联当不存在所关联文件时,新建一个名为该关联文件名的空文件文件名的空文件File createTempFile(String prefix
8、,String suffix)在系统默认的临时目录中新建一个空文件,新在系统默认的临时目录中新建一个空文件,新文件的前缀为文件的前缀为prefix,扩展名为,扩展名为suffixFile createTempFile(String prefix,String suffix,File directory)在指定目录中新建一个空文件,新文件名的组在指定目录中新建一个空文件,新文件名的组成同上成同上boolean delete()删除关联文件或目录,不能删除非空的目录删除关联文件或目录,不能删除非空的目录void deleteonExit()在在Java虚拟机终止时删除关联文件或目录虚拟机终止时删除
9、关联文件或目录boolean mkdir()新建一个名为所关联目录的目录新建一个名为所关联目录的目录boolean mkdirs()新建一个名为所关联目录的目录,关联路径中新建一个名为所关联目录的目录,关联路径中并不存在的目录也将创建并不存在的目录也将创建boolean renameTo(File dest)将所关联文件更名至指定将所关联文件更名至指定File对象关联的文件对象关联的文件返回 所谓流,是指任何可以产生数据的数据源,或任何可以接收数据的接所谓流,是指任何可以产生数据的数据源,或任何可以接收数据的接收端,在数据源或接收端与使用流的程序之间的是一个数据序列,其中的收端,在数据源或接收
10、端与使用流的程序之间的是一个数据序列,其中的数据以字节或字符为单位顺序排列数据以字节或字符为单位顺序排列 。 在往流中写入数据的一端观察,这在往流中写入数据的一端观察,这个流即为输出流;相反,在从流中读出数据的一端观察,这个流即为输入个流即为输出流;相反,在从流中读出数据的一端观察,这个流即为输入流。流是有方向性的,不能往一个输入流中写数据,也不能从一个输出流流。流是有方向性的,不能往一个输入流中写数据,也不能从一个输出流中读数据。中读数据。InputStream/OutputStream继承体系中各子类的说明见表继承体系中各子类的说明见表10.3和表和表10.4。FilterInputStr
11、eam和和FilterOutputStream各子类的说明见表各子类的说明见表10.5和表和表10.6。10.3.1 ByteArrayInputStream10.3.2 ByteArrayOutputStream10.3.3 FileInputStream10.3.5 FilterInputStream10.3.4 FileOutputStream10.3.7 SequenceInputStream10.3.6 FilterOutputStream类类 名名功功 能能构造方法参数说明构造方法参数说明ByteArrayInputStream与字节数组关联的输入流与字节数组关联的输入流一个字节数
12、组,作为该输入流的数据源,一个字节数组,作为该输入流的数据源,内部输入缓冲区从其中获取数据内部输入缓冲区从其中获取数据FileInputStream与文件关联的输入流与文件关联的输入流File对象、对象、FileDescriptor对象或文件名,对象或文件名,其代表的文件作为该输入流的数据源,其代表的文件作为该输入流的数据源,该文件必须实际存在该文件必须实际存在FilterInputStream过滤器输入流,拥有多个子类,用过滤器输入流,拥有多个子类,用于指定如何读取数据,详见表于指定如何读取数据,详见表10.5一个输入流,该过滤器输入流从其中获一个输入流,该过滤器输入流从其中获取数据取数据O
13、bjectInputStream对象输入流,在对象串行化应用中对象输入流,在对象串行化应用中用于读取对象信息用于读取对象信息一个输入流,对象输入流从该输入流中一个输入流,对象输入流从该输入流中获取对象信息获取对象信息PipedInputStream管道输入流,在多线程环境中用于管道输入流,在多线程环境中用于线程间的通信线程间的通信另一个线程的管道输出流,另一个线程的管道输出流, 管道输入流管道输入流从中获取数据从中获取数据SequenceInputStream队列输入流,用于汇集多个输入流队列输入流,用于汇集多个输入流一个实现了接口一个实现了接口Enumeration(枚举枚举)的类的类的对象
14、,该对象的运行时类型应该为输的对象,该对象的运行时类型应该为输入流;或者两个输入流,流队列输入流入流;或者两个输入流,流队列输入流依次从中获取数据依次从中获取数据StringBufferInputStream与字符串关联的输入流,不建议使与字符串关联的输入流,不建议使用用一个字符串,作为该输入流的数据源,一个字符串,作为该输入流的数据源,该字符串只有每个字符的低该字符串只有每个字符的低8位有效位有效返回类类 名名功功 能能构造方法参数说明构造方法参数说明ByteArrayOutputStream与字节数组关联的输出流与字节数组关联的输出流无参数,输出缓冲区字节数组大无参数,输出缓冲区字节数组大
15、小不限;或一个整数,作为输出小不限;或一个整数,作为输出缓冲区字节数组的大小缓冲区字节数组的大小FileOutputStream与文件关联的输出流与文件关联的输出流File对象、对象、FileDescriptOr对象或对象或文件名,其代表的文件作为该输文件名,其代表的文件作为该输出流的输出端,该文件是否必须出流的输出端,该文件是否必须可用,视操作系统而定可用,视操作系统而定FilterOutputStream过滤器输出流,拥有多个子过滤器输出流,拥有多个子类,用于指定如何输出数据,类,用于指定如何输出数据,详见表详见表10.6一个输出流,该过滤器输出流向一个输出流,该过滤器输出流向其中写入数据
16、其中写入数据ObjectOutputStream对象输出流,在对象串行化对象输出流,在对象串行化应用中用于输出对象信息应用中用于输出对象信息一个输出流,对象输出流向该输一个输出流,对象输出流向该输出流中写入对象信息出流中写入对象信息PipedOutputStream管道输出流,在多线程环境管道输出流,在多线程环境中用于线程间的通信中用于线程间的通信另一个线程的管道输入流,另一个线程的管道输入流, 管道管道输出流向其中写入数据输出流向其中写入数据返回类类 名名功功 能能构造方法参数说明构造方法参数说明BufferedInputStream拥有一个内部输拥有一个内部输入缓冲区的过滤入缓冲区的过滤器
17、输入流器输入流一个输入流,该过滤一个输入流,该过滤器输入流从其中获取器输入流从其中获取数据;或一个输入流数据;或一个输入流和一个整数,该整数和一个整数,该整数用于指定内部输入缓用于指定内部输入缓冲区的大小冲区的大小DataInputStream按基本数据类型按基本数据类型读取数据的过滤读取数据的过滤器输入流器输入流一个输入流,该过滤一个输入流,该过滤器输入流从其中获取器输入流从其中获取数据数据LineNumberInputStream按行读取数据的按行读取数据的过滤器输入流,过滤器输入流,不建议使用不建议使用一个输入流,该过滤一个输入流,该过滤器输入流从其中获取器输入流从其中获取数据数据Pus
18、hbackInputStream可以将一个字节可以将一个字节数据回送给数据数据回送给数据源的过滤器输入源的过滤器输入流,为编译器提流,为编译器提供的类,编程中供的类,编程中极少用到极少用到一个输入流,该过滤一个输入流,该过滤器输入流从其中获取器输入流从其中获取数据;或一个输入流数据;或一个输入流和一个整数,该整数和一个整数,该整数用于指定回送缓冲区用于指定回送缓冲区的大小的大小返回类类 名名功功 能能构造方法参数说明构造方法参数说明BufferedOutputStream拥有一个内部输出缓冲区拥有一个内部输出缓冲区的过滤器输出流的过滤器输出流一个输出流,该过滤器输出流一个输出流,该过滤器输出流
19、从中获取数据;或一个输出流从中获取数据;或一个输出流和一个整数,该整数用于指定和一个整数,该整数用于指定内部输出缓冲区的大小内部输出缓冲区的大小DataOutputStream按基本数据类型输出数据按基本数据类型输出数据的过滤器输出流的过滤器输出流一个输出流,该过滤器输出流一个输出流,该过滤器输出流向其中写入数据向其中写入数据PrintStream产生格式化输出结果的过产生格式化输出结果的过滤器输出流,用于数据的滤器输出流,用于数据的显示显示一个输出流,该过滤器输出流一个输出流,该过滤器输出流向其中写入数据;或一个输出向其中写入数据;或一个输出流和一个布尔值,该布尔值指流和一个布尔值,该布尔值
20、指定是否自动刷新缓冲区定是否自动刷新缓冲区返回 ByteArrayInputStream对象中有一个字节数组对象中有一个字节数组 (byte) 类型的属性,类型的属性,作为内部缓冲区。类作为内部缓冲区。类ByteArrayInputStream有两个构造方法,一个构造方有两个构造方法,一个构造方法以一个字节数组作为参数,其数据被完全复制给内部缓冲区;另一个构法以一个字节数组作为参数,其数据被完全复制给内部缓冲区;另一个构造方法的参数包括一个字节数组造方法的参数包括一个字节数组 、 一个整型偏移量和一个整型长度,与一个整型偏移量和一个整型长度,与前一个构造方法不同的是,此构造方法生成的内部缓冲区
21、将以指定偏移量前一个构造方法不同的是,此构造方法生成的内部缓冲区将以指定偏移量位置作为起始位置位置作为起始位置 , 并且能读取的最大数据长度为指定长度值。这个字并且能读取的最大数据长度为指定长度值。这个字节数组就是该输入流的数据源节数组就是该输入流的数据源 。内部缓冲区保持一个标记,指向当前字。内部缓冲区保持一个标记,指向当前字节节 。read()方法读取该标记所指字节的数据方法读取该标记所指字节的数据 ,并将该标记向后移一个字,并将该标记向后移一个字节节 ,使下一个字节成为当前字节;通过,使下一个字节成为当前字节;通过mark()方法可以在当前字节处做方法可以在当前字节处做一个记号一个记号
22、,通过,通过 reset()方法可以将该记号所指的字节恢复为当前字节,方法可以将该记号所指的字节恢复为当前字节,缓冲区标记重新指向该字节缓冲区标记重新指向该字节 ;通过;通过 skip() 方法可以使缓冲区标记向后跳方法可以使缓冲区标记向后跳跃。跃。 返回 与与ByteArrayInputStream对应,对应,ByteArrayOutputStream对象中同样对象中同样有一个字节数组类型的属性有一个字节数组类型的属性 ,作为内部缓冲区,作为内部缓冲区 ,同时也是该输出流的接,同时也是该输出流的接收端。类收端。类ByteArrayOutputStream有两个构造方法,一个构造方法没有参有两
23、个构造方法,一个构造方法没有参数数 ,生成的内部缓冲区的初始大小为,生成的内部缓冲区的初始大小为32个字节个字节 , 另一个构造方法有一个另一个构造方法有一个整型参数整型参数 ,生成的内部缓冲区的初始大小即为该整型参数,生成的内部缓冲区的初始大小即为该整型参数 ,内部缓冲区,内部缓冲区大小将随着数据的写入自动更改大小将随着数据的写入自动更改 。 ByteArrayOutputStream 对象通过对象通过write()方法往内部缓冲区中写入数据方法往内部缓冲区中写入数据 ;通过;通过toByteArray() 和和toString() 可可以获取内部缓冲区的所有数据以获取内部缓冲区的所有数据
24、;通过;通过 reset( ) 方法可以清空内部缓冲区数方法可以清空内部缓冲区数据,使数据的写入重新开始;通过据,使数据的写入重新开始;通过 writeTo( ) 方法可以将内部缓冲区的所方法可以将内部缓冲区的所有数据写入另一个输出流中。有数据写入另一个输出流中。 返回 FileInputStream对象的数据源为文件,其构造方法有对象的数据源为文件,其构造方法有3个,一个以文个,一个以文件名为参数,一个以件名为参数,一个以File对象为参数,它们的作用是显然的,只有一点值对象为参数,它们的作用是显然的,只有一点值得注意,若关联的是目录或指定文件不存在得注意,若关联的是目录或指定文件不存在 ,
25、则会产生异常,则会产生异常 。比较特别。比较特别的是以的是以FileDescriptor对象为参数的构造方法。对象为参数的构造方法。FileDescriptor 也是也是 java.io包中的类,用于关联已打开的文件,或已打开的网络链接,或其他包中的类,用于关联已打开的文件,或已打开的网络链接,或其他 I/O连连接,在机器底层发挥作用,可以强制系统缓冲区与底层设备接,在机器底层发挥作用,可以强制系统缓冲区与底层设备 (文件、网络文件、网络连接和其他连接和其他I/O连接都是底层设备连接都是底层设备)保持同步,从而为输入流或输出流提供保持同步,从而为输入流或输出流提供一个与底层设备同步的系统缓冲区
26、。这个类并不常用。一个与底层设备同步的系统缓冲区。这个类并不常用。返回 FileOutputStream对象同对象同FileInputStream一样与文件关联一样与文件关联 ,该文件就是,该文件就是其接收端。写入其接收端。写入FileOutputStream对象中的数据将最终写入其关联文件对象中的数据将最终写入其关联文件 。类。类FileOutputStream的构造方法有的构造方法有4个,其中个,其中 3个分别以关联文件名个分别以关联文件名 、File 对象对象和和FileDescriptor对象为参数,与对象为参数,与FileInputStream 相应的相应的3 个构造方法中的参个构造
27、方法中的参数作用相同,另一个构造方法以关联文件名和一个布尔值为参数数作用相同,另一个构造方法以关联文件名和一个布尔值为参数 ,该布尔值,该布尔值若为若为true ,则往,则往 FileOutputStream 对象中写入的数据将从关联文件的末尾处对象中写入的数据将从关联文件的末尾处开始写入,否则将从关联文件的开头处开始写入开始写入,否则将从关联文件的开头处开始写入 ,这将覆盖原有数据,参数,这将覆盖原有数据,参数只有关联文件名的构造方法,相当于此布尔值为只有关联文件名的构造方法,相当于此布尔值为 false 。关联文件是否有效,。关联文件是否有效,不存在时是否可能被创建,视不同操作系统平台不同
28、可能不同。在某些操作不存在时是否可能被创建,视不同操作系统平台不同可能不同。在某些操作系统平台下,同时只允许一个系统平台下,同时只允许一个 FileOutputStream 对象关联一个以写方式打开对象关联一个以写方式打开的文件。的文件。FileOutputStream 对象的方法比较简单,主要通过对象的方法比较简单,主要通过 write()方法往系方法往系统缓冲区中写入数据,通过统缓冲区中写入数据,通过 flush() 方法把系统缓冲区的数据刷新提交到关联方法把系统缓冲区的数据刷新提交到关联文件中。文件中。 返回 类类FilterInputStream的构造方法是受保护的的构造方法是受保护的
29、(protected),无法直接创,无法直接创建建FilterInputStream对象,本章将直接介绍其子类。由于类对象,本章将直接介绍其子类。由于类LineNumberInputStream已经不建议使用,类已经不建议使用,类PashbackInputStream也极也极少使用,本书将不作介绍。少使用,本书将不作介绍。返回 类类FilterOutputStream的构造方法也是受保护的的构造方法也是受保护的(protected),同样无,同样无法直接创建其对象,本章也将直接介绍其子类。法直接创建其对象,本章也将直接介绍其子类。返回方方 法法说说 明明int available()返回输入流
30、中能获取的数据的字节数返回输入流中能获取的数据的字节数Void close()关闭输入流,释放所有与该输入流相关的系统资源关闭输入流,释放所有与该输入流相关的系统资源boolean markSupported()判断输入流是否支持判断输入流是否支持mark()方法和方法和reset()方法的标记机方法的标记机制制int read()读取输入流当前字节的数据,将下一字节设为当前字节读取输入流当前字节的数据,将下一字节设为当前字节int read(byte b)直接继承自直接继承自InputStream类的方法,从输入流当前字节类的方法,从输入流当前字节处起读取长度等于处起读取长度等于b的长度个字
31、节的数据,保存到的长度个字节的数据,保存到b中,中,返回读取的数据长度,将后第返回读取的数据长度,将后第b.length个字节设为当前个字节设为当前字节字节int read(byte b,int off,int len)从输入流当前字节处起读取长度为从输入流当前字节处起读取长度为len字节的数据,从字节的数据,从位置位置off处起存入数组处起存入数组b中,中,b中位置在中位置在off之前和在之前和在off+len之后的数据将保持不变,返回读取的数据长度,之后的数据将保持不变,返回读取的数据长度,将后第将后第len个字节设为当前字节个字节设为当前字节long skip(long n)使缓冲区标记
32、向后跳跃使缓冲区标记向后跳跃n个字节,返回跳跃步数即个字节,返回跳跃步数即n返回 Reader/Writer继承体系中各类与继承体系中各类与InputStream/OutputStream继承体系中继承体系中相应类的作用基本相同,区别在于前者基于相应类的作用基本相同,区别在于前者基于16位的位的Unicode编码字符进行读取编码字符进行读取和写入操作,这两个继承体系之间的对应关系见和写入操作,这两个继承体系之间的对应关系见表表10.16。10.4.2 CharArrayWriter10.4.1 CharArrayReader10.4.3 InputStreamReader10.4.4 Outp
33、utStreamWriter10.4.5 FileReader10.4.7 StringReader10.4.6 FileWriter10.4.8 StringWriter10.4.9 BufferedReader10.4.10 LineNumberReader10.4.12 PrintWriter10.4.11 BufferedWriterInputStream/OutputStream继承体系继承体系Reader/Writer继承体系继承体系InputStreamReader(通过类通过类InputStreamReader转换转换)OutputStreamWriter(通过类通过类Outp
34、utStreamWriter转换转换)ByteArrayInputStreamCharArrayReaderByteArrayOutputStreamCharArrayWriterInputStream/OutputStream继承体系继承体系Reader/Writer继承体系继承体系FileInputStreamFileReaderFileOutputStreamFileWriterFilterInputStreamFilterReaderFilterOutputStreamFilterWriterBufferedInputStreamBufferedReaderBufferedOutput
35、StreamBufferedWriterDataInputStream无相应类,被沿用,无相应类,被沿用,readLine()方法不建议使用方法不建议使用DataOutputStream无相应类,被完全沿用无相应类,被完全沿用LineNumberInputStreamLineNumberReaderPushbackInputStreamPushbackReaderPrintStreamPrintWriterObjectInputStream(无相应类无相应类)ObjectOutputStream(无相应类无相应类)PipedInputStreamPipedReaderPipedOutputSt
36、reamPipedWriterSequenceInputStream(无相应类,被完全沿用无相应类,被完全沿用)StringBufferInputStreamStringReader(无相应类无相应类)StringWriter返回 CharArrayReader 对象中有一个字符数组对象中有一个字符数组(char)类型的属性,作为类型的属性,作为内部缓冲区。类内部缓冲区。类CharArrayReader有两个构造方法,其中一个构造方法以有两个构造方法,其中一个构造方法以一个字符数组作为参数,另一个构造方法的参数包括一个字符数组、一个一个字符数组作为参数,另一个构造方法的参数包括一个字符数组、一
37、个整型偏移量和一个整型长度,意义与整型偏移量和一个整型长度,意义与ByteArrayInputStream对象相同。对象相同。 返回 与与ByteArrayOutputStream对应,对应,CharArrayWriter对象中有一个字对象中有一个字符数组类型的属性作为内部缓冲区,同时也是该字符输出流的接收端。类符数组类型的属性作为内部缓冲区,同时也是该字符输出流的接收端。类CharArrayWriter有两个构造方法,其中一个构造方法没有参数,生成的有两个构造方法,其中一个构造方法没有参数,生成的内部缓冲区的初始大小为默认值,另一个构造方法有一个整型参数,生成内部缓冲区的初始大小为默认值,另
38、一个构造方法有一个整型参数,生成的内部缓冲区的初始大小即为该整型参数,内部缓冲区大小将随着数据的的内部缓冲区的初始大小即为该整型参数,内部缓冲区大小将随着数据的写入自动更改。写入自动更改。 返回 类类InputStreamReader是所谓桥类之一,用于将字节输入流转换成字是所谓桥类之一,用于将字节输入流转换成字符输入流,其自身是字符输入流,其数据源是字节输入流。符输入流,其自身是字符输入流,其数据源是字节输入流。InputStreamReader对象往往被作为其他字符输入流的数据源使用。对象往往被作为其他字符输入流的数据源使用。返回 类类OutputStreamWriter是所谓桥类中的另一
39、个,用于将字符输出流是所谓桥类中的另一个,用于将字符输出流转换成字节输出流,其自身是字符输出流,其接收端是字节输出流。转换成字节输出流,其自身是字符输出流,其接收端是字节输出流。OutputStreamWriter对象往往被作为其他字符输出流的接收端使用。该对象往往被作为其他字符输出流的接收端使用。该类有类有4个构造方法,一个构造方法以一个字节输出流对象为参数,为要转个构造方法,一个构造方法以一个字节输出流对象为参数,为要转换成的字节输出流,采用默认的字符编码格式转换字符输出流中的字符数换成的字节输出流,采用默认的字符编码格式转换字符输出流中的字符数据为字节数据;一个构造方法以一个字节输出流对
40、象和一个字符串为参数,据为字节数据;一个构造方法以一个字节输出流对象和一个字符串为参数,这个字符串为字符编码名称,表示使用何种字符编码格式转换字符输出流这个字符串为字符编码名称,表示使用何种字符编码格式转换字符输出流中的字符数据;一个构造方法以一个字节输出流对象和一个中的字符数据;一个构造方法以一个字节输出流对象和一个Charset对象对象为参数为参数(JDK 1.4中新加入的构造方法中新加入的构造方法),后者指定采用何种字符集转换字,后者指定采用何种字符集转换字符输出流中的字符数据,请参阅符输出流中的字符数据,请参阅Java(JDK 1.4)API文档;另一个构造方法文档;另一个构造方法以一
41、个字节输出流对象和一个以一个字节输出流对象和一个CharsetEncoder对象为参数对象为参数(JDK 1.4中新加中新加入的构造方法入的构造方法),后者指定采用何种字符集编码器转换字符输出流中的字,后者指定采用何种字符集编码器转换字符输出流中的字符数据,符数据,CharsetEncoder为字符集编码器类,代表将字符序列转换成字节为字符集编码器类,代表将字符序列转换成字节序列的引擎,请参阅序列的引擎,请参阅Java(JDK 1.4)API文档。文档。返回 FileReader是是InputStreamReader的子类,与的子类,与FileInputStream对应,对应,用于读取关联文件
42、中的数据。其构造方法有用于读取关联文件中的数据。其构造方法有3个,一个以文件名为参数,个,一个以文件名为参数,一个以一个以File对象为参数,一个以对象为参数,一个以FileDescriptor对象为参数对象为参数(参见参见10.3.3小节小节),这些构造方法都假设默认的编码格式和默认的字节缓冲区是合法的。这些构造方法都假设默认的编码格式和默认的字节缓冲区是合法的。FileReader的方法都直接继承自其父类的方法都直接继承自其父类InputStreamReader,甚至没有进,甚至没有进行任何重载,行任何重载, 返回 FileWriter是是OutputStreamWriter 的子类,与的
43、子类,与 FileOutputStream 对对应,用于往关联文件中写入数据。其构造方法有应,用于往关联文件中写入数据。其构造方法有5个,一个以文件名为参个,一个以文件名为参数,一个以数,一个以File对象为参数,一个以对象为参数,一个以FileDescriptor对象为参数对象为参数(参见参见10.3.3小节小节),另两个构造方法分别以关联文件名和一个布尔值,以及,另两个构造方法分别以关联文件名和一个布尔值,以及File对象和对象和一个布尔值一个布尔值(JDK 1.4中新加入的构造方法中新加入的构造方法)为参数,该布尔值若为为参数,该布尔值若为true,则,则往往FileWriter对象中写
44、入的数据将从关联文件的末尾处开始写入,否则将对象中写入的数据将从关联文件的末尾处开始写入,否则将从关联文件的开头处开始写入,这将覆盖原有数据从关联文件的开头处开始写入,这将覆盖原有数据 ,参数只有关联文件,参数只有关联文件名或名或File对象的构造方法,相当于此布尔值为对象的构造方法,相当于此布尔值为false。这些构造方法都假设。这些构造方法都假设默认的编码格式和默认的字节缓冲区是合法的。默认的编码格式和默认的字节缓冲区是合法的。FileWriter的方法都直接的方法都直接继承自其父类继承自其父类 OutputStreamWriter,同样没有进行任何重载,在此不一,同样没有进行任何重载,在
45、此不一一列出,一列出, 返回 StringReader对象与一个字符串关联,其构造方法以一个字符串为参对象与一个字符串关联,其构造方法以一个字符串为参数,作为数据源,其方法与数,作为数据源,其方法与 CharArrayReader 完全相同,完全相同,ready() 方法同方法同样始终返回样始终返回true,因为字符串输入流同样始终为,因为字符串输入流同样始终为read()方法作好准备。方法作好准备。 返回 StringWriter对象中有个对象中有个StringBuffer对象作为内部缓冲区,同时也对象作为内部缓冲区,同时也是该字符输出流的接收端。类是该字符输出流的接收端。类StringWr
46、iter有两个构造方法,一个构造方有两个构造方法,一个构造方法没有参数,生成的缓冲区长度为默认值,另一个构造方法有一个整型参法没有参数,生成的缓冲区长度为默认值,另一个构造方法有一个整型参数,生成的内部缓冲区的初始大小即为该整型参数,内部缓冲区大小将随数,生成的内部缓冲区的初始大小即为该整型参数,内部缓冲区大小将随着数据的写入自动更改。着数据的写入自动更改。 返回 BufferedReader提供具有缓冲能力的字符输入流,其工作原理与提供具有缓冲能力的字符输入流,其工作原理与BufferedInputStream相同,同样拥有一个内部缓冲区,但以一个字符输相同,同样拥有一个内部缓冲区,但以一个
47、字符输入流为数据源。类入流为数据源。类BufferedReader有两个构造方法有两个构造方法 ,其中一个以一个字,其中一个以一个字符输入流对象为参数,作为数据源输入流符输入流对象为参数,作为数据源输入流 ,内部缓冲区大小为默认值;,内部缓冲区大小为默认值;另一个以一个字符输入流对象和一个整数为参数,该整数用于指定内部缓另一个以一个字符输入流对象和一个整数为参数,该整数用于指定内部缓冲区的大小。冲区的大小。 返回 LineNumberReader是是BufferedReader的子类,同样具有缓冲功能,的子类,同样具有缓冲功能,拥有其一切特征,并提供一种按行读取数据的机制,其中一行结束的标志拥
48、有其一切特征,并提供一种按行读取数据的机制,其中一行结束的标志为换行符为换行符(n)或回车符或回车符(r)或回车符后紧跟一个换行符或回车符后紧跟一个换行符(回车换行符回车换行符)。类。类LineNumberReader有两个构造方法,一个以一个字符输入流对象为参数,有两个构造方法,一个以一个字符输入流对象为参数,作为数据源输入流,内部缓冲区大小为默认值;另一个以一个字符输入流作为数据源输入流,内部缓冲区大小为默认值;另一个以一个字符输入流对象和一个整数为参数,该整数用于指定内部缓冲区的大小。对象和一个整数为参数,该整数用于指定内部缓冲区的大小。LineNumberReader在在Buffere
49、dReader的基础上增加了两个方法,的基础上增加了两个方法,setLineNumber()用于为当前行编号,其后续行的编号将在此编号的基础用于为当前行编号,其后续行的编号将在此编号的基础上递增,上递增,getLineNumber()用于获取当前行的编号,默认情况下行编号从用于获取当前行的编号,默认情况下行编号从0开始。开始。 返回 BufferedWriter提供具有缓冲能力的字符输出流,其工作原理与提供具有缓冲能力的字符输出流,其工作原理与BufferedOutputStream相同,同样拥有一个内部缓冲区,但以一个字符输相同,同样拥有一个内部缓冲区,但以一个字符输出流为接收端。类出流为接
50、收端。类BufferedWriter有两个构造方法,一个以一个字符输出有两个构造方法,一个以一个字符输出流对象为参数,作为接收端输出流,内部缓冲区大小为默认值;另一个以流对象为参数,作为接收端输出流,内部缓冲区大小为默认值;另一个以一个字符输出流对象和一个整数为参数,该整数用于指定内部缓冲区的大一个字符输出流对象和一个整数为参数,该整数用于指定内部缓冲区的大小。一般情况下,小。一般情况下,BufferedWriter对象会将写入的数据立即提交到接收端对象会将写入的数据立即提交到接收端输出流,因而输出流,因而flush()方法在此没有明显作用。方法在此没有明显作用。newLine()方法写入一个