信息发布软件,b2b软件,广告发布软件

标题: Java编程中的IO系统和多实例分解教程 [打印本页]

作者: 信息发布软件    时间: 2016-10-21 14:28
标题: Java编程中的IO系统和多实例分解教程

一. Input和Output

 1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:

1.1 以字节为导向的stream

 以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面        几种类型:

1) input stream:

1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用

2) StringBufferInputStream:把一个String对象作为InputStream

3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作

4) PipedInputStream:实现了pipe的概念,主要在线程中使用

5) SequenceInputStream:把多个InputStream合并为一个InputStream

2) Out stream

1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

2) FileOutputStream:把信息存入文件中

3) PipedOutputStream:实现了pipe的概念,主要在线程中使用

4) SequenceOutputStream:把多个OutStream合并为一个OutStream

1.2 以Unicode字符为导向的stream

 以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:

1) Input Stream

1) CharArrayReader:与ByteArrayInputStream对应

2) StringReader:与StringBufferInputStream对应

3) FileReader:与FileInputStream对应

4) PipedReader:与PipedInputStream对应

2) Out Stream

1) CharArrayWrite:与ByteArrayOutputStream对应

2) StringWrite:无与之对应的以字节为导向的stream

3) FileWrite:与FileOutputStream对应

4) PipedWrite:与PipedOutputStream对应

 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

1.3 两种不现导向的stream之间的转换


 InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。

2. stream添加属性

2.1 “为stream添加属性”的作用

 运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。

如果我们要往一个文件中写入数据,我们可以这样操作:


FileOutStreamfs=newFileOutStream(“test.txt”);


 然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。

2.2FilterInputStream的各种类型

2.2.1用于封装以字节为导向的InputStream

1)DataInputStream:从stream中读取基本类型(int、char等)数据。

2)BufferedInputStream:使用缓冲区

3)LineNumberInputStream:会记录inputstream内的行数,然后可以调用getLineNumber()和setLineNumber(int)

4)PushbackInputStream:很少用到,一般用于编译器开发

2.2.2用于封装以字符为导向的InputStream

1)没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream

2)BufferedReader:与BufferedInputStream对应

3)LineNumberReader:与LineNumberInputStream对应

4)PushBackReader:与PushbackInputStream对应

2.3FilterOutStream的各种类型

2.2.3用于封装以字节为导向的OutputStream

1)DataIOutStream:往stream中输出基本类型(int、char等)数据。

2)BufferedOutStream:使用缓冲区

3)PrintStream:产生格式化输出

2.2.4用于封装以字符为导向的OutputStream

1)BufferedWrite:与对应

2)PrintWrite:与对应

3.RandomAccessFile

1)可通过RandomAccessFile对象完成对文件的读写操作

2)在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写

3)可以直接跳到文件中指定的位置


4.I/O应用的一个例子


importjava.io.*;

