首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【转】Stream种

2012-09-20 
【转】Stream类转自百度文库:http://wenku.baidu.com/view/21080fd7195f312b3169a513.html?}在这个例子中,使

【转】Stream类

转自百度文库:http://wenku.baidu.com/view/21080fd7195f312b3169a513.html

?


}

在这个例子中,使用DataInputStream读取行,使用LineNumberInputStream来监控行。从这个子可以看出,嵌套流中数据的流动贯穿所有的流,即所以流中的数据在同步流动。

1.8 PushbackInputStream
PushbackInputStream 也是从FilterInputStream继承下来,它有一个特殊的方法unread,用于将读出来的数据放出流中。在例子readLine就使用了这个 方法,unread与read相对应有三个形态:unread()、unread(byte[])及unread(byte[],int,int)。

1.9 PipedInputStream
FilterInputStream 的派生类已介绍完毕,下面接着介绍InputStream的派生类。PipedInputStream一般与PipedOutputStream一起用构 成线程之间双向的通信管道。因此在里先不介绍PipedInputStream的用法。

1.10 StringBufferInputStream
String buffer = "Now is the time for all good men to come...";

InputStream s = new StringBufferInputStream(buffer);

1.11 ByteArrayInputStream
ByteArrayInputStream与StringBufferInputStream类似,只是它基于ByteArry,而StringBufferInputStream基于String。

1.12 SequenceInputStream
SequenceInputStream用于将不同的InputStream按先后顺序串在一起,如将两个InputStream串起来:

InputStream s1 = new FileInputStream("theFirstPart");

InputStream s2 = new FileInputStream("theRest");

InputStream s = new SequenceInputStream(s1, s2);

以上只能实现两个输入流的串接,要实现两个以上输入流串接,需要用到Vector类,如下所示:

Vector v = new Vector(3);

Enumeration e;

v.addElement(s1);

v.addElement(s2);

v.addElement(s2);

e = v.elements();

InputStream s = new SequenceInputStream(e) ;

1.13 OutputStream
OutputStream位于Output Stream类层次的最顶层,它是一个抽象类,它规定了Output Stream类的基本功能。

1.13.1 write
write方法与InputStream的read方法相对应,它有三个形态:

(1) write(byte[]):将指定byte数组中的数据输出到指定Stream;

(2) write(byte[],int,int):将指定byte数组中的数据从第二个参数开始,输出第三个参数指定的长度到指定的Stream;

(3) wirte(int);将一个int值输出到指定的Stream;

1.13.2 flush和close
有些输出流在输出时先放在缓冲中,可以使用flush将这些数据真正写入指定的输出流中。Close用于关闭指定的输出流。

1.14 ByteArrayOutputStream
ByteArrayOutputStream将一个输出流指向一个Byte数组,但这个Byte数组是ByteArrayOutputStream内部内置的,不需要我们来定义。该类有两个构造函数:

(1) ByteArrayOutputStream():该构造函数会在内部创建一个长度为32的Byte数组;

(2) ByteArrayOutputStream(int n):在对象内部创建一个长度为n的Byte数组。

ByteArrayOutputStream从OutputStream类继承下来,所以它具write、flush及close等方法,同时它还具有以下几个特殊的方法:

