版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 1 1 页封面第 2 2 页 第 3 3 页9.3 I/O数据流与文件处理数据流与文件处理 缓冲区流输出和输入缓冲区流输出和输入 数据和对象的输入输出流数据和对象的输入输出流 InputStreamReaderInputStreamReader类类第 4 4 页 大多数程序所处理的数据都要从外部输入,即这些数据要从数据源(大多数程序所处理的数据都要从外部输入,即这些数据要从数据源(sourcesource)获得,数据源指提供数据的地方;而程序的运行结果又是要送到数据宿获得,数据源指提供数据的地方;而程序的运行结果又是要送到数据宿(destinationdestination),数据宿指接收
2、数据的地方。其中数据源可以是磁盘文件、键盘或),数据宿指接收数据的地方。其中数据源可以是磁盘文件、键盘或网络插口等,数据宿可以是磁盘文什、显示器、网络插口或者打印机等。网络插口等,数据宿可以是磁盘文什、显示器、网络插口或者打印机等。 数据源和数据宿的这种多样性,常常造成程序处理输入数据源和数据宿的这种多样性,常常造成程序处理输入/ /输出的复杂性。另一方输出的复杂性。另一方面,就程序而言,不希望将编程的精力过多地消耗在处理输入面,就程序而言,不希望将编程的精力过多地消耗在处理输入/ /输出的具体细节上面,输出的具体细节上面,而希望所有的输入而希望所有的输入/ /输出操作都能够有一个相对统一的、
3、简单的操作方式,而不管输输出操作都能够有一个相对统一的、简单的操作方式,而不管输入入/ /输出所涉及的数据源和数据宿是怎样的不同和多样。输出所涉及的数据源和数据宿是怎样的不同和多样。 数据源数据源数据宿数据宿程序程序1. 流的概念流的概念 怎样解决由于数据源和数据宿多样性而带来的输入怎样解决由于数据源和数据宿多样性而带来的输入/ /输出操作的复杂性呢?输出操作的复杂性呢?JaveJave引入的引入的“流流”以及有关的以及有关的“流类流类”就是用于解决上述矛盾的有效办法。就是用于解决上述矛盾的有效办法。 “流流”可以被理解为一条可以被理解为一条“管道管道”。这条。这条“管道管道”有两个端口:一端
4、与有两个端口:一端与数据源(当输入数据时)或数据宿(当输出数据时)相连,另一端与程序数据源(当输入数据时)或数据宿(当输出数据时)相连,另一端与程序相连。相连。第 5 5 页 在与数据源或数据宿相连的端口在与数据源或数据宿相连的端口,“,“管道管道”在读写数据时能够应付数据源在读写数据时能够应付数据源和数据宿的多样性,消化掉因数据源和数据宿的多样性带来的数据读和数据宿的多样性,消化掉因数据源和数据宿的多样性带来的数据读/ /写的写的复杂性;而在与程序相连的端口,复杂性;而在与程序相连的端口,“管道管道”提供了输入提供了输入/ /输出的统一操作界输出的统一操作界面。由于在程序和数据源面。由于在程
5、序和数据源/ /数据宿之间建立了数据宿之间建立了“管道管道”,使得程序输入,使得程序输入/ /输出输出时原本直接对数据源和数据宿的繁杂操作转化为对时原本直接对数据源和数据宿的繁杂操作转化为对“导管导管”的统一而简单的的统一而简单的操作,这样就大大降低了输入操作,这样就大大降低了输入/ /输出的复杂性,减轻了程序员的负担。输出的复杂性,减轻了程序员的负担。 有了流,程序和外界的数据交换,都可通过流实现。当程序要从数据源有了流,程序和外界的数据交换,都可通过流实现。当程序要从数据源获得数据时,必须在程序和数据源之间建立如图获得数据时,必须在程序和数据源之间建立如图6-56-5的输入流;当程序要把的
6、输入流;当程序要把结果输送到数据宿时,必须在程序和数据宿之间连接建立如图结果输送到数据宿时,必须在程序和数据宿之间连接建立如图6-66-6的输出流。的输出流。 无论涉及输入无论涉及输入/ /输出的数据源和数据宿是什么,只要在程序和数据源输出的数据源和数据宿是什么,只要在程序和数据源/ /数数据宿之间建立了流,用户就不需要再关心数据来自何方或送向何处,程序中据宿之间建立了流,用户就不需要再关心数据来自何方或送向何处,程序中输入输入/ /输出操作的复杂性就大大降低了。所有输入输出操作的复杂性就大大降低了。所有输入/ /输出操作都转换为对流的输出操作都转换为对流的操作。操作。2. 输入输出类的结构输
7、入输出类的结构 根据根据“管道管道”里流动的数据的类型里流动的数据的类型, , 流被分为流被分为字符流字符流( (Character Character StreamsStreams) ) 和和字节流字节流 ( (Byte StreamsByte Streams) ),字符流以字符为传输单位,而字节,字符流以字符为传输单位,而字节流以字节为传输单位。流以字节为传输单位。 根据流中数据传输的方向,流被分为根据流中数据传输的方向,流被分为输入流输入流和和输出流输出流。第 6 6 页 虽然虽然JavaJava语言提供了种类繁多的流,但这些流被很好地组织成树状结语言提供了种类繁多的流,但这些流被很好地
8、组织成树状结构,并不显得错综复杂。一旦熟练地掌握构,并不显得错综复杂。一旦熟练地掌握I/OI/O流,编程效率就会有显著的流,编程效率就会有显著的提高,下图为提高,下图为java java 字节流输入输出接口、类的继承图。字节流输入输出接口、类的继承图。 根据流的建立方式和工作原理,流分为根据流的建立方式和工作原理,流分为节点流节点流 ( (Node StreamsNode Streams) )与与过过滤流滤流 ( (Filter StreamsFilter Streams) ),节点流是直接建立在输入、输出媒体之上的,而,节点流是直接建立在输入、输出媒体之上的,而过滤流必须以某一个节点流作为流
9、的来源,可以在读过滤流必须以某一个节点流作为流的来源,可以在读/ /写数据的同时对数写数据的同时对数据进行处理。据进行处理。第 7 7 页例例. System.out和和System.in对象的使用对象的使用import java.io.*;class InOut public static void main(Stringargs) byte buffer=new byte20; System.out.println(请在下面输入一行字符:请在下面输入一行字符: );try System.in.read(buffer,0,20); /使用使用System.in对象的对象的read方法,方法,
10、read方法会抛出异常方法会抛出异常 catch(Exception e) /捕获异常并处理捕获异常并处理 System.out.println(读取输入字符出错,错误信息为:读取输入字符出错,错误信息为:+e.toString(); System.out.println(您刚才输入的一行字符为您刚才输入的一行字符为:); String inputStr=new String(buffer); System.out.println(inputStr); 3. 标准输入输出流标准输入输出流 System System类管理类管理标准输入输出流和错误流。标准输入输出流和错误流。 JavaJava定
11、义了定义了SystemSystem类的三类的三个静态成员对象:个静态成员对象: System.inSystem.in 从标准输入从标准输入( (通常是键盘通常是键盘) )中读入数据中读入数据 System.outSystem.out 将输出送到默认的显示将输出送到默认的显示( (通常是显示屏通常是显示屏) ) System.err System.err 将错误信息数据输出到默认的显示将错误信息数据输出到默认的显示 每当每当mainmain方法被执行时就自动生成上述三个对象。方法被执行时就自动生成上述三个对象。第 8 8 页4. InputStream类和类和OutputStream类类int
12、read() 从流中读取一个字节并将该字节作为整数返回从流中读取一个字节并将该字节作为整数返回, 若没有数据则返回若没有数据则返回-1 int read(byte b) 从流中读取多个字节放到从流中读取多个字节放到b中中, 返回实际读取到的字节数返回实际读取到的字节数 int read(byte b,int off,int len) 从流中读取最多从流中读取最多len字节的数据字节的数据, 放到数组放到数组b的的下标下标off开始的单元中,返回读取到的字节数开始的单元中,返回读取到的字节数 long skip(long n) 跳过流中指定的字节数跳过流中指定的字节数 InputStreamIn
13、putStream类类表示基本输入流,是字节流,它定义了一套所有输入表示基本输入流,是字节流,它定义了一套所有输入流都需要用的方法:流都需要用的方法:注:上面给的方法定义并非是完整的,完整定义注:上面给的方法定义并非是完整的,完整定义(如如int read()如下:如下: public abstract int read() throws IOExceptionInputStream类类 InputStreamInputStream类中定义了一套所有输入流都需要用的方法,而它的子类将这些类中定义了一套所有输入流都需要用的方法,而它的子类将这些方法定义完整,供程序中使用。如我们常用的方法定义完整
14、,供程序中使用。如我们常用的readread方法就是标准输入对象方法就是标准输入对象System.inSystem.in的的readread方法。方法。read()read()方法使用例:方法使用例: System.out.println( System.in.read() ); System.out.println( (int)System.in.read() ); /不必要的强制转换不必要的强制转换 System.out.println( (byte)System.in.read() ); System.out.println( (char)System.in.read() );第 9 9
15、 页 read(byte b)read(byte b)方法使用例:方法使用例: byte b=new byte3; System.in.read(b); for (int i=0;i3;i+) System.out.print(bi+ ); System.out.println(); String s=new String(b); System.out.print(s); 注意:注意: InputStreamInputStream类的类的readread方法接受的是字节数据方法接受的是字节数据(8(8位位) ),而不是字符。,而不是字符。 ASCIIASCII码中字符和字节数据对应的都是码中字
16、符和字节数据对应的都是8 8位数据,位数据, 而在而在UnicodeUnicode字符集中,字字符集中,字符都被设置为符都被设置为1616位数据,这样位数据,这样, , 利用利用InputStreamInputStream类来接收键盘字符将接收不到字类来接收键盘字符将接收不到字符的高位信息!符的高位信息!InputStreamInputStream类的其它方法:类的其它方法:public int available() throws IOException 返回当前流中可用的字节数返回当前流中可用的字节数public void close() throws IOException 关闭当前流对
17、象关闭当前流对象public synchronized void mark(int readlimit) 在流中标记一个位置在流中标记一个位置public synchronized void reset() throws IOExeeption 返回流中标记过的位置返回流中标记过的位置public boolean markSupported() 返回一个流是否支持标记和复位操作的布尔值返回一个流是否支持标记和复位操作的布尔值 第 1010 页 与与InputStream类相对应的输出流是类相对应的输出流是OutputStream,它具有所有输出流类的它具有所有输出流类的基本功能,同基本功能,同
18、InputStream类相似,它具有以下相应的方法:类相似,它具有以下相应的方法:public abstract void write(int b) throws IOException 向流中写一个字节向流中写一个字节public void write(byte b) throws IOException 向流中写入一个字节数组向流中写入一个字节数组public void write(byte b,int off,int len) throws IOException 从数组从数组b的第的第off个位置开始写入个位置开始写入len长度的数据长度的数据 public void flush()
19、throws IOException 清空流并强制将缓冲区中的所有数据写入到流中清空流并强制将缓冲区中的所有数据写入到流中 public void close() throws IOException 关闭流对象关闭流对象OutputStream类类第 1111 页9.3.2 文件类文件类(File)的使用的使用 为了将程序的运行结果永久保留,常需要将运行结果输出到文件中,反之又需要从文件中读取数据输入到程序中,这就是文件操作。 JavaJava提供了专门处理文件的类提供了专门处理文件的类FileFile,还提供了对文件进行输入输出,还提供了对文件进行输入输出的文件输入输出流类的文件输入输出流
20、类( (文件流文件流) ),以此来实现文件的操作。,以此来实现文件的操作。 文件流是基本输入输出流类的子类。按数据交换的单位不同文件流是基本输入输出流类的子类。按数据交换的单位不同, , 可分为字可分为字符流、字节流两种符流、字节流两种, , 其读写的方式都是顺序方式。其读写的方式都是顺序方式。 本节介绍以字符为单位的文件访问,以字节为单位的方式在下一小节介绍。 第 1212 页 文件文件( (filefile) )是存储在辅助存储器中的一组相关信息的集合是存储在辅助存储器中的一组相关信息的集合, ,它可以存放程序、它可以存放程序、文档、图片、声音或视频信息等。为了便于对文件管理文档、图片、声
21、音或视频信息等。为了便于对文件管理, , 系统允许用户给文件设系统允许用户给文件设置或取消有关的文件属性置或取消有关的文件属性, , 如只读属性、隐藏属性、存档属性、系统属性。如只读属性、隐藏属性、存档属性、系统属性。 目录目录( (directorydirectory) )是一种特殊的文件,用以存放普通文件或其他的目录。磁盘是一种特殊的文件,用以存放普通文件或其他的目录。磁盘格式化时,系统自动地为其创建一个目录格式化时,系统自动地为其创建一个目录( (称为根目录称为根目录) )。用户可以根据需要在根。用户可以根据需要在根目录中创建低一级的目录目录中创建低一级的目录( (称为子目录称为子目录)
22、 ),子目录中还可以再创建下一级的子目录,子目录中还可以再创建下一级的子目录,从而形成树型目录结构,目录也可以设置相应的属性。从而形成树型目录结构,目录也可以设置相应的属性。 路径路径( (pathpath) )是从盘符经过各级子目录到文件的目录序列。由于文件可以在不是从盘符经过各级子目录到文件的目录序列。由于文件可以在不同的磁盘、不同的目录中,所以在存取文件时,必须指定文件的存放位置。同的磁盘、不同的目录中,所以在存取文件时,必须指定文件的存放位置。1.1.文件、目录、路径文件、目录、路径 文件的存放位置通过路径来描述,路径的表示格式为:盘符文件的存放位置通过路径来描述,路径的表示格式为:盘
23、符 目录名目录名 文件名,文件名,比如在比如在C C盘根目录下的子目录盘根目录下的子目录WINDOWWINDOW下子目录下子目录JAVAJAVA中的文件中的文件myfile.javamyfile.java,应表示,应表示为为 C:WINDOWJAVAmyfile.javaC:WINDOWJAVAmyfile.java 其中,其中,C:C:为驱动器名,表示为驱动器名,表示C C盘,而盘,而WINDOWJAVAWINDOWJAVA表示表示myfile.javamyfile.java所存储的所存储的位置,其中第一个位置,其中第一个“”表示根目录,其余的表示根目录,其余的“”为各子目录之间、最后一级子
24、目录为各子目录之间、最后一级子目录与文件名之间的分隔符。与文件名之间的分隔符。 在一个树型目录结构中,任一时刻,可以指定一个当前工作或操作的子目录,称其在一个树型目录结构中,任一时刻,可以指定一个当前工作或操作的子目录,称其为当前目录(又叫缺省目录)。凡从根目录开始的路径叫做绝对路径,应以为当前目录(又叫缺省目录)。凡从根目录开始的路径叫做绝对路径,应以“”开开头;凡不从根目录开始而从当前目录开始的路径叫相对路径,应从当前目录的下级目头;凡不从根目录开始而从当前目录开始的路径叫相对路径,应从当前目录的下级目录开始写起。录开始写起。 例如,假使上述文件例如,假使上述文件myfile.javamy
25、file.java完整的文件标识是完整的文件标识是C:WINDOWJAVAmyfile.javaC:WINDOWJAVAmyfile.java,如果当前磁,如果当前磁盘是盘是C C盘盘, ,可写成可写成WINDOWJAVAmyfile.javaWINDOWJAVAmyfile.java;如果当前目录是;如果当前目录是C:WINDOWC:WINDOW,可写成,可写成JAVAmyfile.javaJAVAmyfile.java;如果当前目录是;如果当前目录是C:WINDOWJAVAC:WINDOWJAVA,可改写成,可改写成myfile.javamyfile.java。 第 1313 页 java
26、.io包中定义了一个包中定义了一个File类用来专门处理文件或获取文件的有关信息。类用来专门处理文件或获取文件的有关信息。Java语言中通过语言中通过File类来建立与磁盘文件的联系。类来建立与磁盘文件的联系。File类用来获取或设置文类用来获取或设置文件或目录的属性,但不支持从文件读取数据或者往文件里写数据件或目录的属性,但不支持从文件读取数据或者往文件里写数据(读取或写读取或写数据由文件流实现数据由文件流实现)。 文件是许多程序的基本数据源和数据宿,是保存永久数据和共享信息的媒文件是许多程序的基本数据源和数据宿,是保存永久数据和共享信息的媒体。在体。在Java中,目录也被当作文件,可以用中
27、,目录也被当作文件,可以用list方法列出目录中的文件名。方法列出目录中的文件名。2. File File File类的功能十分强大,它可以访问指定文件的所有属性,包括文件名称、类的功能十分强大,它可以访问指定文件的所有属性,包括文件名称、文件长度、文件的最后修改时间等,同时还可以利用文件长度、文件的最后修改时间等,同时还可以利用FileFile类来建立文件对象、类来建立文件对象、删除文件和改变文件名称等。删除文件和改变文件名称等。FileFile类具有下面三种构造函数:类具有下面三种构造函数: File (String path) File (String path) File (Strin
28、g path,String name)File (String path,String name) File (String dir,String name) File (String dir,String name)其中参数意义如下:其中参数意义如下: String pathString path指定的路径指定的路径 String nameString name执行的文件名执行的文件名 String dirString dir执行的目录执行的目录例如下面的语句是在例如下面的语句是在d d盘上建立一个名为盘上建立一个名为myfile.txtmyfile.txt的文件:的文件: File f =
29、 new File(d:myfiel.txt);第 1414 页public String getNamepublic String getName() () 返回文件名返回文件名public String getPathpublic String getPath() () 返回文件路径返回文件路径 public String getAbsolutePathpublic String getAbsolutePath() () 返回文件绝对路径返回文件绝对路径public String getCanonicalPath() throws IOExceptionpublic String getC
30、anonicalPath() throws IOException 返回文件的规范路径返回文件的规范路径public String getParentpublic String getParent() () 返回文件的父目录返回文件的父目录public booleanpublic boolean exists() exists() 判断文件是否存在判断文件是否存在public boolean canWritepublic boolean canWrite() () 判断文件是否可写判断文件是否可写public boolean canReadpublic boolean canRead() ()
31、 判断文件是否可读判断文件是否可读public boolean isFilepublic boolean isFile() () 判断对象是否是文件判断对象是否是文件public boolean isDirectorypublic boolean isDirectory() () 判断对象是否是目录判断对象是否是目录 File File类的有关方法:类的有关方法:public native boolean isAbsolutepublic native boolean isAbsolute() () 如果文件名为绝对名则返回真如果文件名为绝对名则返回真public long lastModif
32、iedpublic long lastModified() () 返回文件最后修改日期返回文件最后修改日期public long length()public long length() 返回文件长度返回文件长度public boolean mkdirpublic boolean mkdir() () 创建目录创建目录public boolean rename To(File destpublic boolean rename To(File dest) ) 重命名文件重命名文件public boolean mkdirspublic boolean mkdirs() () 创建目录及子目录创建
33、目录及子目录public String list()public String list() 列出目录下的所有文件和目录列出目录下的所有文件和目录public String list(FilenameFilterpublic String list(FilenameFilter filter) filter) 列出目录下的指定文件列出目录下的指定文件public booleanpublic boolean delete() delete() 删除文件对象删除文件对象public int hashCodepublic int hashCode() () 为文件创建散列代码为文件创建散列代码pub
34、lic boolean equals(Object objpublic boolean equals(Object obj) ) 判断是否同对象判断是否同对象objobj相等相等public String toStringpublic String toString() () 返回文件对象的字符串描述返回文件对象的字符串描述 第 1515 页 前面介绍的前面介绍的FileFile类用来创建一个文件,但是如何往文件里写数据或类用来创建一个文件,但是如何往文件里写数据或读出文件中的内容读出文件中的内容 ?这就需要使用下面流类:?这就需要使用下面流类: (1 1)文件输出流类文件输出流类FileWr
35、iterFileWriter (2 2)文件输入流类文件输入流类FileReaderFileReader FileWriterFileWriter类可以在一指定的文件上建立一个文件输出流,也可以建立一个文件类可以在一指定的文件上建立一个文件输出流,也可以建立一个文件同时实例化为文件输出流。流提供了将字符写到文件中的方法。如果用同时实例化为文件输出流。流提供了将字符写到文件中的方法。如果用FileWriteFileWrite来打来打开一个只读文件会产生开一个只读文件会产生IOExcptionIOExcption异常。异常。 FileWriterFileWriter类有两种构造方法:类有两种构造方
36、法: 构造方法一构造方法一: : File f=File f=newnew File(d:t1.txt) File(d:t1.txt); /建立文件建立文件 FileWriterFileWriter f1= f1=newnew FileWriter(f FileWriter(f); ); /建立文件输出流建立文件输出流 构造方法二构造方法二: : ( (建立文件同时实例化为文件输出流建立文件同时实例化为文件输出流) ) FileWriterFileWriter f2= f2=newnew FileWriter(d:t1.txt) FileWriter(d:t1.txt); 第一种方法是先建立一
37、个文件对象第一种方法是先建立一个文件对象f f,然后再建立一个输出流,然后再建立一个输出流f1f1,并使输出流,并使输出流f1f1和和文件文件f f相连接。这种情况下,可以通过对象相连接。这种情况下,可以通过对象f f对该文件作进一步的分析对该文件作进一步的分析, , 比如比如, , 显示文件显示文件的属性、大小等。第二种方法就是将第一种方法的二步合成一步,相对来说更方便一的属性、大小等。第二种方法就是将第一种方法的二步合成一步,相对来说更方便一些,但不能做文件分析等其它工作。些,但不能做文件分析等其它工作。 第 1616 页 注意:写完后一定要关闭注意:写完后一定要关闭输出流输出流,数据才真
38、正地写到了文件中!,数据才真正地写到了文件中! (1) write(char c) 将一个字符写到文件的末尾将一个字符写到文件的末尾 (2) write(char b ) 将一个字符数组写到文件的末尾将一个字符数组写到文件的末尾 (3) close() 关闭输出流关闭输出流 FileWriter类的最重要的方法是类的最重要的方法是write()与与close(): 例例. . 在在d d盘上建立一个名为盘上建立一个名为myfile.txtmyfile.txt的文件,并写入两串字符。的文件,并写入两串字符。import java.io.*; public class FileOutputpubl
39、ic static void main(Stringargs)throws Exception File f = new File(d:myfile.txt); FileWriter f1 = new FileWriter(f); f1.write(abcdefghij); f1.write(xyz); f1.close(); 第 1717 页 FileReaderFileReader类可以在一指定的文件上实例化一个文件输入流,类可以在一指定的文件上实例化一个文件输入流, FileReaderFileReader类流提供了从文件中读取一个字符或者一组字符方法。类流提供了从文件中读取一个字符或者
40、一组字符方法。FileReaderFileReader类的构造方类的构造方法都有可能出现法都有可能出现FileNotFoundExcptionFileNotFoundExcption异常。异常。 构造方法一:构造方法一: File f=File f=newnew File(d:t1.txt); File(d:t1.txt); FileReaderFileReader f1= f1=newnew FileReader(f FileReader(f); ); 构造方法二:构造方法二: FileReaderFileReader f2= f2=newnew FileReader(d:t1.txt);
41、FileReader(d:t1.txt); 这两种建立输入流的方法与前面建立输出流的两种方法意义完全类似。这两种建立输入流的方法与前面建立输出流的两种方法意义完全类似。 FileReader类的最重要的方法是类的最重要的方法是read()与与close(): (1) read( ) 读一字符,返回读入的字符的整型表示读一字符,返回读入的字符的整型表示 (2) read(char b ) 读入字符放到字符数组读入字符放到字符数组b中并返回实际读入的字符数。如果所中并返回实际读入的字符数。如果所定义的字符数组容量小于获得的字符数,则运行时将产生一个定义的字符数组容量小于获得的字符数,则运行时将产生
42、一个IOException例外情况。例外情况。 (3) read(char b ,int off,int len) 读入读入len个字符放到数组个字符放到数组b下标下标off开始的位置中,开始的位置中,并返回实际读入的字符数并返回实际读入的字符数 (4) close() 关闭输入流关闭输入流 第 1818 页 例例. . 将将d d盘上名为盘上名为myfile.txtmyfile.txt的文件的内容输出到屏幕。的文件的内容输出到屏幕。import java.io.*; public class FileInputpublic static void main(Stringargs)throws
43、 Exception File f = new File(d:myfile.txt); FileReader f1 = new FileReader(f); char a=new char(int)f.length(); f1.read(a); System.out.println(a); f1.close(); 第 1919 页 要建立要建立( (或打开或打开) )一个文件并对它进行写或读,需要如下几一个文件并对它进行写或读,需要如下几步:步: (1) (1) 用用FileFile类建立类建立( (或打开或打开) )一个文件;一个文件; (2) (2) 用用FileWriter(FileRe
44、aderFileWriter(FileReader) )类建立输出类建立输出( (输入输入) )流;流; (3) (3) 调用调用write(read)write(read)方法进行写方法进行写( (读读) ); (4) (4) 关闭输出关闭输出( (输入输入) )流。流。第 2020 页 平常所使用的文件中,有很多是二进制文件,它们以字节作为数据处理单位。对这平常所使用的文件中,有很多是二进制文件,它们以字节作为数据处理单位。对这些文件就要使用字节流来读写了,其实字符文件也可以用字节流来进行读写。些文件就要使用字节流来读写了,其实字符文件也可以用字节流来进行读写。 对字节流对字节流文件进行读
45、写的流类是:文件进行读写的流类是: FileInputStream 字节文件输入流字节文件输入流 FileOutputStream 字节文件输出流字节文件输出流FileInputStreaFileInputStreamm类的方法:类的方法: int available() 返回可读入的字节数返回可读入的字节数void close() 关闭输入流,并释放任何与该流有关的资源关闭输入流,并释放任何与该流有关的资源protected void finalize() 当读到无用信息时,关闭该流当读到无用信息时,关闭该流FileDescriptor getFD() 返回与该流有关的文件描述符返回与该流有
46、关的文件描述符 (即文件的完整路径)(即文件的完整路径)int read() 从输入流中读取一个字节的数据从输入流中读取一个字节的数据int read(byteb) 将数据读入到一个字节数组中将数据读入到一个字节数组中int read(byteb,int off,int len) 读入读入len个字节数据放到数组个字节数据放到数组b的的off开始的位置中开始的位置中long skip(long n) 跳过输入流上的跳过输入流上的n个字节个字节void close() 关闭输出流,并释放任何该流有关的资源关闭输出流,并释放任何该流有关的资源protected void finalize() 当写
47、到无用信息时,关闭该流当写到无用信息时,关闭该流File Descriptor getFD () 返回与该流有关的文件描述符返回与该流有关的文件描述符 (即文件的完整路径)(即文件的完整路径)void write(int b) 将一个字节数据写到输出流中将一个字节数据写到输出流中void write(byte b) 将字节数组中的数据写到输出流中将字节数组中的数据写到输出流中long skip(long n) 跳过输出流上的跳过输出流上的n个字节个字节FileOutputStreaFileOutputStreamm类方法:类方法:第 2121 页1. BufferedInputStream 缓
48、冲区流建立在节点流之上缓冲区流建立在节点流之上, 对节点流中数据进行某些加工对节点流中数据进行某些加工, ,并提供一些友好的方法供用户进行输并提供一些友好的方法供用户进行输入、输出操作以及流控制。入、输出操作以及流控制。 例如例如, BufferedInputStream, BufferedInputStream可以对任何种类的输入流进行带缓冲区的封装以达到性能的改善可以对任何种类的输入流进行带缓冲区的封装以达到性能的改善 ( ( 可减少程序可减少程序 I/O I/O 操作次数,提高程序执行效率操作次数,提高程序执行效率 ) )。 JaveJave利用缓冲区流可以在读利用缓冲区流可以在读/ /
49、写数据的同时对写数据的同时对数据进行处理。数据进行处理。 使用缓冲区流时要注意:使用缓冲区流时要注意: 必须将缓冲区流和某个节点流必须将缓冲区流和某个节点流( (前面介绍的都是节点流前面介绍的都是节点流) )连接连接 在程序中,连接是通过在缓冲区流的构造方法中指定入口参数在程序中,连接是通过在缓冲区流的构造方法中指定入口参数节点流来实现的。如:节点流来实现的。如: FileInputStreamFileInputStream in= in=newnew FileInputStream(textFileInputStream(text);); BufferedInputStream bufinB
50、ufferedInputStream bufin= =newnew BufferedInputStream(inBufferedInputStream(in); );实现了缓冲区流实现了缓冲区流bufinbufin和文件输入流和文件输入流inin连接。连接。 对对I/OI/O进行缓冲是一种常见的性能优化方法。进行缓冲是一种常见的性能优化方法。JaveJave的的BufferedInputStreamBufferedInputStream类类可以对任何的可以对任何的InputStreamInputStream流进行带缓冲的封装以达到性能的改善。该类在已定义流进行带缓冲的封装以达到性能的改善。该类
51、在已定义输入流上再定义一个具有缓冲的输入流,可以从此流中成批地读取字符而不会每次输入流上再定义一个具有缓冲的输入流,可以从此流中成批地读取字符而不会每次都引起直接对数据源的读操作。数据输入时,首先被放入缓冲区,随后的读操作就都引起直接对数据源的读操作。数据输入时,首先被放入缓冲区,随后的读操作就是对缓冲区中的内容进行访问。是对缓冲区中的内容进行访问。该类有两个构造方法:该类有两个构造方法: 1 1)public BufferedInputStream(InputStreampublic BufferedInputStream(InputStream in); in); 2 2)public B
52、ufferedInputStream(InputStream in,intpublic BufferedInputStream(InputStream in,int size); size);第 2222 页 两种构造方法都有是为某种输入流两种构造方法都有是为某种输入流 in in 创建一个缓冲流创建一个缓冲流 创建的缓冲大小为创建的缓冲大小为缺省值(缺省值(32bytes)方法一方法一方法二方法二用户指定缓冲区大小用户指定缓冲区大小 对方法二,在性能优化时,通常都把对方法二,在性能优化时,通常都把sizesize的值设定为内存页大小或的值设定为内存页大小或I/OI/O块大小块大小的整数倍。在
53、的整数倍。在I/OI/O量不大时,该类所起作用不是很明显,但当程序量不大时,该类所起作用不是很明显,但当程序I/OI/O量很大,且量很大,且对程序效率要求很高时,使用该类就能大大提高程序的效率。对程序效率要求很高时,使用该类就能大大提高程序的效率。BufferedOutputStreamBufferedOutputStream类在已定义节点输出流上再定义一具有缓冲类在已定义节点输出流上再定义一具有缓冲功能的输出流。用户可以向流中写字符而不会每次都引起直接对数据宿的功能的输出流。用户可以向流中写字符而不会每次都引起直接对数据宿的写操作,只有在缓冲区已满或清空流(写操作,只有在缓冲区已满或清空流(
54、flushflush)时,数据才输出到数据宿上。)时,数据才输出到数据宿上。在在JavaJava中使用输出缓冲流是为了提高性能。中使用输出缓冲流是为了提高性能。 该类有两个构造方法:该类有两个构造方法:1 1)public BufferedOutputStream(OutputStreampublic BufferedOutputStream(OutputStream out); out);2 2)public BufferedInOutputStream(OutputStream out, intpublic BufferedInOutputStream(OutputStream out,
55、int size);size);第 2323 页DataInputStreamDataInputStream用来从一种已定义的节点输入流中读取用来从一种已定义的节点输入流中读取JaveJave基本数据类型的基本数据类型的数据,如布尔型数、整型数、浮点数等,然后再生成一个数据输入流。数据,如布尔型数、整型数、浮点数等,然后再生成一个数据输入流。 DataOutputStreamDataOutputStream用来将用来将JaveJave基本数据类型数据写到一个数据输出流中。基本数据类型数据写到一个数据输出流中。 这两个类都是在某节点流上再定义一个数据输入这两个类都是在某节点流上再定义一个数据输入
56、( (输出输出) )流,通过它们,用户可以更流,通过它们,用户可以更方便地按照方便地按照JaveJave原始数据类型来读原始数据类型来读( (写写) )数据。数据。 1 1)pubilc DataInputStream(InputStreampubilc DataInputStream(InputStream in); in); 创建一新的创建一新的DataInputStreamDataInputStream, ,该流从输入流该流从输入流inin读取数据读取数据 2 2)pubilc DataOutputStream(OutputStreampubilc DataOutputStream(Ou
57、tputStream out); out); 在输出流在输出流outout上创建一个新的上创建一个新的DataOutputStream,DataOutputStream,使使DataOutputStreamDataOutputStream的输出数据能够输出到输出流的输出数据能够输出到输出流outout中中 构造方法:构造方法:例如,建立基于标准输入的输入流的语句可如下:例如,建立基于标准输入的输入流的语句可如下: DataInputStreamDataInputStream In= In=newnew DataInputStream(System.in DataInputStream(Syst
58、em.in); ); 第 2424 页readBoolean()readBoolean()、writeBooleanwriteBoolean() () 读写布尔型数据读写布尔型数据readByte()readByte()、writeBytewriteByte() () 读写字节数据读写字节数据readChar()readChar()、writeCharwriteChar() () 读写字符数据读写字符数据readInt()readInt()、writeIntwriteInt() () 读写整型数据读写整型数据readFloat()readFloat()、writeFloatwriteFloat
59、() () 读写单精度数据读写单精度数据readDouble()readDouble()、writeDoublewriteDouble() () 读写双精度数据读写双精度数据readLine()readLine()、writeLinewriteLine() () 读写整行数据读写整行数据 成员方法:成员方法:例如,要从键盘输入一行字符,语句可如下:例如,要从键盘输入一行字符,语句可如下: DataInputStreamDataInputStream In= In=newnew DataInputStream(System.in DataInputStream(System.in); ); St
60、ring stra=In.readLine String stra=In.readLine(); (); 例例. . 建立基于标准输入的过滤流并进行输入建立基于标准输入的过滤流并进行输入import java.io.*; public class DataInput public static voidpublic static void mainmain(Stringargs)(Stringargs)throwsthrows Exception Exception intint a; a; doubledouble b,c; String str b,c; String str; ; Dat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年锂电池循环后高镍正极岩盐相检测与定量分析
- 2026年托育实训基地建设与岗位需求 技能培训项目化模式
- 2026年数据资源持有权确权操作指南
- 2026年X波段低空探测雷达系统操作手册
- 关爱地球不止这一小时-节能环保主题班会课件
- 2026年数字孪生在金融领域的应用:风险模拟与业务流程
- 2026中国国际工程咨询(北京)有限公司社会招聘5人备考题库附完整答案详解【易错题】
- 2026贵州贵阳观山湖区铭廷小学语文教师招聘备考题库带答案详解(新)
- 2026年边境巡检无人化:卫星融合网 无人系统方案
- 2026陕西西安市西北工业大学材料学院高温功能材料团队招聘1人备考题库及参考答案详解(突破训练)
- 2026福建泉州市级国资集团公司总部纪检监察类中层副职岗位招聘5人笔试备考题库及答案解析
- 2026新疆交投建设管理有限责任公司面向社会招聘20人考试参考试题及答案解析
- 有机试剂工安全检查知识考核试卷含答案
- 2025广东珠海市中西医结合医院招聘聘用合同制工作人员27人(第二批)笔试历年典型考题及考点剖析附带答案详解试卷2套
- 2026年温州永嘉县国有企业面向社会公开招聘工作人员12人考试参考题库及答案解析
- 2026广东东莞农商银行总行岗位社会招聘考试参考试题及答案解析
- 2026年一季度湖南能源集团社会招聘520人笔试备考题库及答案解析
- 《耳鼻喉科耳部手术诊疗指南及操作规范(2025版)》
- 新媒体运营新人考核制度
- 航空航天飞控系统设计手册
- 瓷砖销售市场营销推广方案
评论
0/150
提交评论