Java的输入输出.docx
- 文档编号:10278468
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:13
- 大小:22.01KB
Java的输入输出.docx
《Java的输入输出.docx》由会员分享,可在线阅读,更多相关《Java的输入输出.docx(13页珍藏版)》请在冰豆网上搜索。
Java的输入输出
JavaI/O關鍵詞
(一)部分
1.File:
描述了文件本身的属性,无关流操作。
ifFile,isAbsolute(绝对路径否),delete,isDirectory,list(字符串形式列出目录内容),listFiles(以File对象数组形式返回文件列表),mkdir,mkdirs(创建目录以及此目录的所有父目录)。
FilenameFilter接口:
Stringlist(FilenameFilterff)
2.InputStream和OutputStream,子节流基础,抛出IOException。
3.FileInputStream:
从文件中读取字节。
FileInputStream可用路径或File对象构造,一旦对象建立,文件就被打开并用于读取。
4.FileOutputStream:
写字节到文件的输出流。
创建一个FileOutputStream对象并不依赖已存在的文件,如果对象创建时文件不存在,构造函数会自动建立这个文件。
5.ByteArrayInputStream:
使用字节数组作为输入。
对应的有ByteArrayOutputStream。
6.过滤的字节流:
如缓冲、字符转化、原始数据转化等。
他们都基于FilterOutputStream和FilterInputStream。
比如缓冲字节流:
BufferedInputStream(其中有mark和reset用来定位值得注意)、BufferedOutputStream和PushbackInputStream(回退:
读取一个字节,然后把它返回到流中);PrintStream提供了格式化的能力;RandomAccessFile不是从InputStream和OutputStream派生的,而是实现了DataInput和DataOutput接口,封装了一个随机存取的文件。
7.字符流:
Reader、Writer
8.FileReader和FileWriter:
文件操作
9.CharArrayReader和CharArrayReader:
以字符数组为源/目标的流
10.BufferedReader和BufferedWriter:
缓冲读写
11.PushBackReader,PrintWriter等。
。
12.使用StreamTokenizer在输入流中寻找模式匹配:
StreamTokenizer(ReaderinStream)
13.序列化:
实现接口Serializable达到序列化的目的,实现Externalizable接口以手工控制序列化和反序列化的工作(readExternal和writeExternal)。
ObjectOutput接口->ObjectOutputStream和ObjectInput接口->ObjectInputStream
(二)部分
1.方便的IO操作是每个成功的语言所必须具有的,但是要有好的IO库可不是件容易的事情,因为不仅有三种不同种类的IO需要考虑(文件、控制台、网络连接),而且需要通过大量不同的方式与它们通信(顺序、随机访问、二进制、字符、按行、按字等等)。
2.Java库的IO类分割为输入与输出两个部分,
通过继承,从InputStream(输入流)衍生的所有类都拥有名为read()的基本方法,用于读取单个字节或者字节数组。
类似地,从OutputStream衍生的所有类都拥有基本方法write(),用于写入单个字节或者字节数组。
然而,我们通常不会用到这些方法;它们之所以存在,是因为更复杂的类可以利用它们,以便提供一个更有用的接口。
因此,我们很少用单个类创建自己的系统对象。
一般情况下,我们都是将多个对象重叠在一起,提供自己期望的功能。
我们之所以感到Java的流库(StreamLibrary)异常复杂,正是由于为了创建单独一个结果流,却需要创建多个对象的缘故。
很有必要按照功能对类进行分类。
库的设计者首先决定与输入有关的所有类都从InputStream继承,而与输出有关的所有类都从OutputStream继承
3.InputStream的类型
1)ByteArrayInputStream(字节数组)
允许内存中的一个缓冲区作为InputStream使用从中提取字节的缓冲区/作为一个数据源使用。
通过将其同一个FilterInputStream对象连接,可提供一个有用的接口
(2)StringBufferInputStream (String对象)
将一个String转换成InputStream一个String(字串)。
基础的实施方案实际采用一个StringBuffer(字串缓冲)/作为一个数据源使用。
通过将其同一个FilterInputStream对象连接,可提供一个有用的接口
(3)文件
FileInputStream用于从文件读取信息代表文件名的一个String,或者一个File或FileDescriptor对象/作为一个数据源使用。
通过将其同一个FilterInputStream对象连接,可提供一个有用的接口
(4)“管道”,它的工作原理与现实生活中的管道类似:
将一些东西置入一端,它们在另一端出来。
(5)一系列其他流,以便我们将其统一收集到单独一个流内。
(6)其他起源地,如Internet
4.OutputStream的类型
(1).ByteArrayOutputStream在内存中创建一个缓冲区。
我们发送给流的所有数据都会置入这个缓冲区。
可选缓冲区的初始大小/用于指出数据的目的地。
若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口
(2).FileOutputStream将信息发给一个文件用一个String代表文件名,或选用一个File或FileDescriptor对象/用于指出数据的目的地。
若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口
5.FilterInputStream类型
(1).DataInputStream,与DataOutputStream搭配使用,可以按照可移植方式从流读取基本数据类型,其构造函数参数为InputStream;
(2).BufferedInputstream,可以防止每次读取是都得进行实际的写操作,代表"使用缓冲区",构造函数参数仍为InputStream;
6.FilterOutputStream类型
(1).DataOutputStream.....
(2).PrintStream,用于产生格式化输出,其中DataOutputStream处理数据的存储,PrintStream处理显示,构造函数参数为OutputStream;
(3).BufferedOutputStream.....
7.Reader和Writer(提供兼容Unicode与面向字符的IO功能)
(1).为了关联"字节"层次结构和"字符"层次结构需要适配器
InputStreamReader可以把InputStream转换为Reader,
OutputStreamReader可以把OutputStream转换为Writer
(2).
FileInputStream对应 FileReader;
FileOutputStream对应FileWriter;
StringBufferInputStream对应 StringReader;
(3).
FilterInputStream对应FilterReader
FilterOutputStream对应FilterWriter
BufferedInputStream对应BufferedReader
BufferedOutputStream对应BufferedWriter
PrintStream对应 PrintWriter
StreamTokenizer对应StreamTokenizer
8..操作Java的IO的一般步骤:
(1).首先创建数据源IO,
(2).然后根据需要创建需要包装的IO类,其构造函数参数为已创建的数据源IO;
(3).操作得到的IO句柄;
示例程序:
我们以创建一个具有缓冲的文件输入流为例,假定需要从磁盘读取文件“E:
\\Java\data.txt”:
//创建一个FileInputStream:
FileInputStreamfileInput=newFileInputStream(“E:
\\Java\data.txt”);
//创建一个BufferedInputStream:
BufferedInputStreambufferedInput=newBufferedInputStream(fileInput);
//现在得到的bufferedInput即是具有缓冲的文件输入流
或者进一步简写如下:
InputStreaminput=newBufferedInputStream(
newFileInputStream(“E:
\\Java\data.txt”));
//现在得到的input即是具有缓冲的文件输入流
9.常见读写示例:
readLine()是BufferedReader类的一个方法,它每次从缓冲里读一行数据。
BufferedReader流能够读取文本行,通过向BufferedReader传递一个Reader对象,来创建一个BufferedReader对象,之所以这样做是因为FileReader没有提供读取文本行的功能.(从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
)
(1).读写文本文件,
程序功能:
读取一文本文件到内存中的String类型变量中,在终端显示内容,并复制内容到另外的文本文件中
packageMyJava.Base;
importjava.io.*;
publicclassTextReaderDemo
{ //下面也可以这样写(Stringargs[])
publicstaticvoidmain(String[]args) throwsIOException//异常处理
{
//读取文件中内容到BufferedReader;
BufferedReaderin=newBufferedReader(new
FileReader("E:
\\Java\\JCreator2.5\\加密解密.txt"));
Stringstr=newString();//定义数组
Strings=newString();//定义数组
while((s=in.readLine())!
=null)//readline()表随指针逐行读取
str+=s+"\n";//表在每行后加一回车,并链接所有内容
in.close();//读取结束后,关闭流
System.out.println(str);
//复制内容到另外的文本文件中
PrintWriterout=newPrintWriter(newBufferedWriter(newFileWriter("E:
\\Java\\JCreator2.5\\加密解密(copyt).txt")));
BufferedReaderoutbfreader=newBufferedReader(newStringReader(str));
//outbfreader.readline()缓冲各个字符,从而提供字符、数组和行的高效读取
while((s=outbfreader.readLine())!
=null)
out.println(s);
out.close();
}
(2).从控制台输入,
Java中从控制台输入比起C++好像复杂多了,毕竟C++只需要cin和cout就行了,Java有点复杂
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
Stringstr=stdin.readLine();
//system.in是终端窗口输入,通俗来说就是键盘输入,有了这句则可以在键盘上进行输入,且输入后的值会保存在str中
//就是先将System.in转化成InputStreamReader类型的,然后在将InputStreamReader转化成BufferedReader类型的;
//BufferedReader:
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取...
InputStreamReader:
InputStreamReader是字节流通向字符流的桥梁:
它使用指定的charset读取字节并将其解码为字符。
它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集...
(3).从内存中读取
StringReaderin2=newStringReader(str);//其中str为String类型
intch;
while((ch=in2.read())!
=-1)//read()读取单一字符。
System.out.printl((char)ch);//强类型转换,并输出
(4).读取二进制文件,读写二进制文件主要是通过字节流,而不是字符流,二进制文件可是图片之类的,下面的程序功能是复制一副图片
packageMyJava.Base;
importjava.io.*;
publicclassBinaryReaderDemo
{
publicstaticvoidmain(String[]args)throwsIOException
{
//读取图片文件数据到InputStream;
// bytebt[1024];
// FileInputStreamin=newFileInputStream(newFile("E:
\\Java\\JCreator2.5\\加密解密.txt"));
Filefile=newFile("C:
\\DocumentsandSettings\\luliuyan_1985\\MyDocuments\\MyPictures\\cs.jpg");
if(!
file.exists()&&!
file.canRead())
{
System.out.println("filedon'texistorfilecannotread!
!
");
System.exit
(1);
}
longlen=file.length();
byte[]buffer=newbyte[(int)len];
FileInputStreamfilein=newFileInputStream(file);
//////////////////////////////////////////////////////////
Filefile2=newFile("E:
\\Java\\JCreator2.5\\cs(copy).jpg");
if(!
file2.exists())
{
file2.createNewFile();
}
FileOutputStreamfileout=newFileOutputStream(file2,true);
intch=0;
///////////////////////////////
//方式一:
/*
while((ch=filein.read())!
=-1)
{
fileout.write(ch);
}
*/
//方式二,执行效率比方式一高:
/*
while((ch=filein.read(buffer))!
=-1)
{
fileout.write(buffer);
}
*/
//方式三:
while((ch=filein.read(buffer,0,(int)len))!
=-1)
{
fileout.write(buffer,0,(int)len);
}
filein.close();
fileout.close();
}
}
7.Java的序列化
(1).序列化的过程就是对象写入字节流和从字节流中读取对象。
将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。
对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。
对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
一:
对象序列化可以实现分布式对象。
主要应用例如:
RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:
java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。
利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。
序列化一个对象可能得到整个对象序列。
java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。
实现java.io.Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。
只有极少数情况下才需要定制代码保存或恢复对象状态。
这里要注意:
不是每个类都可序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系
(2).序列化的实例(过段时间给出集合容器方面知识的小程序)
(三)部分
大家讨论javai/o库很久了,PaleSting也刚发了<<初级JavaI/O综述>>系列文章,但我估计还是有些读者会觉得javai/o库难以琢磨,所以也来凑凑热闹,说说我认为的学习javai/o库要掌握的三个关键知识点。
知识点一:
四大等级结构
java语言的i/o库提供了四大等级结构:
InputStream,OutputStream,Reader,Writer四个系列的类。
InputStream和OutputStream处理8位字节流数据,Reader和Writer处理16位的字符流数据。
InputStream和Reader处理输入,OutputStream和Writer处理输出。
大家一定要到J2SE文档中看看这四大等级结构的类继承体系。
除了这四大系列类,i/o库还提供了少数的辅助类,其中比较重要的是InputStreamReader和OutputStreamWriter。
InputStreamReader把InputStream适配为Reader,OutputStreamWriter把OutputStream适配为Writer;这样就架起了字节流处理类和字符流处理类间的桥梁。
您使用i/o库时,只要按以上的规则,到相应的类体系中寻找您需要的类即可。
知识点二:
适配功能
javai/o库中的继承不是普通的继承;它的继承模式分为两种,其一就是Adapter模式(具体分析请参见<
下面以InputStream类体系为例进行说明。
InputStream有7个直接子类:
ByteArrayInputStream,FileInputStream,PipedInputStream,StringBufferInputStream,FilterInputStream,ObjectInputStream和SequenceInputStream。
前四个采用了Adapter模式,如FileInputStream部分代码如下:
PublicclassFileInputStreamextendsInputStream
{
/*FileDescriptor-handletotheopenfile*/
privateFileDescriptorfd;
publicFileInputStream(FileDescriptorfdObj)
{
SecurityManagersecurity=System.getSecurityManager();
if(fdObj==null){
thrownewNullPointerException();
}
if(security!
=null){
security.checkRead(fdObj);
}
fd=fdObj;
}
//其他代码
}
可见,FileInputStream继承了InputStream,组合了FileDescriptor,采用的是对象Adapter模式。
我们学习i/o库时,主要应该掌握这四个对象Adapter模式的适配源:
ByteArrayInputStream的适配源是Byte数组,FileInputStream的适配源是File对象,PipedInputStream的适配源是PipedOutputStream对象,StringBufferInputStream的适配源是String对象。
其它三个系列类的学习方法与此相同。
知识点三:
Decorator功能
InputStream的其它三个直接子类采用的是Decorator模式,<
FilterInputStream部分代码如下:
PublicclassFilterInputStreamextendsInputStream{
/**
*Theinputstreamtobefiltered.
*/
protectedInputStreamin;
protectedFilterInputStream(InputStreamin){
this.in=in;
}
//其它代码
}
看清楚没有?
FilterInputStream继承了InputStream,也引用了InputStream,而它有四个子类,这就是所谓的Decorator模式。
我们暂时可以不管为什么要用Decorator模式,但我们现在应该知道:
因为InputStream还有其它的几个子类,所以我们可以将其它子类作为参数来构造FilterInputStream对象!
这是我们开发时常用的功能,代码示例如下:
{
//从密钥文件中读密钥
SecretKeykey=null;
ObjectInputStreamkeyFile=newObjectInputStream(
newFileInputStream(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 输入输出