版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 Java的I/O流和异常处理4.1 I/O流概述4.2 字节级输入输出流4.3 字符流的处理4.4 文件处理4.5 对象序列化4.6 异常及其处理4.7 自定义异常4.8 本章小结第四章 Java的I/O流和异常处理学习导读 本章将介绍Java中的几种I/O流方法和应用,以及文件处理、对象序列化和Java中异常的编写和处理。4.1 I/O流的概念流是指流动的数据序列,可分为输入流和输出流。在程序设计语言中,流式输入输出是一种常见的输入输出方式。它是一个比文件更加广泛的概念。输入流用来把数据从计算机外的数据源输入到计算机。例如从键盘,扫描仪,摄像头,网络等数据源输入数据。输出流是将计算机
2、中的数据输出到外部设备的流。例如将要打印的信息发送到打印机,将计算的结果显示到显示设备上流的最大特点就是所有数据的传输都是按照数据序列的顺序进行的。每个数据必须等待排在它前面的数据读入或送出之后才能被读写Java中采用类的方式实现I/O流。I/O流的概念在Java中标准的输入设备是键盘,标准的输出设备是终端或显示器。他们分别对应System类中的变量in,out和err。这三个变量在System类中的声明如下:public static final InputStream inpublic static final PrintStream outpublic static final Prin
3、tStream err对于PrintStream类最常用的两个方法为:public void print();public void println();这两个方法的主要区别在于print()方法输出的字符串不自动换行,除非在待输出的字符串结尾有换行符n。println()方法那么在输出字符串后进行换行操作。I/O流的概念public class TestPrint public static void main(String args) System.out.print(Hello Java.); System.out.print(Hello Jack.n); System.out.prin
4、tln(Hello Tom.); System.out.println(Hello Jerry.); Print语句输入内容到屏幕上,但是不换行,所以前两print语句输出的内容在同一行中后两输出语句会自动在输出完毕后加上换行符,所以后两输出语句应该分别输出到两行InputStream类层次结构虚线框表示的类可以翻开某个具体的数据源或目标流,进行读写实线框表示的类可以连接到其他数据流,执行数据转换、缓存和过滤等处理。以下同。OutputStream类层次这两个类直接继承了Object类,InputStream和OutputStream都是抽象类,它们分别是其他所有字节输入流(7个)和字节输出流
5、(5个)的超类。 InputStream的方法从流中读取数据 abstract int read( ); /从输入流读取下一个字节,-1表示输入结束,这是一个阻塞方法int read( byte b ); /从输入流读取一组数据存入缓冲区b中。返回读取的字节个数,-1表示结束。int read( byte b , int off, int len ); /从输入流读取最多len字节数据存入缓冲区b中,并从数组b的第off个位置开始存放int available( ); /返回输入流中无需阻塞可直接读取字节个数long skip( long n ); /从输入流中忽略n和字节的数据,返回实际忽略
6、的字节个数InputStream的方法(cont.)关闭流close( ); /关闭输入流使用输入流中的标记void mark( int readlimit); /在输入流中标记当前位置,以后可调用reset方法返回该位置,参数readlimit设置调用mark方法后可以读取的最大字节数且保持mark标记有效,并非所有的流都支持mark和reset方法void reset( ); /重置流的读取位置,回到上次调用mark方法标记的位置boolean markSuppont( ); /检测输入流是否支持mark和reset方法OutputStream的方法输出数据abstract void wr
7、ite( int b ); /向输出流写入一个字节,写出 字节为整数b的低字节,其高3个字节被忽略void write( byte b ); /把缓冲区b中的全部数据写入输出流void write( byte b , int off, int len ); /把缓冲区b中从boff开始的len个字节的数据写入输出流void flush( ) /刷新输出流,强制输出所有被缓存的字节void close( ); /关闭输出流在实际应用中,常用InputStream和OutputStream类的引用指向它们的具体实现的子类对象。4.2 字节级输入输出流(1)PipedInputStream和Pipe
8、dOutputStream类(2)DataInputStream和DataOutputStream类(3)FileInputStream和FileOutputStream类(1)管道流管道用来把一个程序、线程或代码块的输出连接到另一个程序、线程或代码块的输入管道输入流作为一个通信管道的接收端,管道输出流作为发送端。在使用管道之前,管道输出流和管道输入流必须进行连接。(1)管道流(cont.)PipedInputStream和PipedOutputStream类 这两个流用于进程之间的通信。一个PipedInputStream必须连接一个PipedOutputStream,同样一个PipedOu
9、tputStream也必须连接一个PipedInputStream。两个类可以在实例化的时候建立连接,或者调用Connect()方法建立连接。两种建立连接的方法:(1)在构造方法中连接PipedInputStream pis = new PipedInputStream();PipedOutputStream pos = new PipedOutputStream(pis);(2)用connect()方法进行连接PipedInputStream pis = new PipedInputStream();PipedOutputStream pos = new PipedOutputStream(
10、);pis.connect(pos);在构造方法中连接:PipeInputStream(PipeOutputStream src);PipeOutputStream(PipeInputStream snk);用connect()方法进行连接类PipeInputStream中定义为:void connetc(PipeOutputStream src);类PipeOutputStream中定义为:void connect(PipeInputStream snk);(1)管道流(cont.)(2)数据输入输出流DataInputStream以与机器无关的方式从一个输入流中读取Java的根本类型的数据
11、,所读的数据应该是由DataOutputStream对象写入的。DataInputStream的构造方法和一些重要的方法如下:public DataInputStream(InputStream in)public final Boolean readBoolean() throws EOFExceptionpublic final byte readByte() throws EOFException, IOExceptionpublic final char readChar() throws EOFException, IOExceptionpublic final int readIn
12、t() throws EOFException, IOExceptionpublic final String readUTF() throws EOFException, IOException(2)数据输入输出流DataOutputStream类向输出流中写入Java的根本数据类型,所写数据的方式是可移植的,与具体的操作系统无关,它们只能由DataInputStream类读取。DataOutputStream的构造方法和一些重要方法如下:public DataOutputStream(OutputStream out)public final void writeBoolean(boole
13、an v) throws IOExceptionpublic final void writeByte(int v) throws IOExceptionpublic final void writeChar (int v) throws IOExceptionpublic final void writeInt(int v) throws IOExceptionpublic final void writeUTF (String str) throws IOException(3)文件输入输出流FileInputStream类是从InputStream类中派生出来的输入流,它可以处理简单的文
14、件输入操作。其构造方法如下:public FileInputStream(String filename);public FileInputStream(File file);FileOutputStream类是从OutputStream类中派生出来的输出流,它可以简单地向文件写入数据。其构造方法如下:public FileOutputStream(String filename);public FileOutputStream(File file);这两个类用来进行文件I/O处理,由它们所提供的方法可以翻开本地主机上的文件,并进行顺序的读/写。通过类File对象或者一个表示文件名的字符串可以
15、生成文件输入出流,在流对象被生成的同时,文件被翻开,然后就可以进行文件读写。在生成类FileOutputStream的对象时,如果指定的文件不存在,那么创立一个新文件,否那么原文件的内容会被新写入的内容覆盖。在进行文件的读写操作时,会产生IOException异常,属于非运行时异常,必须捕获或声明抛弃。一个文件输入/输出流的例子 FileInputStream fis; try fis = new FileInputStream( text );( content of text is : ); int b; while( (b=()!=-1 ) ( (char)b ); catch( Fil
16、eNotFoundException e )( e ); catch( IOException e )( e ); 4.3 字符流的处理在Java中,定义了专门用于处理字符数据输入输出的抽象类Reader和Writer类,它们与InputStream和OutputStream类很相似,也有很多子类,用于处理字符数据输入输出。4.3 字符流的处理Reader类和Writer类是所有字符流的超类,它们是直接继承Object类的抽象类,可读写16位的字符流。它们与字节流的区别在于其处理数据的方式,字节流按字节来处理数据,而文本数据可能采用各种不同的字符编码方式,可能是单字节字符,也可能是多字节字符,
17、因而要借助于字符流来处理文本类信息。(1)BufferedReader类读入字符数据BufferedReader从字符输入流中读取文本。其构造方法如下:public BufferedReader(Reader in)利用BufferedReader类可以从字节型流例如:等中读出字符数据。Java提供了一个将字节流转换成字符流的类InputStreamReader。其构造方法如下:public InputStreamReader(InputStream in)因此,使用如下方法声明BufferedReader对象就可以使BufferedReader对象具有从字节数据中读出字符数据的能力。Buff
18、eredReader reader = new BufferedReader(new );(1)BufferedReader类读入字符数据生成流对象public BufferedReader(Reader in);public BufferedReader(Reader in, int sz);public BufferedWriter(Writer out);public BufferedWriter(Writer out, int sz);除了Reader和Writer中提供的根本的读写方法外,还增加了整行字符的读/写。 public String readLine() throws IO
19、Exception; public void newLine() throws IOException;(1)BufferedReader类读入字符数据import .*;public class TestCharIO public static void main(String args) (请输入字符串:n); BufferedReader reader = new BufferedReader(new ); String a = null; try a = (); catch(Exception e) (); (您输入的字符串为: + a); 从键盘输入中读取一行输入数据(1)Buffe
20、redReader类读入字符数据该程序运行结果如下:(1)BufferedReader类读入字符数据 利用BufferedReader还可以读取文本文件中的字符数据,但BufferedReader无法直接和文本文件关联。必须通过一个桥梁类FileReader。FileReader类的构造方法如下:public FileReader(String filename) throws FileNotFoundExceptionpublic FileReader(File file) throws FileNotFoundExceptionFilereader类在BufferedReader流和实际数
21、据文件之间起连接作用。利用如下方法声明的BufferedReader对象能够读取文本文件中的字符数据。BufferedReader reader = new BufferedReader(new );(1)BufferedReader类读入字符数据import .*;public class TestCharIO public static void main(String args) String a = null; try BufferedReader reader = new BufferedReader(new ); a = (); catch(Exception e) (); Sys
22、tem.out.println(a); (1)BufferedReader类读入字符数据文本文件内容:读取后的结果:从键盘接收输入的数据Java程序不能直接从键盘接受整型数,浮点数等Java的根本类型,只能直接接受字符或者字符串,如果读取整数等类型,需要进行类型转换。 从键盘接收输入的数据InputStreamReader ir;BufferedReader in;ir=new );in=new BufferedReader(ir);String s=();System.out.println(“Input value is: +s);int i = Integer.parseInt(s);/
23、转换成int型i*=2; System.out.println(“Input value changed after doubled: +i);注意:在读取字符流时,如果不是来自于本地的,比方说来自于网络上某处的与本地编码方式不同的机器,那么我们在构造输入流时就不能简单地使用本地缺省的编码方式,否那么读出的字符就不正确;为了正确地读出异种机上的字符,我们应该使用下述方式构造输入流对象: ir = new InputStreamReader(is, “8859_1);采用ISO 8859_1编码方式,这是一种映射到ASCII码的编码方式,可以在不同平台之间正确转换字符。(2)BufferedWr
24、iter输出字符数据BufferedWriter类用来创立一个字符输出流。该类提供了以字符的形式写数据的方法。Java中BufferedWriter类的构造方法如下: public BufferedWriter(Writer out)利用BufferedWriter可以向文本文件中写入字符数据,但BufferedWriter无法直接与文本文件建立连接。必须通过FileWriter类把BufferedWriter流与文本文件关联起来。FileWriter类的构造方法如下:Public FileWriter(File file) throws IOExceptionPublic FileWrite
25、r(String filename) throws IOExceptionPublic FileWriter(String filename, boolean append) throws IOException以如下方式构造的BufferedWriter对象可以向文本文件中写入字符数据:BufferedWriter writer = new BufferedWriter(new );(2)BufferedWriter输出字符数据import .*;public class TestCharIO public static void main(String args) String a = 你
26、好啊!; try BufferedWriter writer = new BufferedWriter(new ); writer.write(a); (); (已经将信息写入); catch(Exception e) (); (2)BufferedWriter输出字符数据程序运行如下:最后写入的效果:(2)BufferedWriter输出字符数据利用PrintWriter类与BufferedWriter类结合可以将各种类型数据以字符的形式保存到文本文件中。PrintWriter类的方法不会抛出任何异常,只能使用checkError()方法来检查是否发生了错误,其构造方法如下:public P
27、rintWriter(Writer out)public PrintWriter(Writer out, boolean autoFlush)import .*;public class TestCharIO public static void main(String args) String a = 你好啊!; double b = 7.138; char c= G;(2)BufferedWriter输出字符数据int d = 10; try PrintWriter pw = new PrintWriter(new BufferedWriter(new ); pw.println(a);
28、pw.println(b); pw.println(c); pw.println(d); if () (在向文件中写入数据时发生错误!);(2)BufferedWriter输出字符数据else (数据已写入文件中!); catch(Exception e) (); (2)BufferedWriter输出字符数据程序运行如下:程序运行结果:4.4 文件处理File类:用户通过该类可以实现新建,删除文件或目录以及获取文件或目录各种属性的功能。public File(String pathname):pathname是要创立的File对象的文件名或目录名及其路径。其中,路径可以是绝对路径也可以是相对
29、路径。File s1 = new File (“);File s2 = new File (“); /s2表示的是当前目录下myjava子目录下的文件。4.4 文件处理(cont.)public File(String parent, String child):parent表示要创立的File对象的文件或目录的绝对路径或相对路径,child表示文件名或目录名。File s3 = new File(“c:java, );public File(File parent, String child): parent表示要创立的File对象的文件或目录所在的目录的File对象,child表示文件名或
30、目录名。File myDir = new File(“c:java);File s4 = new File(myDir, );public String getName():返回文件或目录名。4.4 文件处理(cont.)public String getPath():返回文件或目录的路径。public String getParent():返回文件或目录的父目录的路径,如果不存在那么返回null。public boolean isDirectory():判断该File对象是否为目录名,如果是那么返回true。public boolean isFile():判断该File对象是否为文件名,如果
31、是那么返回true。public boolean exists():判断该文件或目录是否存在,如果存在那么返回true。public boolean canRead ():判断文件是否为可读文件,如果是那么返回true。4.4 文件处理(cont.)public boolean canWrite():判断文件是否为可写文件,如果是那么返回true。public boolean delete():删除该File对象代表的文件或目录。如果删除成功那么返回true。当删除对象为目录时,目录必须为空才能被删除。public boolean createNewFile():当File对象对应的文件不存在
32、时,利用该方法可以创立以该File对象对应的文件名为文件名的空文件。public boolean mkdir():当File对象对应的目录不存在时,利用该方法可以创立以该File对象对应的目录名为目录名的空目录。4.4 文件处理(cont.)import .*;public class TestFile public static void main(String args) throws IOException File file = new File(Test); if( !() ) (); File nextFile = new File(file,minghehe); if( !()
33、) (); ( () );4.4 文件处理(cont.) if( () ) File newFile = new ); if( !() ) (); (); (); for(int i = 0;i 5;i+) File listFile = new File(nextFile,ming+i+.txt); if( !() ) (); String list = (); for(int j = 0;j list.length;j+) System.out.println(listj); 4.4 文件处理(cont.)运行结果如以下图所示拷贝文件例子4.4.1 随机存取文件public class R
34、andomAccessFile extends Object implements DataInput, DataOutput接口DataInput中定义的方法主要包括从流中读取根本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt()、readLine() 、readFully()等。接口DataOutput中定义的方法主要是向流中写入根本类型的数据、或者写入一定长度的字节数组。如:writeChar()、writeDouble()、write()等。不同于FileInputStream和FileOutputStream,RandomAcces
35、sFile既可以读取一个wemoam,也可以写入一个文件。为什么可以这样呢?4.4.1 随机存取文件(cont.)构造方法:RandomAccessFile(String name,String mode);RandomAccessFile(File file,String mode);例子: File f=new File(“readFile); RandomAccessFile rafR=new RandomAccessFile (f,r); RandomAccessFile rafRW=new RandomAccessFile (“ReadWriteFile,“rw); 文件指针的操作l
36、ong getFilePointer( ); /获取当前的文件指针void seek( long pos ); /将文件指针设置到指定的位置int skipBytes( int n ); /将文件指针前移指定的字节数一个随机访问文件的例子import .*;public class RandomAccessFileTest public static void main(String args) try RandomAccessFile raf = new RandomAccessFile(f001, rw); /写之前,指针位置 ( Pointer(before write): + ();
37、/写入256字节 for(int i=0; i256; i+) raf.writeByte(i); /写之后,指针位置 ( Pointer(after write): + (); /将文件指针移到文件头 raf.seek(0); ( Pointer(after seek): + (); 一个随机访问文件的例子(cont.) /读取一个字节 int read = (); System.out.println(read = + read); ( Pointer(after read): + (); /跳过10个字节 raf.skipBytes(10); ( Pointer(after skip):
38、 + (); /再读取一个字节 int read2 = (); System.out.println(read2 = + read2); (); catch(IOException e) System.err.println(e); 4.4.2 过滤流过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。public class FilterInputStream e
39、xtends InputStreampublic class FilterOutputStream extends OutputStream4.4.2 过滤流为了使用一个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。例如:FilterInputStream( InputStream in );FilterOutputStream( OutputStream out ); 这两个类的子类才真正实现了数据的转换。4.4.2 过滤流(cont.)BufferedInputStream和BufferedOutputStream属于字节流Fil
40、terInputStream和FilterOutputStream的子类。这两个类实现了带缓冲的过滤流,由于提供了缓冲机制,把任意的输入流或者输出流“捆绑到缓冲流上会获得性能的提高。在初始化BufferedInputStream和BufferedOuputSream时,除了要指定所连接的输入出流外,还可以指定缓冲区的大小。缺省使用32字节大小的缓冲区。通常程序中指定的缓冲区大小应是内存页或磁盘块等的整数倍,最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间、机器的配置等。一般可选8192字节或者较小的缓冲区以提高性能。 对于BufferedInputStream,当读取数据时,数据按块读入
41、缓冲区,其后的读操作那么直接访问缓冲区。在使用BufferedOutputStream进行输出时,数据首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。用该类所提供的方法flush()可以强制将缓冲区的内容全部写入输出流。利用这些缓冲输入输出流可以减少读写次数,提高程序的输入输出性能。通过使用过滤流拷贝文件package chp4;import .*;public class FilterStreamTest public FilterStreamTest() public static void main(String args) String srcfile = src/chp4
42、/FilterStreamTest.java; String destfile = src/ch4/FilterStreamTest.bak; FileInputStream fin = null; BufferedInputStream bin = null; FileOutputStream fout = null; BufferedOutputStream bout = null; int b = 0; try fin = new FileInputStream(srcfile); /底层的输入流 /把输入流和过滤流连接起来 bin = new BufferedInputStream(f
43、in); /预先在缓冲区存储来自连接输入流的数据,该缓冲区中的数据自动从底层输入流中补充。 fout = new FileOutputStream(destfile); /把输出流和过滤流连接起来 bout = new BufferedOutputStream(fout); /预先在内部缓冲区存储输出数据 while ( (b = bin.read() != -1) /数据将从缓冲区中移出而不是底层的输入流 bout.write(b); /把输出缓冲区刷空,数据一次性写到底层的输出流 bout.flush();/把输出缓冲区刷空,如果不使用flush(),那么缓冲区的内存就会丧失,目标文件和原
44、文件就会不一致。 /关闭流 bin.close(); fin.close(); (); bout.close(); (程序正确执行完毕.); catch (FileNotFoundException ex) (文件没有找到.); catch (IOException ex) System.out.println(IO异常.); finally /finally语句块在异常处理中将介绍 try if (fin != null) fin.close(); if (bin != null) bin.close(); if (fout != null) (); if (bout != null) bo
45、ut.close(); catch (IOException ex) System.out.println(IO异常.); 4.4.2 过滤流(cont.)DataInputStream 和 DataOutputStream它们不仅能读取数据流,而且能读写各种各样的Java语言的内构类型:boolean,int,float等。这些内构类型在文件中的表示方式和它们在内存中的一样,无需多余转换 。public class DataInputStream extends FilterInputStream implements DataInput4.4.2 过滤流(cont.)DataInputSt
46、reambytereadByte() longreadLong()doublereadDouble()DataOutputStreamvoidwriteByte(byte)voidwriteLong(long)voidwriteDouble(double)一个数据输入/输出流的例子package chp4;import .*;public class DataStreamTest public DataStreamTest() public static void main(String args) boolean b=false; int i=20; char c=中; double d=1
47、.1; String filename=src/chp4/example.dat; FileOutputStream fout=null; FileInputStream fin=null; DataInputStream din=null; DataOutputStream dout=null;try fout = new FileOutputStream(filename); dout=new DataOutputStream(fout); /把数据写入文件 dout.writeBoolean(b); dout.writeInt(i); dout.writeChar(c); dout.wr
48、iteDouble(d); (); (); (); /把数据从文件中读出来 fin= new FileInputStream(filename); din= new DataInputStream(fin); (); (); (); (); catch (FileNotFoundException ex) (文件不存在.); System.out.println(ex); catch(IOException ex) System.out.println(IO异常.); System.out.println(ex); 4.4.2 过滤流(cont.)LineNumberInputStream除了
49、提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。PushbackInputStream提供了一个方法可以把刚读过的字节退回到输入流中。PrintStream打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流。PushbackInputStream例子package chp4;import .*;public class PushbackTest public PushbackTest() public static void main(String args) String srcfile = src/chapter10/Pushbac
50、kTest.java; String dest = src/chapter10/PushbackTest.bak; int idNum = 0; try FileInputStream fis = new FileInputStream(srcfile); PushbackInputStream pis = new PushbackInputStream(fis); FileOutputStream fout=new FileOutputStream(dest); PrintStream ps=new PrintStream(fout);int data;do data = (); while
51、 (data != -1 & !( (char) data); pis.unread(data); while ( (data = () != -1) if ( (char) data) ( (char) data); else idNum+; (); do data = (); while (data != -1 & !( (char) data); pis.unread(data); System.out.println(find: + idNum + words); catch (FileNotFoundException ex) System.out.println(ex); catc
52、h (IOException ex) System.out.println(ex); 4.4.3 内存的读写ByteArrayInputStream 8位ByteArrayOutputStream 8位StringBufferInputStream 16位ByteArrayInputStream(bytebuf)ByteArrayInputStream(bytebuf, intoffset, intlength)4.4.4 顺序输入流包中提供了类SequenceInputStream,使应用程序可以把几个输入流顺序连接起来,在程序员看来,就是一个较长的流而已。例如I/O异常进行I/O操作时可能
53、会产生I/O异常,属于非运行时异常,应该在程序中处理。如:FileNotFoundException, EOFException, IOException流结束的判断read()返回-1。readXXX()readInt()、readByte()、readLong()、readDouble()等;产生EOFException。readLine( )返回null。4.5 对象序列化对象的寿命通常随着生成该对象的程序的终止而终止。有时候,需要将对象的状态保存下来,在需要时,再将对象恢复。对象记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值
54、来记录自己,这个过程叫对象的串行化(Serialization)。4.5 对象序列化(cont.)包中的接口Serializable用来作为实现对象串行化的工具,只有实现了Serializa ble的类的对象才可以被串行化。Serializable接口中没有任何的方法。当一个类声明要实现Serializable,只是说明该类参加串行化协议,而不需要实现任何特殊的方法4.5 对象序列化(cont.)ObjectOutputStream类用于将已实现Serializable接口的对象写入到输出流中。该类的构造方法如下: Public ObjectOutputStream(OutputStream
55、out) throws IOException 使用它的writeObject()方法可以直接将对象保存到输出流中。ObjectInputStream类用于读出由ObjectOutputStream写入的对象,只有支持Serializable接口的对象才可以从这个流中读出。ObjectInputStream类的构造方法如下: Public ObjectInputStream(InputStream in) throws IOException 使用它的readObject()方法可以直接读取一个对象。4.5 对象序列化(cont.)import .*; /定义一个可串行化对象class Per
56、sonalInfo implements Serializable private String name; private String sex; private int age; public PersonalInfo(String _name, String _sex, int _age) name = _name; sex = _sex; age = _age; 声明一个实现Serializable接口的类,该类包括三个属性:name,sex,age4.5 对象序列化(cont.) public String toString() return new String(Name is:
57、+ name + , Sex is: + sex + ,Age is: + Integer.toString(age); public class TestSerializable public static void main(String args) int a = 10; String b = 你好吗?;4.5 对象序列化(cont.) try ObjectOutputStream oos = new ObjectOutputStream(new ); oos.writeInt(a); oos.writeUTF(b); /保存对象状态 oos.writeObject(new Person
58、alInfo(Jack, 男, 24); (); (对象序列化已输出完毕!); ObjectInputStream ois = new ObjectInputStream(new ); int reada = ();4.5 对象序列化(cont.) String readb = (); /恢复对象状态 PersonalInfo personalInfo = (PersonalInfo)ois.readObject(); ois.close(); System.out.println(序列化对象已读入完毕!显示如下:); System.out.println(整数为: + Integer.toS
59、tring(reada); System.out.println(字符串为: + readb); System.out.println(对象为: + personalInfo.toString(); catch(Exception e) System.out.println(e.toString(); 4.5 对象序列化(cont.)程序运行结果如下:串行化的本卷须知串行化能保存的元素只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。串行化的本卷须知transient关键字对于某些类型的对象,其状态是瞬时的,这
60、样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明。另外,对于某些需要保密的字段,或者不应简单的不加处理的保存下来的,为了保证平安性,应该在某些字段前加上transient关键字。 定制串行化缺省的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的升序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。例如4.6 异常及其处理异常:在程序运行过程中发生的错误,这些
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年物联网市场合作协议书
- 2024-2025学年广东省深圳市罗湖区四年级(上)期末数学试卷
- (新版)初级消防设施操作员《基础知识》考试题库完整版
- 2025年书面离婚合同协议(4篇)
- 2025年五年级班主任管理工作心得体会(6篇)
- 2025年中班幼儿园教师个人年终工作总结模版(二篇)
- 2025年中草药植物购销合同模板(三篇)
- 2025年产品委托代理协议范文(2篇)
- 2025年个人木材买卖合同范文(2篇)
- 2025年个人车辆租赁协议(五篇)
- 2025年有机肥行业发展趋势分析报告
- 中央2025年中国文联所属单位招聘14人笔试历年参考题库附带答案详解
- 学生作文稿纸(A4打印)
- 2024美团共享出行加盟合同
- 2023-2024年员工三级安全培训考试题及参考答案(综合题)
- 2024年人教版初中英语九年级全册单元测评与答案
- 永州市2025届高三高考第二次模拟考试(二模)语文试卷(含答案)
- 国学智慧与健康幸福人生(课件)
- 【渞法】学会自我保护教学设计 七年级道德与法治下册(统编版2024)
- 2025-2030年中国融雪剂行业运行动态及发展前景预测报告
- DB31∕T 1043-2017 暴雨强度公式与设计雨型标准
评论
0/150
提交评论