(3) toString():将对象内部的Byte数组转化成字符串(String(buf,0,count);

(4) toString(int n):将对象对部的Byte数组转化成字符串,编码方式为n;

(5) toString(String n):将对象对部的数组转化成字符串,编码方式为n;

(6) toByteArray():返回对象内部的Byte数组;

(7) writeTo(OutputStream):将内部Byte数组输出到指定的输出流;

(8) reset():将对象内部Byte数组的长度设为0,{count = 0};

(9) size():返回Byte数组长度;

1.15 FileOutputStream
FileOutputStream与FileInputStream相对应,它具有以下几个构造函数:

(1) FileOutputStream(File)

(2) FileOutputStream(File file, boolean append):如果append为真,以添加方式写入文件,如果为否(缺省),以新增方式写入文件;

(3) FileOutputStream(FileDescriptor)

(4) FileOutputStream(String name)

(5) FileOutputStream(String name, boolean append)

其它的方法大多为标准方法,这里不再介绍。以下使用的例子:

FileDescriptor fd = someFileStream.getFD();

OutputStream s = new FileOutputStream(fd);

1.16 FilterOutputStream
FilterOutputStream与FilterInputStream相对应,使用方法也相类似。

1.17 BufferedOutputStream
BufferedOutputStream从FilterOutputStream中继承下来,它与BufferedInputStream相对应,作用也相类似,它主要为输出流做缓冲,如:

OutputStream s = new BufferedOutputStream(new FileOutputStream("foo"));

由于BufferedOutputStream是缓冲数据的,所以必要时,需要使用flush方法强制将缓冲中的数据真正写入输出流中。

1.18 DataOutputStream
DataOutputStream与DataInputStream相对应,在继承OutputStream的同时,实现了DataOutput接口,因此它具有DataOutput接中所规定的方法,这些方法与DataInput所规定的方法相反。

它还具有size方法,该方法返回向输出流写入的字节数。以下是实现复制功能的例子:

try { while (true) aDO.writeByte(aDI.readByte()); }

finally { aDI.close(); aDO.close(); }

1.19 PrintStream
PrintStream是从FilterOutputStream继承下来的。使用例子如下:

PrintStream s = new PrintStream(new FileOutputStream("foo"));

s.println("Here's the first line of text in the file foo.");

这个例子说明可以使用PrintStream向文件写数据,并且该类提供了输出行的功能,弥补了DataOutputStream的空白(在DataOutputStream没有输出行的功能)。

PrintStream的构造函数:

(1) PrintStream(boolean autoFlush, OutputStream out)

(2) PrintStream(OutputStream out)

(3) PrintStream(OutputStream out, boolean autoFlush)

(4) PrintStream(OutputStream out, boolean autoFlush, String encoding)

1.20 PipedOutputStream
PipedOutputStream与PipedInputSteam相互配合实现两个线程之间的通信,它们的定义如下:

PipedInputStream sIn = PipedInputStream();

PipedOutputStream sOut = PipedOutputStream(sIn);

以下是使用例子,该例子接收标准输入的数据,并输出到标准输出:

import java.io.*;

class ReadThread extends Thread implements Runnable {



InputStream pi = null;

OutputStream po = null;

String process = null;



ReadThread( String process, InputStream pi, OutputStream po) {

this.pi = pi; this.po = po; this.process = process; }



public void run() {

int ch; byte[] buffer = new byte[12]; int bytes_read;

try {

for(;;) {

bytes_read = pi.read(buffer); //从指定流读入数据

if (bytes_read == -1) { return; }

po.write(buffer, 0, bytes_read);//向指定流写入数据

Thread.yield();

}

} catch (Exception e) { e.printStackTrace();

} finally { }

}

}

public class MyPipe{

public static void main( String [] args) {

try {

int ch;

PipedInputStream writeIn = new PipedInputStream();

PipedOutputStream readOut = new PipedOutputStream( writeIn );

FileOutputStream writeOut = new FileOutputStream("out");

ReadThread rt = new ReadThread("reader", System.in, readOut );

ReadThread wt = new ReadThread("writer", writeIn, System.out );

rt.start();

wt.start();

} catch (Exception e) {

e.printStackTrace();

} }}

说明:

(1) 类ReadThread非常巧妙,它并没有指定输入输出流的具体类型

(2) 在MyPipe类中new ReadThread("reader", System.in, readOut )语句使得从标准输入设备中接收数据,而从readOut输出,而readOut是PipedOutputSteam,所以它可以被另一线程接收;

(3) new ReadThread("writer", writeIn, System.out ),从writeIn接收数据,writeIn是readOut是成对的双向管道,它接收从readOut发送过来的数据。再从标准设备中输出。

1.21 RandomAccessFile
1.22 StreamTokenizer
1.23 ObjectOutputStream
ObjectOutputStream 从OutputStream继承下来,并实现了ObjectOutput, ObjectStreamConstants这两个接口。它负责将指定对象输出到指定的输出流,可以将非static、非transient的属性及值, 对象的类定义输出到指定的输出流。该类有一个非常用的方法:

writeObject (Object obj);

该方法将obj输出到指定的输出流,以下是该类的例子:

FileOutputStream f = new FileOutputStream("tmp");

ObjectOutput s = new ObjectOutputStream(f);

s.writeObject("Today");

s.writeObject(new Date());

s.flush();

可以使用transient修饰符规定一些变量的值不被输出到指定的输出流,如:

public transient int transientValue = 4;

这样transientValue的值就不会被输出到输出流。

1.24 ObjectInputStream
ObjectInputStream与ObjectOutputStream相对应,它是将对象的值及类的定义等从指定的输入流读入,以便重新对象化:

FileInputStream in = new FileInputStream("tmp");

ObjectInputStream s = new ObjectInputStream(in);

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

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

ObjectOutputStream和ObjectInputStream就可以实现对象的持久化,即要先将对象序列化保存到介质中,在必要的时候重新恢复这些对象。

补充一下:??
Calendar?? cal?? =?? Calendar.getInstance();??
cal.setTime(new?? Date());????
System.out.println("System?? Date:?? "?? +?? cal.get(Calendar.MONTH+1));?????

?

热点排行