Java的输入输出.docx

上传人:b****4 文档编号:3913976 上传时间:2023-05-06 格式:DOCX 页数:13 大小:22.01KB
下载 相关 举报
Java的输入输出.docx_第1页
第1页 / 共13页
Java的输入输出.docx_第2页
第2页 / 共13页
Java的输入输出.docx_第3页
第3页 / 共13页
Java的输入输出.docx_第4页
第4页 / 共13页
Java的输入输出.docx_第5页
第5页 / 共13页
Java的输入输出.docx_第6页
第6页 / 共13页
Java的输入输出.docx_第7页
第7页 / 共13页
Java的输入输出.docx_第8页
第8页 / 共13页
Java的输入输出.docx_第9页
第9页 / 共13页
Java的输入输出.docx_第10页
第10页 / 共13页
Java的输入输出.docx_第11页
第11页 / 共13页
Java的输入输出.docx_第12页
第12页 / 共13页
Java的输入输出.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Java的输入输出.docx

《Java的输入输出.docx》由会员分享,可在线阅读,更多相关《Java的输入输出.docx(13页珍藏版)》请在冰点文库上搜索。

Java的输入输出.docx

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(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2