




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 输入输出流 WORD文档使用说明:第9章 输入输出流 来源于PDF转换成WROD 本WOED文件是采用在线转换功能下载而来,因此在排版和显示效果方面可能不能满足您的应用需求。如果需要查看原版WOED文件,请访问这里第9章 输入输出流 第9章 输入输出流|PDF转换成WROD_PDF阅读器下载第9章 输入输出流本章知识框图学习重点:掌握基本输入输出流。 掌握按数据类型操作输入输出流。 掌握输入输出对象。 掌握文件/目录操作。Java采用“流”(Stream)来完数据的输 入(Input)和输出(Output),输入输出 简称I/O。从外部数据源将数据读入程序的 流称为输入流,从程序中将数
2、据写入外部数 据源的流称为输出流。外部数据源可以是磁 盘文件、程序、内存或硬件设备。可以按字 节、字符或类型化的数据进行输入输出。也 可以将对象写入文件,或从文件中读出对象。 本章将详细介绍各种常用的输入输出流操作。 基本输入输出流基本的输入输出流包括字节流、字符流和缓 冲流。在输入时,可使用Scanner对象从 流读取特定类型的数据。在输出时,可以对 输出格式进行控制。 字节流字节流按字节(8位二进制)输入和输出数 据。Java定义了很多字节流类,这些类都是 两个抽象类InputStream和 OutputStream.的派生类。本节主要讲解 两个基本的字节流类:FileInputStrea
3、m (文件输入流)和FileOutputStream(文 件输出流)。1、创建FileInputStream对象可用下列方法创建文件输入流对象: (1)FileInputStream(File file) 用File对象创建一个FileInputStream对象,File对象指定实际访问的磁盘文件。例如: FileInputStream datain = new FileInputStream(new File(""); 文件没有指定路径,默认与应用程序在相同目录中。如果未找到指定文件,则抛 出FileNotFoundException异常。 (2)FileInputStr
4、eam(FileDescriptor fdObj) 用FileDescriptor对象创建一个FileInputStream对象。例如: FileInputStream datain = new FileInputStream(); FileDescriptor定义了3个静态对象,等价于, 等价于,等价于。创 建FileInputStream对象时,只能使用。采用这种方式创建的 FileInputStream对象可以从键盘读取数据。 (3)FileInputStream(String name) 用指定的文件名创建一个FileInputStream对象。例如: FileInputStream
5、datain = new FileInputStream(""); Windows环境中的路径分隔符号为“”,可用“”或“/”作为路径分隔符。例如: FileInputStream datain = new FileInputStream("d:javatempchapter09");2、FileInputStream对象操作FileInputStream对象常用操作如下:available():返回可读的字节数。若没有可读数据,返回值为0。 close():关闭文件输入流。 read():从输入流读取一个字节,返回值类型为int。若没有可读数据, 返回
6、-1。 read(byte b):从输入流读取数据,按顺序放入b的各个数组元素中。 返方法回值类型为int,表示从流中读取的总的字节数。若没有可读数据, 返回值为-1。 read(byte b, int bindex,int count):最多从输入流读取count个字 节,按顺序放入b数组中下标从bindex开始的元素中。返方法回值类型为 int,表示从流中读取的总的字节数。若没有可读数据,返回值为-1。 skip(long n):在流中跳过n个字节。n不能为负数,否则产生错误。 FileInputStream对象的各个方法在出现错误时,会抛出IOException 异常。IOExcepti
7、on异常属于检查异常,必须在代码中捕捉或声明方法 抛出【例】使用FileInputStream对象读取文件数据。(源文 件位置:光盘:chapter09. ,光 盘:chapter09) useFileInputStream从文本文件中 读取数据,并显示在命令提示符窗口中。 文件内容如下: 1:first line 2:second line 3:third line程序代码如下: import .*; public class useFileInputStream public static void main(String args) throws IOException FileInpu
8、tStream in = null; try in = new FileInputStream(""); ("文件总字节数:"+(); ("*文件内容如下*"); int c;while ()!=0)/如果还有可读数据则循环 c = ();/读一个字节 /read方法返回的是int型数据,要按字符输出, /所以用char强制转换数据类型。 /如果不转换,输出为字符ASCII码的十进制值 (char)c);/输出 ("*文件内容结束*"); ();/关闭流 in = new FileInputStream("
9、;");/重新建立文件输入流 int count=0; byte b=new byte5; (16);/跳过16个字节if()!=0) count=(b);/从流读取数据到字节数组 ("用数组读出的数据:"); for(int i=0;i<count;i+) ("%-4d",bi); ("n 对应的字符:"); for(int i=0;i<count;i+) ("%-4s",(char)bi); finally if (in!= null) ();/关闭流 代码中使用了FileInputStr
10、eam的各种方法,这些方法可能产 生IOException异常。代码中没有使用catch处理 IOException异常,所以在main方法的参数表之后使用 throws关键字声明方法可能抛出IOException异常。 程序在finally代码块中关闭文件输入流。如果没有在程序中调 用close方法关闭流,系统可自动将其关闭。close方法在关闭 流的同时,释放维护流使用的相同资源,所以建议读者在代码 中显式调用close方法关闭流,以便提供相同效率。程序将关闭 流操作放在finally代码块中,这是因为不管程序运行是否有错, finally代码都会执行,从而保证关闭流。 说明: 说明:本例
11、中文件内容为ASCII码字符。如果文件 中包含非ASCII码字符,比如汉字,按字节读取会导致非 ASCII码字符不能读取和显示。3、创建FileOutputStream对象可用下列方法创建FileOutputStream对象: (1)FileOutputStream(File file) 用指定File对象创建文件输出流,向File对象指定的文件输出数据。该方法始终创建一个新文件。如果 已存在同名文件,原文件被覆盖。File对象指定的是一个文件夹或者文件路径错误,则会产生 FileNotFoundException异常。例如: FileOutputStream dataout = new Fi
12、leOutputStream(new File(""); (2)FileOutputStream(File file, boolean append) 参数append为false时,与FileOutputStream(File file)相同。参数append为true时,表示向文件 添加数据。例如: FileOutputStream dataout = new FileOutputStream(new File(""),true); (3)FileOutputStream(FileDescriptor fdObj) 用FileDescriptor对象
13、创建文件输出流。例如: FileOutputStream dataout = new FileOutputStream(); (4)FileOutputStream(String name) 用指定文件名创建文件输出流,向文件输出数据,与FileOutputStream(File file)方法类似。例如: FileOutputStream dataout = new FileOutputStream(""); (5)FileOutputStream(String name, boolean append) 参数append为false时,与FileOutputStream
14、(String name)相同。参数append为true时,表示向 文件添加数据。例如: FileOutputStream dataout = new FileOutputStream("",true);4、FileOutputStream对象操作FileOutputStream对象常用操作如下: close():关闭文件输出流。 flush():刷新流,即向流中的数据全部写入文件。 write(int n):向文件写入一个字节。如果n大于255,即多余 一个字节,则将n的最后一个字节写入文件。写入文件的字节 n 视为字符的ASCII码。例如,write(65)写入文件的
15、是字符A ASCII write(65) A (其ASCII码为65)。 write(byte b):将字节数组b中的数据按顺序写入文件。 write(byte b, int bindex,int count):将字节数组b中下 标从bindex开始的count个元素写入文件。 FileOutputStream对象的各个方法在出现错误时,会抛出 IOException异常。【例】使用FileOutputStream对象向文件写数据。(源文件位置: 光盘:chapter09. ,光 盘:chapter09,光 盘:chapter09) useFileOutputStream首先将文本文件中的数
16、据复制到新文件中,再为文件添加部分数据。 文件内容如下: 春晓 春眠不觉晓 处处闻啼鸟 夜来风雨声 花落知多少程序代码如下: /将文件中的数据复制到文件中,并添加部 分数据 import .*; public class useFileOutputStream public static void main(String args) throws IOException FileInputStream in = null; FileOutputStream out = null; try in = new FileInputStream(""); out = new Fil
17、eOutputStream(""); 字符流字符流按字符读取和写入数据。Java采用Unicode字符,在 读写文件时,字符流可以自动将文件中的本地字符转换为 Unicode字符。本节介绍两个字符流类:FileReader(读文 件)和FileWriter(写文件)。 FileReader和FileWriter类的基类分别为 InputStreamReader和OutputStreamWriter类, InputStreamReader和OutputStreamWriter类分别继承抽 象类Reader和Writer。InputStreamReader和 OutputStr
18、eamWriter类可以按本地字符集和指定字符集读 写文件。文件中的数据仍按字节读写,InputStreamReader 和OutputStreamWriter流完成字符和字节的转换。 FileReader和FileWriter流采用本地字符集读写文件。1、创建FileReader对象可用下列方法创建FileReader对象: FileReader (File file) 用File对象创建一个FileReader对象,File对象指定实际访问的磁 盘文件。例如: FileReader datain = new FileReader (new File(""); FileR
19、eader (FileDescriptor fdObj) 用FileDescriptor对象创建一个FileReader对象。例如: FileReader datain = new FileReader (); FileReader (String name) 用指定的文件名创建一个FileReader对象。例如: FileReader datain = new FileReader ("d:javatempchapter09");2、FileReader流常用操作FileReader流常用操作如下: getEncoding():返回文件采用的字符集。 close():关闭
20、流。 read():从流读取一个字符,返回值类型为int。若没有可读 数据,返回-1。 read(char b):从流读取字符,按顺序放入b的各个数组元 素中。返方法回值类型为int,表示从流中读取的总的字符数。 若没有可读数据,返回值为-1。 read(char b, int bindex,int count):最多从输入流读取 count个字符,按顺序放入b数组中下标从bindex开始的元素 中。返方法回值类型为int,表示从流中读取的总的字符数。 若没有可读数据,返回值为-1。 skip(long n):在流中跳过n个字符。n不能为负数,否则产 生错误。3、创建FileWriter对象可
21、用下列方法创建FileWriter对象: FileWriter (File file) 用指定File对象创建FileWriter流,向File对象指定的文件输出数据。 该方法始终创建一个新文件。如果已存在同名文件,原文件被 覆盖。File对象指定的是一个文件夹或者文件路径错误,则会 产生FileNotFoundException异常。例如: FileWriter dataout = new FileWriter (new File(""); FileWriter (File file, boolean append) 参数append为false时,与FileWriter
22、 (File file)相同。参数 append为true时,表示向文件添加数据。例如: FileWriter dataout = new FileWriter (new File(""),true);FileWriter (FileDescriptor fdObj) 用FileDescriptor对象创建FileWriter流。例如: FileWriter dataout = new FileWriter (); FileWriter (String name) 用指定文件名创建FileWriter流,向文件输出数据,与FileWriter (File file)方法类似
23、。例如: FileWriter dataout = new FileWriter (""); FileWriter (String name, boolean append) 参数append为false时,与FileWriter (String name)相同。参 数append为true时,表示向文件添加数据。例如: FileWriter dataout = new FileWriter ("",true);4、FileWriter对象操作FileWriter对象常用操作如下: close():关闭FileWriter流。 flush():刷新流,即
24、向流中的数据全部写入文件。 getEncoding():返回文件采用的字符集。 write(int n):向文件写入一个字符,n为字符的Unicode码。 write(char b):将字符数组b 写入文件。 write(char b, int bindex,int count):将字符数组b中下标从bindex开始 的count个元素写入文件。 write(String b):将字符串b写入文件。 write(String b, int index,int count):将字符串b中序号从index开始的 count个字符写入文件。 append(char c):将字符c写入文件。 appe
25、nd(CharSequence b):将字符序列b写入文件。String类型为一个 典型的实现了CharSequence接口的类。 append(CharSequence b, int start,int end):将字符串序列b中下标 start开始到end的字符写入文件。 缓冲流前面前面介绍的字节流和字符流均未使用内存缓冲区,也就是说,每 次读写一个字节或字符都是直接访问文件,这会导致大量数据读写时 频繁访问文件。缓冲输入输出流则是在内存中创建一个缓冲区来缓存 数据。程序只是从缓冲区读取数据,不直接访问文件。输入数据时, 缓冲流在缓冲区为空时自动从文件读取数据填满缓冲区。输出数据时, 数据
26、首先写入缓冲区,缓冲区填满或执行flush方法时,缓冲流将缓 冲的数据写入文件。 Java提供了4种缓冲流,BufferedInputStream和 Java 4 BufferedInputStream BufferedOutputStream用于缓冲字节流,BufferedReader和 BufferedWriter用于缓冲字符流。 可以创建默认大小缓冲区的缓冲流。例如: BufferedReader in = new BufferedReader(new FileReader(""); 也可创建指定大小缓冲区的缓冲流。例如: BufferedWriter out = n
27、ew BufferedWriter(new FileWriter(""),100); 格式化输入输出字节流和字符流只是按字节或字符读写文件。 如果要从读取特定类型的数据,例如读一个 整数,则需要使用Scanner对象。在将特 定类型的数据写入文件,则可使用 PrintWriter或PrintStream对象完成输出。 格式化输入Scanner对象可以按基本数据类型从字符串 或各种输入流中解析数据。1、创建Scanner对象Scanner类的构造方法有两种基本格式: Scanner(数据源) Scanner(数据源,字符集) 创建Scanner对象的数据源可以是一个字符串、F
28、ile对象、 InputStream对象、InputStream子类对象、Readable对象 或ReadableByteChannel对象。例如: Scanner in1=new Scanner("1 one 2 two"); Scanner in2=new Scanner(new File(""); Scanner in3=new Scanner(new FileReader(""); Scanner in4=new Scanner(new FileReader(""); Scanner in5=new Sca
29、nner(new FileInputStream(""); Scanner in6=new Scanner(new BufferedReader(new FileReader("");在创建访问各种流的Scanner对象时,可用一个字符 串指明数据源采用的字符集,默认为本地字符集。 从文件读出字节时,将其转换为指定字符集的字符。 例如: Scanner in2=new Scanner(new File(""),"GB2312"); /指定 采用的字符集 Scanner对象在不使用之后,应调用close方法将其关 闭
30、。例如: in1close();2、从数据源解析数据Scanner对象用一系列的next方法从数据源解析各种类型的数据: next():从数据源读取一个字符串。 nextLine():将当前位置到换行符号之前的全部内容作为一个 字符串返回。 nextBoolean() nextBoolean():从数据源读取一个boolean类型值。 boolean nextByte():从数据源读取一个byte类型值。 nextDouble():从数据源读取一个double类型值。 nextFloat():从数据源读取一个float类型值。 nextInt():从数据源读取一个int类型。 nextLong
31、():从数据源读取一个long类型值。 nextShort():从数据源读取一个short类型值。在使用各种next方法读取数据时,可能会发生下列三 种异常: InputMismatchException:如果下一个标记不 能转换为指定类型的数据,或者超出了数据范围。 NoSuchElementException:数据源中已无数据 可读。 IllegalStateException:Scanner对象已被关闭。 这3种异常属于不检查异常,可以不捕捉处理。 格式化输出PrintStream和PrintWriter类提供了格式化输出方法,可用print、 printf、println和format
32、方法输出各种基本数据类型的数据,也可 输出对象。printf和format方法用法相同,均可使用格式字符串来 控制数据的输出格式。 提示: 提示:关于格式字符串、print、printf和println方法的使用请参考 中的相关内容。 println方法会在输出数据后添加一个换行符号。print、printf和 format方法不自动添加换行符号,可在输出数据中包含换行符号来 实现换行。 PrintStream对象将数据转换为字节流输出,PrintWriter对象将数 据转换为字符流输出。字符和字符串按照默认的本地字符集转换为字 节。可以在创建PrintStream或PrintWriter对象
33、,或者在printf和 format方法中用Locale参数指定转换字符使用的字符集。 如果PrintStream对象在创建时运行自动刷新,则在输出一个字节数 组、调用println方法,或者输出一个换行符号时,可以自动调用 flush方法。PrintWriter对象只会在调用println、printf或format 方法时自动调用flush方法。 命令行输入输出命令行输入输出可、 和Console对象完成。代表标准输入设备,即键盘。 和用法相同,都代表标准输出设备, 即显示器。和的具体用法请参考第2 章节。 Console(控制台)对象即可代表键盘,又可代表显示器,即 可以完成命令行的输入
34、和输出。System对象的console方法 用于获得一个控制台对象实例,例如: Console con = (); 控制台对象可以用printf和format方法输出数据,与 PrintStream对象的printf和format方法相同。类似的,可以 执行flush方法刷新输出,将缓存的控制台对象输出数据输出 到显示器。1、使用Reader对象输入控制台对象的reader方法可以返回一个Reader对 象,再使用Scanner对象即可完成输入。例如:Scanner input= new Scanner(); ("请输入一个字符串、一个整数和一个 小数:"); Strin
35、g str=(); int n=(); double m=(); ("刚输入的数据:n %sn %dn %f n",str,n,m);控制台对象返回的Reader对象与键盘关联,输入 时按回车键结束。2、读一行数据控制台对象的readerLine方法可读取一行数据,即将回车之前 的所有符号作为一个字符串返回。例如: ("请输入一个字符串:"); String str1=(); readerLine readerLine方法可以输出一个提示字符串。例如: String str2=("请输入一个字符串:"); 还可以为readerLine
36、方法指定一个格式化的字符串,与printf 方法参数类似。例如: String str2=("请输入%s的姓名:","汤姆");3、密码输入控制台对象的readPassword方法在输入数据时, 不在显示器上显示输入的数据。例如: char str3=("请输密码:"); readPassword方法返回一个char数组。与 readerLine方法类似,readPassword方法可以 指定一个格式化的字符串作参数。例如: char str3=("请输入用户%s的密码: ","汤姆"); 类型
37、化输入/输出类型化输入/输出指从数据源读/写各种基本 数据类型或String类型的数据。 DataInput和DataOutput接口定义了读/ 写数据流的方法,本节介绍这两个接口的具 体实现类:DataInputStream(数据输入 流)和DataOutputStream.(数据输出 流)。 数据输出流DataOutputStream首先将数据转换为二 进制形式,然后按字节输出。字符或字符串 按照字符的Unicode编码输出。 DataOutputStream输出的数据为二进制 形式,不能直接查看。可以用 DataInputStream从文件读出 DataOutputStream输出的数据
38、。1、创建数据输出流可用一个OutputStream对象,或 OutputStream类的子类对象来创建数据输 出流。例如: DataOutputStream out=new DataOutputStream(new BufferedOutputStream (new FileOutputStream("");2、输出数据DataOutputStream对象可用多种方法输出数据: write(byte b, int start, int n):将字节数组b中从下标start开始的n个元 素写入输出流。参数start和n可以省略,省略时输出数组b中的全部数据。 write(i
39、nt n):将一个字节写入输出流。如果参数n的二进制超过一个字节, 则只将最低字节写入输出流,其他字节被忽略。例如,321的二进制为 101000001,用write输出321时,只将最低8位01000001输出。 writeBoolean(boolean f):将一个boolean值作为一个字节写入输出流,参 数f为true时输出值为1,f为false时输出值为0。 writeByte(int n):将n的最低字节写入输出流。 writeBytes(String s):将字符串中的字符按顺序写入输出流,每个字符 Unicode码的高8位被忽略。 writeChar(int v):将一个字符(
40、两个字节)写入输出流,先输出高8位。 writeChars(String s):将字符串中写入输出流,相等于对每个字符调用 writeChar方法。writeDouble(double v):将一个double类型数据(8个字节)写入 输出流,先输出高8位。 writeFloat(float v):将一个float类型数据(4个字节)写入输出流, 先输出高8位。 writeInt(int v):将一个int类型数据(4个字节)写入输出流,先输 出高8位。 writeLong(long v):将一个long类型数据(8个字节)写入输出流, 先输出高8位。 writeShort(int v):将一
41、个short类型数据(两个字节)写入输出流, 先输出高8位。 writeUTF(String str):将字符串按UTF-8编码格式写入输出流。先 输出字符串长度,占两个字节,然后输出字符串中的字符。 DataOutputStream对象会用一个计数器统计写入输出流的字节数, 可用size方法返回当前已输出的字节数。 数据输入流DataInputStream根据数据类型,从输入 流读取对应的字节数,然后将其转换为对应 数据类型的数据。1、创建数据输入流可用一个InputStream对象或 InputStream类的子类对象来创建数据输 入流。例如: DataInputStream in=new
42、 DataInputStream(new BufferedInputStream (new FileInputStream("");2、输入数据DataInputStream对象可用多种方法读取数据:read(byte b):从输入流读取个字节存入数组。 read(byte b, int start, int n):从输入流读取n个字节,存入数组b 从下标start开始的n个元素中。 readBoolean():读取一个字节,若该字节为非零值,则返回true,否 则返回false。 readByte():读一个字节,转换为byte值。 readChar():读两个字节,作为
43、字符的Unicode码,返回该字符。 readDouble():读8个字节,转换为double值。 readFloat():读4个字节,转换为float值。 readInt():读4个字节,转换为int值。 readLong():读8个字节,转换为long值。 readShort():读两个字节,转换为short值。 readUTF():读一个字符串。首先读两个字节,转换为一个无符号整数, 该数作为要读取的字符个数,然后读取对应个数的字符组成字符串。 对象序列化对象序列化(serialization,也称串行化) 指将对象写入文件,从文件中读出对象称为 序列化读出。包中的 ObjectOutp
44、utStream类提供了序列化概 念,ObjectInputStream类提供了序列化 读出功能。 读写对象各种基本数据类型的数组、字符串和实现了 接口的类对象,都支持序列 化。如果对象的成员也是一个对象,则该成员对象 的类也应该实现Serializable接口,否则对象不能 序列化。要保证一个对象被序列化,对象的类、基 类以及所有的超类,都应该实现Serializable接口。 说明: 说明:被声明为static或transient的成员不会被序 列化。若对象中的某些字段不需要被序列化,则可 将其声明为transient,并为其提供默认的初始值。1、使自定义类支持序列化用户自定义的类只需要实
45、现Serializable接口,其对象便可序 列化。Java序列化的简单指出在于,Serializable接口不包含 任何方法。实现Serializable接口的类对象均按默认方式进行 序列化。 例如,下面是一个实现了Serializable接口的student类: public class student implements 2、将对象写入文件ObjectOutputStream类的构造方法使用一个OutputStream对象 作为参数来指定要访问的文件。例如:ObjectOutputStream out=new ObjectOutputStream(new BufferedOutputS
46、tream (new FileOutputStream("");该语句用一个缓冲的文件输出流对象创建对象输出流。如果为 FileOutputStream构造方法指定参数是目录、路径有错或其他原因 不能创建文件时,会抛出FileNotFoundException异常,应该捕捉处 理或声明方法抛出该异常。FileNotFoundException类是 IOException类的子类,如果处理或声明抛出了IOException异常, 则可同时处理FileNotFoundException异常。 ObjectOutputStream对象的writeObject方法用于将对象写入输出
47、 流。例如:student lm=new student(2008001,"李明","男"); (lm); /输出自定义类对象writeObject方法可能抛出3种异常:InvalidClassException:对象类本身定义有错时抛出 该异常。 NotSerializableException:对象类没有实现 Serializable接口时抛出该异常。 IOException:文件输出发生错误时抛出该异常。前两种异常类都是IOException类的间接子类,如 果要在程序中捕捉处理这两种异常,应将对应的 catch代码块写在IOException异常
48、之前。例如: student lm=new student(2008001,"李明","男"); try (lm); catch(InvalidClassException e) (); catch(NotSerializableException e) (); catch(IOException e) (); /输出自定义类对象3、从文件读出对象与对象输出流类似,ObjectInputStream类的构造方法使用 一个InputStream对象作为参数来指定要访问的文件。例如: ObjectInputStream in=new ObjectInputS
49、tream(new BufferedInputStream (new FileInputStream(""); 该语句用一个缓冲的文件输入流对象创建对象输入流。如果为 FileInputStream构造方法指定参数是目录、路径有错或其他 原因不能创建文件时,会抛出FileNotFoundException异常, 应该捕捉处理或声明方法抛出该异常。 FileNotFoundException类是IOException类的子类,如果处 理或声明抛出了IOException异常,则可同时处理 FileNotFoundException异常。 ObjectInputStream对象
50、的readObject方法用于输入流读取 对象。例如: student lm=(student)();readObject方法返回一个Object类型的对象,所以应将其转换为 相应的数据类型。 readObject方法可能抛出5种异常: ClassNotFoundException:找不到序列化对象的类时抛出该 异常。 InvalidClassException:对象类本身定义有错时抛出该异常。 InvalidClassException StreamCorruptedException:序列化时会向文件写入对象 的控制信息,在读出时,如果控制信息与序列化对象不匹配时 抛出该异常。 Optio
51、nalDataException:流中读出的是基本类型的数据,不 是对象时抛出该异常。 IOException:文件输入发生错误时抛出该异常。ClassNotFoundException类是Exception 类的子类,该异常应单独处理。 InvalidClassException、 StreamCorruptedException和 OptionalDataException类是 IOException类的间接,在使用catch代码 块处理异常时应注意先后顺序。 读写基本类型数据ObjectInputStream类提供了一系列的 read方法从对象输入流读取基本类型数据, 这些方法与Data
52、InputStream类提供的数 据读取方法类似。ObjectOutputStream 类提供了一系列的write方法向对象输出流 写入基本类型数据,这些方法与 DataOouputStream类提供的数据输出方 法类似。 重复序列化对象将一个对象重复写入文件时,默认情况下,文件 中只保存第一次写入的数据。重复写入对象时, 即使对象数据经过了修改,也只在文件中保存指 向第一次写入数据的指针。如果要保存修改之后 的对象,则需要在writeObject方法之前调用 writeObject reset方法。reset方法将对象输出流复位,相当 于没有输出过任何内容,从而可以输出重复的对 象。rese
53、t方法在文件中插入一个复位标志,对象 输入流遇到复位标志时执行复位操作,从而可读 出重复对象。 随机读写文件RandomAccessFile类提供了随机读写文件功能。 RandomAccessFile对象维护一个文件指针,文件指针指向当前读 写位置。执行read或write方法后,文件指针自动向后(文件末尾) 移动。也可在执行read或write方法前,用seek方法设置文件指针 位置。 RandomAccessFile对象在打开文件流之后,允许将数据写入流, 也可从流读出数据。在创建RandomAccessFile对象时,应指定文 件访问模式。创建RandomAccessFile对象的语法格
54、式如下: RandomAccessFile RandomAccessFile raf=new RandomAccessFile(file,mode); 其中,参数file指定访问的文件,可以是一个File对象或描述文件名 的字符串。参数mode是一个字符串,指定文件访问模式。可用下列 访问模式字符串:"r":只允许从文件读数据。若试图向文件写入数据,会产生 IOException异常。 "rw":可读写文件。若文件不存在,会创建一个新文件。 内存映射文件内存映射文件指可以利用系统虚拟内存将文 件或文件的一部分“映射”到内存。这样读 写文件就像访问内存一样
55、,大大提高文件读 写速度。 包中的MappedByteBuffer类用 于实现内存映射。MappedByteBuffer派 生自ByteBuffer类(ByteBuffer类派生自 Buffer类)。 建立内存映射要建立内存映射,首先需要获得文件通道 (FileChannel)。可用FileInputStream、 FileOutputStream或RandomAccessFile类的 getChannel方法获得文件通道。例如: RandomAccessFile raf=new RandomAccessFile("","rw"); FileChanne
56、l fc=(); 然后,调用FileChannel类的map方法建立内存映 射MappedByteBuffer。例如: MappedByteBuffer buffer=( _WRITE,0,512);map方法的第一个参数指定映射模式,第二个参数指 定映射区域在文件中的开始位置,第三个参数指定 缓冲区大小。有三种映射模式: :只能从缓冲区读数据。 若试图将数据写入缓冲区,会抛出 ReadOnlyBufferException异常。 :可读,也可写。对缓 冲区的修改最终会写入文件。 :私有,对缓冲区的修改不 会写入文件。 读/写缓冲区MappedByteBuffer类继承了ByteBuffer
57、和Buffer类的一系列get和put方法来读/写 缓冲区数据。1、读字节数组有两种读字节数组的方法: get(byte a):根据字节数组a的长度,从缓冲区 读出字节存入数组元素。 get(byte a,int start,int n):从缓冲区读出字 节存入下标从start开始的数组元素中,最多读取n 个字节。 例如: byte a=new byte5; (a); (a,2,3);2、写字节数组有两种方法将字节数组写入缓冲区: put(byte a):将字节数组a中的数据写入缓冲区。 put (byte a,int start,int n):将下标从start 开始的n个数组元素写入缓冲区
58、。 例如: byte b=1,2,3,4,5; (b); /输出字 节数组 (b,2,3); /输出 b2、b3、b43、按数据类型读取数据下列方法提供了按数据类型读取数据功能: get():读一个byte类型数据。 getChar():读一个char类型数据。 getShort():读一个short类型数据。 getInt():读一个int类型数据。 getLong():读一个long类型数据。 getFloat():读一个float类型数据。 getDouble():读一个Double类型数据。这些方法不带参数时,从文件指针当前位置读 取数据。读出数据后,文件指针根据数据类 型长度自动修改
59、指针位置。例如: int n=(); /从默认位置读一个int值 也可用一个参数指定读取位置,缓冲区中的第 1个字节的索引位置为0。例如: int n=(5); / 从缓冲区的第5个字节之后开始读一个int值4、按数据类型写数据下列方法提供了按数据类型将数据写入缓冲区: put (byte n):将一个byte类型数据写入缓冲区。 putChar(char c):将一个char类型数据写入缓冲区。 putShort(short n):将一个short类型数据写入缓冲区。 putInt(int n):将一个int类型数据写入缓冲区。 putLong(long n):将一个long类型数据写入缓冲区。 putFloat(float x):将一个float类型数据写入缓冲区。 putDouble(double x):将一个Double类型数据写入缓冲区。这些方法默认在文件指针当前位置写入数据。写入数 据后,文件指针根据数据类型长度自动修改指针位 置。例如: int n=100; (n); / 将100写入缓冲区,文件指针增加4个字节 也可增加一个参数指定数据写入位置。例如: int n=100,index=5; (index,n); / 在第5个字节后写入1005、其他读写控制方法mark():在文件指针当前位置设置一个标 记。 reset():将文件指针指向
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年4月北京门头沟龙泉镇城市协管员招聘1人考前自测高频考点模拟试题及答案详解(典优)
- 2025甘肃天水市第四人民医院编外人员招聘3人模拟试卷及答案详解(名师系列)
- 2025安徽黄山市黄山区消防救援大队政府专职消防员招聘2人模拟试卷附答案详解(黄金题型)
- 2025年甘肃省张掖市市直医疗卫生单位招聘专业技术人员考前自测高频考点模拟试题及一套参考答案详解
- 2025北方工业大学社区卫生服务站招聘1人考前自测高频考点模拟试题及答案详解(全优)
- 2025年临沂市农业学校公开招聘教师(8名)考前自测高频考点模拟试题及完整答案详解1套
- 2025北京中国音乐学院高层次人才引进2人模拟试卷参考答案详解
- 2025江苏苏州市吴江区引进教育重点紧缺人才12人考前自测高频考点模拟试题参考答案详解
- 2025杭州临安区教育局公开招聘中小学教师76人考前自测高频考点模拟试题及答案详解(必刷)
- 2025年高纯超细氧化硅纤维项目合作计划书
- 富士康车间生产管理制度
- 药品批发企业药品专业知识与技能培训
- 公众号文章培训:提升写作技巧与个人风格
- 《水浒传》人物专题系列-鲁智深
- 黄河文化古与今知到智慧树章节测试课后答案2024年秋山东财经大学
- 星间链路抗干扰策略-洞察分析
- 江苏省保安员考试练习100题及答案
- 大学生职业生涯规划与就业指导知到智慧树章节测试课后答案2024年秋西南民族大学
- 友情留言句子
- 《ROHS知识培训》课件
- 第07讲 圆与对称性(5种题型)(解析版)
评论
0/150
提交评论