java Io programe summary.docx
《java Io programe summary.docx》由会员分享,可在线阅读,更多相关《java Io programe summary.docx(23页珍藏版)》请在冰豆网上搜索。
![java Io programe summary.docx](https://file1.bdocx.com/fileroot1/2023-2/22/2a25342c-8c42-48c5-83ef-a37ad11d5a4c/2a25342c-8c42-48c5-83ef-a37ad11d5a4c1.gif)
javaIoprogramesummary
目录
JAVAIOPROGRAMESUMARYDocumentRevisionHistory2
相关概念5
流6
文件6
I/O流概述6
I/O流的层次7
1.字节流:
7
2.字符流:
7
3.对象流(系列化)8
4.过滤流8
5.中间流8
6.管道流9
6.其它9
常用流介绍9
File9
文件的顺序处理10
随机访问文件(RandomAccessFile)10
InputStream11
OutputStream12
Reader12
Writer14
BufferedReader和BufferedWriter15
中间流(InputStreamReader和OutputStreamWriter)16
对象的串行化(Serialization)17
串行化的定义17
串行化方法18
I/O操作总结21
JavaIO的一般使用原则:
21
附录22
附录一(javaio设计模式分析)22
附录二(javaFileOperationinHTML)23
附录三(java读取配置文件的几种方法)23
附录四(Java中的异常)23
JAVAIOPROGRAMESUMARYDocumentRevisionHistory
Ver.No.
Ver.Date
PreparedBy
ReviewedBy
ApprovedBy
AffectedSection&SummaryofChange
1.0
November24,2010
Yangxueyong
InitialDraft
相关概念
流
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。
类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。
这时候你就可以想象数据好像在这其中“流”动一样,如下图:
文件
File类:
提供定位本地文件系统、描述文件和目录的功能,是java.io包中引用实际磁盘文件的唯一对象。
I/O流概述
Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示。
并提JAVA.IO包(其中包括一些列类)来对输入/输出进行处理。
其他分类
底层流:
包含以字节的形式读写的方法
高层过滤器流:
用于读写高层信息(层流要求底层流作为基础)
I/O流的层次
1.字节流:
从InputStream和OutputStream派生出来的一系列类。
这类流以字节(byte)为基本处理单位。
◇InputStream、OutputStream
◇FileInputStream、FileOutputStream
◇PipedInputStream、PipedOutputStream
◇ByteArrayInputStream、ByteArrayOutputStream
◇FilterInputStream、FilterOutputStream
◇DataInputStream、DataOutputStream
◇BufferedInputStream、BufferedOutputStream
2.字符流:
从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。
◇Reader、Writer
◇InputStreamReader、OutputStreamWriter
◇FileReader、FileWriter
◇CharArrayReader、CharArrayWriter
◇PipedReader、PipedWriter
◇FilterReader、FilterWriter
◇BufferedReader、BufferedWriter
◇StringReader、StringWriter
3.对象流(系列化)
◇ObjectInputStream、ObjectOutputStream
4.过滤流
FilterInputStream(InputStreamin);
●BufferedInputStream
●DataInputStream
●LineNumberInputStream
●PushbackInputStream
FilterOutputStream(OutputStreamout);
●BufferedOutputStream
●DataOutputStream
●PrintStream
5.中间流
●BufferedReader
●BufferedWriter
6.管道流
●PipedInputStream(PipedOutputStreamsrc);
●PipedOutputStream(PipedInputStreamsnk);
6.其它
◇文件处理:
File、RandomAccessFile;
◇接口
DataInput、DataOutput、ObjectInput、ObjectOutput;
常用流介绍
File
类File提供了一种与机器无关的方式来描述一个文件对象的属性。
下面我们介绍类File中提供的各种方法。
●文件或目录的生成
publicFile(Stringpath);/*如果path是实际存在的路径,则该File对象
/*表示的是目录;如果path是文件名,则该File对象表示的是文件。
*/
publicFile(Stringpath,Stringname);//path是路径名,name是文件名
publicFile(Filedir,Stringname);//dir是路径名,name是文件名
●文件名的处理
StringgetName();//得到一个文件的名称(不包括路径)
StringgetPath();//得到一个文件的路径名
StringgetAbsolutePath();//得到一个文件的绝对路径名
StringgetParent();//得到一个文件的上一级目录名
StringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径
●文件属性测试
booleanexists();//测试当前File对象所指示的文件是否存在
booleancanWrite();//测试当前文件是否可写
booleancanRead();//测试当前文件是否可读
booleanisFile();//测试当前文件是否是文件(不是目录)
booleanisDirectory();//测试当前文件是否是目录
●普通文件信息和工具
longlastModified();//得到文件最近一次修改的时间
longlength();//得到文件的长度,以字节为单位
booleandelete();//删除当前文件
●目录操作
booleanmkdir();//根据当前对象生成一个由该对象指定的路径
Stringlist();//列出当前目录下的文件
文件的顺序处理
类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。
例如,下列的语句段是顺序读取文件名为text的文件里的内容,并显示在控制台上面,直到文件结束为止。
FileInputStreamfis;
try{
fis=newFileInputStream("text");
System.out.print("contentoftextis:
");
intb;
while((b=fis.read())!
=-1)//顺序读取文件text里的内容并赋值
给整型变量b,直到文件结束为止。
{
System.out.print((char)b);
}
}catch(FileNotFoundExceptione){
System.out.println(e);
}catch(IOExceptione){
System.out.println(e);
}
随机访问文件(RandomAccessFile)
对于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。
随机访问文件则允许对文件内容进行随机读/写。
在java中,类RandomAccessFile提供了随机访问文件的方法。
类RandomAccessFile的声明为:
publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput
接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。
如:
readBoolean()、readInt()、readLine()、readFully()等。
接口DataOutput中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。
如:
writeChar()、writeDouble()、write()等。
下面详细介绍RandomAccessFile类中的方法。
◇构造方法:
RandomAccessFile(Stringname,Stringmode);//name是文件名,mode
//是打开方式,例如"r"表示只读,"rw"表示可读写,"
RandomAccessFile(Filefile,Stringmode);//file是文件对象
◇文件指针的操作
longgetFilePointer();//用于得到当前的文件指针
voidseek(longpos);//用于移动文件指针到指定的位置
intskipBytes(intn);//使文件指针向前移动指定的n个字节
InputStream
InputStream类的体系结构
FileInputStream
从实际磁盘文件读取数据
ByteArrayInputStream类
在字节数组中执行读写操作
StringBufferInputStream类
类似于ByteArrayInputStream,将字符串用作内部缓冲器
OutputStream
定义用于写入字节或字节数组的方法。
OutputStream类的体系结构
FileOutputStream类
创建文件(如果文件不存在),并将数据写入文件
ByteArrayOutputStream类:
在内存中创建缓冲器,toByteArray()和toString()方法用于数据检索
FilterOutputStream类
高层输出流
Reader
Reader类是处理所有字符流输入类的父类。
Reader类的体系结构
FileReader
使读取字符文件成为可能
StringReader:
读取字符串的字符
CharArrayReader:
允许将字符数组用作输入
InputStreamReader:
从输入流读取字节,并将它们转换成字符
FilterReader:
允许读取过滤字符流
BufferedReader:
接受Reader对象为参数,并对其添加字符缓冲器
◇读取字符
publicintread()throwsIOException;//读取一个字符,返回值为读取的字符
publicintread(charcbuf[])throwsIOException;/*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/
publicabstractintread(charcbuf[],intoff,intlen)throwsIOException;
/*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/
◇标记流
publicbooleanmarkSupported();//判断当前流是否支持做标记
publicvoidmark(intreadAheadLimit)throwsIOException;
//给当前流作标记,最多支持readAheadLimit个字符的回溯。
publicvoidreset()throwsIOException;//将当前流重置到做标记处
◇关闭流
publicabstractvoidclose()throwsIOException;
Writer
Writer类是处理所有字符流输出类的父类。
Writer类的体系结构
FileWriter:
允许将字符类型数据写入文件
CharArrayWriter:
允许将字符缓冲器用作输出流
PrintWriter:
包含一些使生成格式化输出变得很简单的方法
FilterWriter:
用于写入过滤字符流
BufferedWriter:
将数据缓冲到字符输出流
BufferedReader:
是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。
◇向输出流写入字符
publicvoidwrite(intc)throwsIOException;
//将整型值c的低16位写入输出流
publicvoidwrite(charcbuf[])throwsIOException;
//将字符数组cbuf[]写入输出流
publicabstractvoidwrite(charcbuf[],intoff,intlen)throwsIOException;
//将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流
publicvoidwrite(Stringstr)throwsIOException;
//将字符串str中的字符写入输出流
publicvoidwrite(Stringstr,intoff,intlen)throwsIOException;
//将字符串str中从索引off开始处的len个字符写入输出流
◇flush()
刷空输出流,并输出所有被缓存的字节。
◇关闭流
publicabstractvoidclose()throwsIOException;
BufferedReader和BufferedWriter
◇生成流对象
publicBufferedReader(Readerin);//使用缺省的缓冲区大小
publicBufferedReader(Readerin,intsz);//sz为缓冲区的大小
publicBufferedWriter(Writerout);
publicBufferedWriter(Writerout,intsz);
◇读入/写出字符
除了Reader和Writer中提供的基本的读写方法外,增加对整行字符的处理。
publicStringreadLine()throwsIOException;//读一行字符
publicvoidnewLine()throwsIOException;//写一行字符
【例4-4】
importjava.io.*;
publicclassNumberInput{
publicstaticvoidmain(Stringargs[]){
try{
InputStreamReaderir;
BufferedReaderin;
ir=newInputStreamReader(System.in);
//从键盘接收了一个字符串的输入,并创建了一个字符输入流的对象
in=newBufferedReader(ir);
Strings=in.readLine();
//从输入流in中读入一行,并将读取的值赋值给字符串变量s
System.out.println("Inputvalueis:
"+s);
inti=Integer.parseInt(s);//转换成int型
i*=2;
System.out.println("Inputvaluechangedafterdoubled:
"+i);
}catch(IOExceptione)
{System.out.println(e);}
}
}
运行结果
D:
\>javaNumberInput
123
Inputvalueis123
Inputvaluechangedafterdoubled:
246
注意:
在读取字符流时,如果不是来自于本地的,比如说来自于网络上某处的与本地编码方式不同的机器,那么我们在构造输入流时就不能简单地使用本地缺省的编码方式,否则读出的字符就不正确;为了正确地读出异种机上的字符,我们应该使用下述方式构造输入流对象:
ir=newInputStreamReader(is,"8859_1");
采用ISO8859_1编码方式,这是一种映射到ASCII码的编码方式,可以在不同平台之间正确转换字符。
中间流(InputStreamReader和OutputStreamWriter)
java.io包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。
◇生成流对象
publicInputStreamReader(InputStreamin);
/*in是字节流,而InputStreamReader是字符流,但是其来源是字节流in,
因此InputStreamReader就可以把字节流in转换成字符流处理。
/*
publicInputStreamReader(InputStreamin,Stringenc)throwsUnsupportedEncodingException;
/*enc是编码方式,就是从字节流到字符流进行转换时所采用的编码方式,
例如ISO8859-1,UTF-8,UTF-16等等*/
publicOutputStreamWriter(OutputStreamout);
/*out是字节流,而OutputStreamReader是字符流*/
publicOutputStreamWriter(OutputStreamout,Stringenc)throwsUnsupportedEncodingException;//enc是编码方式
InputStreamReader和OutputStreamWriter的方法:
◇读入和写出字符
基本同Reader和Writer。
◇获取当前编码方式
publicStringgetEncoding();
◇关闭流
publicvoidclose()throwsIOException;
对象的串行化(Serialization)
串行化的定义
1.什么是串行化
对象的寿命通常随着生成该对象的程序的终止而终止。
有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。
我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistence)。
对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。
2.串行化的目的
串行化的目的是为java的运行环境提供一组特性,其主要任务是写出对象实例变量的数值。
串行化方法
在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。
1.定义一个可串行化对象
publicclassStudentimplementsSerializable{
intid;//学号
Stringname;//姓名
intage;//年龄
Stringdepartment//系别
publicStudent(intid,Stringname,intage,Stringdepartment){
this.id=id;
this.name=name;
this.age=age;
this.department=department;
}
}
2.构造对象的输入/输出流
要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。
在ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
Studentstu=newStudent(981036,"LiuMing",18,"CSD");
FileOutputStreamfo=newFileOutputStream("data.ser");
//保存对象的状态
ObjectOutputStreamso=newObjectOutputStream