publicclassTestIO{

publicstaticvoidmain(String[]args)

throwsIOException{

//1.以行为单位从一个文件读取数据

BufferedReaderin=

newBufferedReader(

newFileReader("F:\nepalon\TestIO.java"));

Strings,s2=newString();

while((s=in.readLine())!=null)

s2+=s+" ";

in.close();


//1b.接收键盘的输入

BufferedReaderstdin=

newBufferedReader(

newInputStreamReader(System.in));

System.out.println("Enteraline:");

System.out.println(stdin.readLine());


//2.从一个String对象中读取数据

StringReaderin2=newStringReader(s2);

intc;

while((c=in2.read())!=-1)

System.out.println((char)c);

in2.close();


//3.从内存取出格式化输入

try{

DataInputStreamin3=

newDataInputStream(

newByteArrayInputStream(s2.getBytes()));

while(true)

System.out.println((char)in3.readByte());

}

catch(EOFExceptione){

System.out.println("Endofstream");

}


//4.输出到文件

try{

BufferedReaderin4=

newBufferedReader(

newStringReader(s2));

PrintWriterout1=

newPrintWriter(

newBufferedWriter(

newFileWriter("F:\nepalon\TestIO.out")));

intlineCount=1;

while((s=in4.readLine())!=null)

out1.println(lineCount+++":"+s);

out1.close();

in4.close();

}


catch(EOFExceptionex){

System.out.println("Endofstream");

}


//5.数据的存储和恢复

try{

DataOutputStreamout2=

newDataOutputStream(

newBufferedOutputStream(

newFileOutputStream("F:\nepalon\Data.txt")));

out2.writeDouble(3.1415926);

out2.writeChars(" Thaswaspi:writeChars ");

out2.writeBytes("Thaswaspi:writeByte ");

out2.close();

DataInputStreamin5=

newDataInputStream(

newBufferedInputStream(

newFileInputStream("F:\nepalon\Data.txt")));

BufferedReaderin5br=

newBufferedReader(

newInputStreamReader(in5));

System.out.println(in5.readDouble());

System.out.println(in5br.readLine());

System.out.println(in5br.readLine());

}

catch(EOFExceptione){

System.out.println("Endofstream");

}


//6.通过RandomAccessFile操作文件

RandomAccessFilerf=

newRandomAccessFile("F:\nepalon\rtest.dat","rw");

for(inti=0;i<10>

rf.writeDouble(i*1.414);

rf.close();


rf=newRandomAccessFile("F:\nepalon\rtest.dat","r");

for(inti=0;i<10>

System.out.println("Value"+i+":"+rf.readDouble());

rf.close();


rf=newRandomAccessFile("F:\nepalon\rtest.dat","rw");

rf.seek(5*8);

rf.writeDouble(47.0001);

rf.close();


rf=newRandomAccessFile("F:\nepalon\rtest.dat","r");

for(inti=0;i<10>

System.out.println("Value"+i+":"+rf.readDouble());

rf.close();

}

}



关于代码的解释(以区为单位):

 1区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。

 1b区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。

 2区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。

 4区中,对String对象s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对TestIO.out文件进行操作时,先把格式化后的信息输出到缓存中,再把缓存中的信息输出到文件中。

 5区中,对Data.txt文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。



作者: 信息发布软件    时间: 2016-10-21 14:29
多实例教程


所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新"装配"。像RMI、Socket、JMS、EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。  

    Java对象序列化机制一般来讲有两种用途:

    Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息,这需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态。

    RMI允许象在本机上一样操作远程机器上的对象;或使用套接字在网络上传送对象的程序来说,这些都是需要实现serializaiton机制的。

    我们通过让类实现Java.io.Serializable 接口可以将类序列化。这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。

    对于这个,有几点我们需要明确:

    并非所有类都可以序列化,在cmd下,我们输入serialver Java.net.Socket,可以得到socket是否可序列化的信息,实际上socket是不可序列化的。

    Java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。

    将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream .ObjectOutputStream 提供用来将对象写入输出流的writeObject方法, ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说,必须已经实现 Serializable接口。如果你想writeobject一个hashtable对象,那么,会得到一个异常。

    序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用Java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。

    对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

    Java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

    Java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现Java.io.Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。


    序列化机制:

    序列化分为两大部分:序列化 和反序列化 。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。ObjectOutputStream中的序列化过程与字节流连接,包括对象类型和版本信息。反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到对象数据成员中。下面我们分两大部分来阐述:

    处理对象流:

    (序列化过程和反序列化过程)

    Java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流,ObjectInputStream从字节流重构对象。

    我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。

    writeObject() 方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则writeObject()方法递归序列化这些对象。每个 ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。(这点很重要)由于writeObject()可以序列化整组交叉引用的对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用序列化,而不是再次写入对象字节流。

    下面,让我们从例子中来了解ObjectOutputStream这个类吧。

// 序列化 today''s date 到一个文件中.

FileOutputStream  f = new  FileOutputStream ("tmp" );

ObjectOutputStream  s = new  ObjectOutputStream (f);

s.writeObject("Today" );

s.writeObject(new  Date ());

s.flush();

    现在,让我们来了解ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展DataInput接口。 ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。 readObject()收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出 ClassNotFoundException,如果需要传输对象数据和字节码,则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过程。

    例子如下:

//从文件中反序列化 string 对象和 date 对象

FileInputStream  in = new  FileInputStream ("tmp" );

ObjectInputStream  s = new  ObjectInputStream (in);

String  today = (String )s.readObject();

Date  date = (Date )s.readObject();

    定制序列化过程:

    序列化通常可以自动完成,但有时可能要对这个过程进行控制。java可以将类声明为serializable,但仍可手工控制声明为static或transient的数据成员。

    例子:一个非常简单的序列化类。

public  class  simpleSerializableClass implements  Serializable {

String  sToday="Today:" ;

transient  Date  dtToday=new  Date ();

}

    序列化时,类的所有数据成员应可序列化除了声明为transient 或static的成员。将变量声明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。后面数据反序列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据成员不向流中写入任何数据。记住,对象流不序列化static或transient。我们的类要用writeObject()与 readObject()方法以处理这些数据成员。使用writeObject()与readObject()方法时,还要注意按写入的顺序读取这些数据成员。

    关于如何使用定制序列化的部分代码如下

//重写writeObject()方法以便处理transient的成员。

public  void  writeObject(ObjectOutputStream  outputStream) throws  IOException {

outputStream.defaultWriteObject();//使定制的writeObject()方法可以

利用自动序列化中内置的逻辑。

outputStream.writeObject(oSocket.getInetAddress());

outputStream.writeInt(oSocket.getPort());

}

//重写readObject()方法以便接收transient的成员。

private  void  readObject(ObjectInputStream  inputStream) throws IOException ,

ClassNotFoundException {

inputStream.defaultReadObject();//defaultReadObject()补充自动序列化

InetAddress  oAddress=(InetAddress )inputStream.readObject();

int  iPort =inputStream.readInt();

oSocket = new  Socket (oAddress,iPort);

iID=getID();

dtToday =new  Date ();

}

    完全定制序列化过程:

    如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.类实现 Externalizable时,头写入对象流中,然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。声明类实现 Externalizable接口会有重大的安全风险。writeExternal()与readExternal()方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,则要格外小心。这包括使用安全套接或加密整个字节流。到此为至,我们学习了序列化的基础部分知识。



作者: 信息发布软件    时间: 2016-10-21 14:30
多实例教程


Java I/O系统中的类非常复杂,而且因为使用了装饰器模式,很容易造成使用多种组合方式都可以达到相同的目的,故很容易产生疑惑。
Java中的I/O系统大部分都在java.io包中,并且可以分为两类:针对字节流的I/O;针对字符流的I/O。并且每种I/O又分为输入流和输出流。在处理Java中的I/O时主要关注数据格式要怎么处理和数据要以什么方式传输,这两个问题。
编程语言的I/O类库中常用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。
Java类库中的I/O类分成输入和输出两部分。任何继承自InputStream或Reader派生而来的类都含有read()的基本方法,用于读取单个字节或者字节数组。同样,任何继承自OutputStream或Writer的类都含有write()方法,用于写单个字节或者字节数组。但是我们通常不会使用这些方法,它们之所以存在是因为别的类可以使用它们,以提供更有用的接口,因此我们很少使用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能。实际上,Java中“流”类库让人迷惑的主要原因就在于:创建单一的结果流,却需要创建多个对象。
所有字节流输入相关的类都继承自InputStream,而所有与输出相关的类都继承自OutputStream。所有字符流输入相关的类都继承自Reader,而输出字符流的类继承子Writer。当然这不是绝对的,例如RandomAccessFile就是一个单独的类,它提供了完整的文件处理功能。
InputStream类型InputStream的作用是用来表示那些从不同数据源产生输入的类。这些数据源包括:字节数组,String对象,文件,管道,由其他种类的流组成的序列,其他数据源。

Java编程中的IO系统和多实例分解教程 b2b软件

每一种数据源都有相应的InputStream子类,另外,FilterInputStream也属于一种InputStream,它为“装饰器”类提供了基类。“装饰器”类可以把属性或有用的接口与输入流连接在一起。
InputStream类型功能构造参数/如何使用
ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的所有字节。缓冲区(其实是字节数组),可以从中取字节。
与FilterInputStream相连时,提供数据源

StringBufferInputStream将String转换成InputStream(过时)将要转换的字符串。底层使用了String来实现,但是它是将String的元素直接强制转化为byte的,故对于非ASCII可能会出现问题。
FileInputStream从文件中读取字节流。它主要用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。表示文件名的字符串或者File对象。它内部使用FileDescriptor来记录对文件的引用次数。
PipedInputStream产生用于写入相关的PipedOutStream的数据(用于多线程环境下交换数据)。关联的PipedOutputStream
可以在多线程下提供数据源

SequenceInputStream将两个或多个InputStream对象转换成单一InputStream两个InputStream或者它们组成的Enumeration对象。它内部是采用,若第一个流读取完毕,那就读取第二个的策略。
FilterInputStream抽象类,作为“装饰器”的接口
ObjectInputStream对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
OutputStream类型
输出流确定了数据的去向:字节数组(byte数组,可以自己创建),文件或管道。FilterOutputStream为“装饰器”提供了基类,“装饰器”类把属性或者有用的接口与输出流连接了起来。

Java编程中的IO系统和多实例分解教程 b2b软件

OutputStream是输出字节流的所有类的超类。输出流接收输出字节并将这些字节发送到某个接收器。OutputStream的继承结构和InputStream的继承结构是相似的,其功能也是相互对应的。
OutputStream类型功能构造器参数/如何使用
ByteArrayOutputStream在内存中创建缓冲区(byte数组),并且会自动增长,可使用 toByteArray() 和 toString() 获取数据。缓冲区的初始化尺寸(默认大小32)。
FileOutputStream将数据写入 File 或 FileDescriptor表示文件名的字符串,或者File对象
PipedOutputStream可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端(适用于多线程环境)。PipedInputStream,被指定的管道接收者,数据被写入后,接收者会自动获得数据(调用receive方法)。
FilterOutputStream抽象类,作为“装饰器”的接口,其中“装饰器”为其他OutputStream提供有用功能。
ObjectOutputStream将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。它的具体操作是使用了一个内部类实现读写二进制数据BlockDataOutputStream实现的。
Filter类
Java I/O类库中需要多种不同功能的组合,而库中的filter(过滤器)类正是实现“装饰器”功能的基类。装饰器要求它和被装饰的对象有相同的接口,同时它也可以拓展接口,不过这种情况只发生在个别filter中。虽然装饰器为我们提供了很大的灵活性,但是它也增加了代码的复杂性。Java I/O类库操作不便的原因在于,我们必须创建许多类——“核心”I/O类型加上所有的“装饰器”,才能得到我们希望的单个I/O对象。
FilterInputStream和FilterOutputStream分别自I/O类库中的基类InputStream和OutputStream派生而来,它们为装饰器提供了基本的支持。DataInputStream(FilterInputStream的子类),允许我们读取基本数据类型以及String对象(readXXX()方法),与之对应的是FilterOutputStream的子类DataOutputStream,它可以将将数据写入指定的输出流。其他的FilterInputStream,类则在内部修改InputStream的行为方式:是否缓冲,是否保留它所读过的行,以及是否把单一字符推回输入流等。
FilterInputStream类型功能构造参数/如何使用
DataInputStream与DataOutputStream搭配使用,允许应用程序以可移植方式从输入流中读取基本 Java 数据类型(int,char,long等)。InputStream,包含用于读取基本数据类型的全部接口
BufferedInputStream为另一个输入流添加缓冲输入以及支持 mark 和 reset 方法的能力。InputStream,可以指定缓冲区大小。
DataOutputStream是FilterOutputStream的子类,它可以将各种基本数据类型,以及String对象格式化输出到“流”中,这样任何DataInputStream都能够读取它们(使用writerXXX()方法)。PrintStream是为了可视化格式打印所有的基本数据类型以及String对象。PrintStream未能完全国际化,不能以平台无关的方式处理换行动作(可以使用PrintWriter解决)。BufferedOutputStream是一个修改过的OutputStream,它对数据使用缓冲技术,因此每当向流写入数据时,不必进行实际物理写入,所有在进行输出时,我们可能更经常使用它。
FilterOutputStream类型功能构造参数/如何使用
DataOutputStream与DataInputStream搭配,以适当方式将基本 Java 数据类型写入输出流中。OutputStream,包含用于写入基本类型数据的全部接口
PrintStream用于产生格式化输出。需要指定OutputStream
BufferedOutputStream带缓冲的输出流,避免每次发送数据时都进行实际操作。OutputStream,可以指定缓冲区大小。
Reader和Writer类型
Reader和Writer不是为了替代InputStream和OutputStream的,它们主要是提供了兼容Unicode与面向字符的I/O功能。其中一个比较重要的点就是,InputStreamReader可以把InputStream转换为Reader,而OutputStreamReader可以把OutputStream转化为Writer。
设计Reader和Writer继承层次结构主要是为了国际化,老的I/O流继承层次结构仅支持8位字节流,不能很好地处理16位的Unicode字符,但是新的继承层次结构能够在所有的I/O操作中都支持Unicode,而且使得它的操作比旧类库快。由于Reader和Writer主要面对Unicode字符操作,故面向字节流时,还是需要使用InputStream和OutputStream来解决问题的。
我们可以看出,InputStream/OutputStream的继承层次和Reader/Writer的继承层次是非常相似的,几乎每个Stream类都有自己相对应的Reader或Writer。不过对于Filter类的层次来说这种对应关系就变得不是那么明显了。而且,BufferedWriter不是FilterWriter的子类,它在继承结构中只是暂时作为占位符。
需要注意一点,在BufferedReader和DataInputStream中都包含readLine()方法,但是我们需要读取数据时最好只选用BufferedReader。

Java编程中的IO系统和多实例分解教程 b2b软件

RandomAccessFile类
RandomAccessFile适用于大小已知的记录组成的文件,我们可以使用seek()将记录从一处转移到另一处,然后读取或者修改记录。它不是InputStream和OutputStream继承层次结构的一部分,不过它也实现了DataInput和DataOutput接口。它是一个完全独立的类,大部分方法都是本地方法。
总结
总的来说,使用Java中的I/O时,能弄清楚数据的去向和来源,然后将这些功能恰当的组合起来就可以了。如果需要缓冲功能就使用Buffered类型的类装饰,如果需要字节类型处理过程转字符类型处理过程就使用StreamReader/StreamWriter转为Reader/Writer,如果需要处理文件就使用File类型的Stream或者Writer等等。







欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://www.postbbs.com/) Powered by Discuz! X3.2