java流类_Java IO 技术之基本流类

流式IO

流(Stream)是字节的源或目的。

e9cb5377bdef514a7e92cff2f8320fb1.png

两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。

流的分类

节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。

过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

InputStream

a4c1ba1b7193e3ed3d1aef4a71da6249.gif

三个基本的读方法

abstract int read() :读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。

int read(byte[] b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。

int read(byte[] b, int off, int len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。

其它方法

long skip(long n) :在输入流中跳过n个字节,并返回实际跳过的字节数。

int available() :返回在不发生阻塞的情况下,可读取的字节数。

void close() :关闭输入流,释放和这个流相关的系统资源。

void mark(int readlimit) :在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。

void reset() :返回到上一个标记。

boolean markSupported() :测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。

java.io包中 InputStream的类层次

OutputStream

ae28aa3a36a91bd17551d35f0b1ca6bf.gif

三个基本的写方法

abstract void write(int b) :往输出流中写入一个字节。

void write(byte[] b) :往输出流中写入数组b中的所有字节。

void write(byte[] b, int off, int len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。

其它方法

void flush() :刷新输出流,强制缓冲区中的输出字节被写出。

void close() :关闭输出流,释放和这个流相关的系统资源。

java.io包中 OutputStream的类层次

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Demo1:在控制台读取键盘输入,然后显示。Ctrl+C结束运行

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png int data;7 d18c02628675d0a2c816449d98bda930.png8 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif while ((data = System.in.read()) != - 1 ) 9b8a8a44dd1c74ae49c20a7cd451974e.png{9 d18c02628675d0a2c816449d98bda930.png   System.out.write(data);10 ecedf933ec37d714bd4c2545da43add2.png  }11 d18c02628675d0a2c816449d98bda930.png12 ecedf933ec37d714bd4c2545da43add2.png }13 d18c02628675d0a2c816449d98bda930.png14 8f1ba5b45633e9678d1db480c16cae3f.png}15 4f1150b881333f12a311ae9ef34da474.png

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

基本的流类

1、FileInputStream和FileOutputStream

节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。

-------------------------------------------------------------------------------

Demo2:将字符串写入特定文件,注意write方法只接收字符数组。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );7 d18c02628675d0a2c816449d98bda930.png8 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 9 d18c02628675d0a2c816449d98bda930.png   * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,10 d18c02628675d0a2c816449d98bda930.png   * 所以要用String的getBytes方法生成一个字符数组11 ecedf933ec37d714bd4c2545da43add2.png */12 d18c02628675d0a2c816449d98bda930.png  fos.write( " http://www.cnblogs.com " .getBytes());13 d18c02628675d0a2c816449d98bda930.png  fos.close();14 d18c02628675d0a2c816449d98bda930.png15 ecedf933ec37d714bd4c2545da43add2.png }16 d18c02628675d0a2c816449d98bda930.png17 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

String的构造方法的API:

------------

Java API:

------------

String

public String(byte[] bytes,

int offset,

int length)

构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。新的 String 的长度是一个字符集函数,因此不能等于该子数组的长度。

当给定字节在给定字符集中无效的情况下,该构造方法无指定的行为。当需要进一步控制解码过程时,应使用 CharsetDecoder 类。

参数:

bytes - 要解码为字符的字节

offset - 要解码的首字节的索引

length - 要解码的字节数

抛出:

IndexOutOfBoundsException - 如果 offset 和 length 参数索引字符超出 bytes 数组的范围

从以下版本开始:

JDK1.1

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Demo3:将字符串写入特定文件,注意write方法只接收字符数组。

然后通过文件输出流读取数据,注意使用String特定的构造方法。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );7 d18c02628675d0a2c816449d98bda930.png8 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 9 d18c02628675d0a2c816449d98bda930.png   * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,10 d18c02628675d0a2c816449d98bda930.png   * 所以要用String的getBytes方法生成一个字符数组11 ecedf933ec37d714bd4c2545da43add2.png */12 d18c02628675d0a2c816449d98bda930.png  fos.write( " http://www.cnblogs.com " .getBytes());13 d18c02628675d0a2c816449d98bda930.png  fos.close();14 d18c02628675d0a2c816449d98bda930.png15 d18c02628675d0a2c816449d98bda930.png // 使用String的这个构造方法:16 d18c02628675d0a2c816449d98bda930.png // String(byte[] bytes, int offset, int length) 17 d18c02628675d0a2c816449d98bda930.png18 d18c02628675d0a2c816449d98bda930.png  FileInputStream fis = new FileInputStream( " 1.txt " );19 d18c02628675d0a2c816449d98bda930.png byte [] buf = new byte [ 100 ];20 d18c02628675d0a2c816449d98bda930.png int len = fis.read(buf);21 d18c02628675d0a2c816449d98bda930.png22 d18c02628675d0a2c816449d98bda930.png // 使用String的这个构造方法:23 d18c02628675d0a2c816449d98bda930.png // String(byte[] bytes, int offset, int length) 24 d18c02628675d0a2c816449d98bda930.pngSystem.out.println( new String(buf, 0 , len));25 d18c02628675d0a2c816449d98bda930.png  fis.close(); // 使用完后记得关闭文件流 26 d18c02628675d0a2c816449d98bda930.png27 ecedf933ec37d714bd4c2545da43add2.png }28 d18c02628675d0a2c816449d98bda930.png29 8f1ba5b45633e9678d1db480c16cae3f.png}30 4f1150b881333f12a311ae9ef34da474.png31 4f1150b881333f12a311ae9ef34da474.png

-------------------------------------------------------------------------------

运行结果:http://www.cnblogs.com

-------------------------------------------------------------------------------

2、BufferedInputStream和BufferedOutputStream

过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。

------------

Java API:

------------

构造方法摘要

BufferedOutputStream(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的基础输出流。

BufferedOutputStream(OutputStream out, int size)

创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

-------------------------------------------------------------------------------

BufferedOutputStream

public BufferedOutputStream(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的基础输出流。

参数:

out - 基础输出流。

BufferedOutputStream

public BufferedOutputStream(OutputStream out,

int size)

创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

参数:

out - 基础输出流。

size - 缓冲区的大小。

抛出:

IllegalArgumentException - 如果 size <= 0

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Demo4:通过一个OutputStream对象来构造一个BufferedOutputStream对象。

而FileOutputStream类是OutputStream类的子类,所以可以用它来构造。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );8 d18c02628675d0a2c816449d98bda930.png  BufferedOutputStream bos = new BufferedOutputStream(fos);9 d18c02628675d0a2c816449d98bda930.png  bos.write( " http://www.cnblogs.com " .getBytes());10 ecedf933ec37d714bd4c2545da43add2.png }11 d18c02628675d0a2c816449d98bda930.png12 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:1.txt文件为空。原因:缓冲区没有写满,程序没有向文件写数据。

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

解决方法1:使用flush()方法:

-------------------------------------------------------------------------------

Demo4:使用flush()方法,可以使程序立即向文件写数据。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );8 d18c02628675d0a2c816449d98bda930.png  BufferedOutputStream bos = new BufferedOutputStream(fos);9 d18c02628675d0a2c816449d98bda930.png  bos.write( " http://www.cnblogs.com " .getBytes());10 d18c02628675d0a2c816449d98bda930.png11 d18c02628675d0a2c816449d98bda930.png  bos.flush();12 ecedf933ec37d714bd4c2545da43add2.png }13 d18c02628675d0a2c816449d98bda930.png14 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:数据被写入相应的文件。

-------------------------------------------------------------------------------

解决方法2:使用close()方法:

-------------------------------------------------------------------------------

Demo5:使用close()方法,同样可以使程序立即向文件写数据。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );8 d18c02628675d0a2c816449d98bda930.png  BufferedOutputStream bos = new BufferedOutputStream(fos);9 d18c02628675d0a2c816449d98bda930.png  bos.write( " http://www.cnblogs.com " .getBytes());10 d18c02628675d0a2c816449d98bda930.png11 d18c02628675d0a2c816449d98bda930.png  bos.close();12 ecedf933ec37d714bd4c2545da43add2.png }13 d18c02628675d0a2c816449d98bda930.png14 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:数据被写入相应的文件。

-------------------------------------------------------------------------------

flush()和close()的区别:

还要使用流对象,还需要写数据,使用flush(),否则使用close()。

另外,使用close()将关闭自己的流对象,同时会关闭与之相关的流对象,如FileOutputStream流。

-------------------------------------------------------------------------------

Demo6:使用BufferedInputStream流,从文件中读取数据。

同样要用InputStream流对象或者其子类的对象来构造。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " 1.txt " );8 d18c02628675d0a2c816449d98bda930.png  BufferedOutputStream bos = new BufferedOutputStream(fos);9 d18c02628675d0a2c816449d98bda930.png  bos.write( " http://www.cnblogs.com " .getBytes());10 d18c02628675d0a2c816449d98bda930.png11 d18c02628675d0a2c816449d98bda930.png  bos.close();12 d18c02628675d0a2c816449d98bda930.png13 d18c02628675d0a2c816449d98bda930.png  FileInputStream fis = new FileInputStream( " 1.txt " );14 d18c02628675d0a2c816449d98bda930.png  BufferedInputStream bis = new BufferedInputStream(fis);15 d18c02628675d0a2c816449d98bda930.png byte [] buf = new byte [ 100 ];16 d18c02628675d0a2c816449d98bda930.png int len = bis.read(buf);17 d18c02628675d0a2c816449d98bda930.png18 d18c02628675d0a2c816449d98bda930.png // 使用String的这个构造方法:19 d18c02628675d0a2c816449d98bda930.png // String(byte[] bytes, int offset, int length) 20 d18c02628675d0a2c816449d98bda930.pngSystem.out.println( new String(buf, 0 , len));21 d18c02628675d0a2c816449d98bda930.png  bis.close();22 ecedf933ec37d714bd4c2545da43add2.png }23 d18c02628675d0a2c816449d98bda930.png24 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:输出http://www.cnblogs.com

-------------------------------------------------------------------------------

3、DataInputStream和DataOutputStream

过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

------------

Java API:

------------

java.io

类 DataOutputStream

java.lang.Object

java.io.OutputStream

java.io.FilterOutputStream

java.io.DataOutputStream

所有已实现的接口:

Closeable, DataOutput, Flushable

public class DataOutputStream

extends FilterOutputStream

implements DataOutput

数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

从以下版本开始:

JDK1.0

-------------------------------------------------------------------------------

构造方法摘要

DataOutputStream(OutputStream out)

创建一个新的数据输出流,将数据写入指定基础输出流。

-------------------------------------------------------------------------------

DataOutputStream

public DataOutputStream(OutputStream out)

创建一个新的数据输出流,将数据写入指定基础输出流。计数器 written 被设置为零。

参数:

out - 基础输出流,将被保存供以后使用。

-------------------------------------------------------------------------------

Demo7:使用DataOutputStream流,将基本数据类型以二进制形式写入文件中。

同样要用InputStream流对象或者其子类的对象来构造,

这里使用BufferedOutputStream对象来构造。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " dos.txt " ); // 获得写入文件功能 8 d18c02628675d0a2c816449d98bda930.pngBufferedOutputStream bos = new BufferedOutputStream(fos); // 获得缓冲功能 9 d18c02628675d0a2c816449d98bda930.pngDataOutputStream dos = new DataOutputStream(bos); // 获得写入基本类型功能 10 d18c02628675d0a2c816449d98bda930.png11 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 12 d18c02628675d0a2c816449d98bda930.png   * 定义8种基本类型的对象13 ecedf933ec37d714bd4c2545da43add2.png */14 d18c02628675d0a2c816449d98bda930.png byte b = 3 ;15 d18c02628675d0a2c816449d98bda930.png short s = 4 ;16 d18c02628675d0a2c816449d98bda930.png int i = 78 ;17 d18c02628675d0a2c816449d98bda930.png long l = 100000 ;18 d18c02628675d0a2c816449d98bda930.png char ch = ' a ' ;19 d18c02628675d0a2c816449d98bda930.png boolean bl = false ;20 d18c02628675d0a2c816449d98bda930.png float f = 4.5f ;21 d18c02628675d0a2c816449d98bda930.png double d = 4.0001 ;22 d18c02628675d0a2c816449d98bda930.png23 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 24 d18c02628675d0a2c816449d98bda930.png   * 将8种基本类型的对象写入文件中25 ecedf933ec37d714bd4c2545da43add2.png */26 d18c02628675d0a2c816449d98bda930.png  dos.writeByte(b);27 d18c02628675d0a2c816449d98bda930.png  dos.writeShort(s);28 d18c02628675d0a2c816449d98bda930.png  dos.writeInt(i);29 d18c02628675d0a2c816449d98bda930.png  dos.writeLong(l);30 d18c02628675d0a2c816449d98bda930.png  dos.writeChar(ch);31 d18c02628675d0a2c816449d98bda930.png  dos.writeBoolean(bl);32 d18c02628675d0a2c816449d98bda930.png  dos.writeFloat(f);33 d18c02628675d0a2c816449d98bda930.png  dos.writeDouble(d);34 d18c02628675d0a2c816449d98bda930.png  dos.close();35 ecedf933ec37d714bd4c2545da43add2.png }36 d18c02628675d0a2c816449d98bda930.png37 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:8种基本类型的数据以二进制形式写入指定的文件中。

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Demo8:从指定的文件中读取8种基本类型的数据

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class StreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) throws Exception 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png7 d18c02628675d0a2c816449d98bda930.png  FileOutputStream fos = new FileOutputStream( " dos.txt " ); // 获得写入文件功能 8 d18c02628675d0a2c816449d98bda930.pngBufferedOutputStream bos = new BufferedOutputStream(fos); // 获得缓冲功能 9 d18c02628675d0a2c816449d98bda930.pngDataOutputStream dos = new DataOutputStream(bos); // 获得写入基本类型功能 10 d18c02628675d0a2c816449d98bda930.png11 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 12 d18c02628675d0a2c816449d98bda930.png   * 定义8种基本类型的对象13 ecedf933ec37d714bd4c2545da43add2.png */14 d18c02628675d0a2c816449d98bda930.png byte b = 3 ;15 d18c02628675d0a2c816449d98bda930.png short s = 4 ;16 d18c02628675d0a2c816449d98bda930.png int i = 78 ;17 d18c02628675d0a2c816449d98bda930.png long l = 100000 ;18 d18c02628675d0a2c816449d98bda930.png char ch = ' a ' ;19 d18c02628675d0a2c816449d98bda930.png boolean bl = false ;20 d18c02628675d0a2c816449d98bda930.png float f = 4.5f ;21 d18c02628675d0a2c816449d98bda930.png double d = 4.0001 ;22 d18c02628675d0a2c816449d98bda930.png23 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif /**/ /* 24 d18c02628675d0a2c816449d98bda930.png   * 将8种基本类型的对象写入文件中25 ecedf933ec37d714bd4c2545da43add2.png */26 d18c02628675d0a2c816449d98bda930.png  dos.writeByte(b);27 d18c02628675d0a2c816449d98bda930.png  dos.writeShort(s);28 d18c02628675d0a2c816449d98bda930.png  dos.writeInt(i);29 d18c02628675d0a2c816449d98bda930.png  dos.writeLong(l);30 d18c02628675d0a2c816449d98bda930.png  dos.writeChar(ch);31 d18c02628675d0a2c816449d98bda930.png  dos.writeBoolean(bl);32 d18c02628675d0a2c816449d98bda930.png  dos.writeFloat(f);33 d18c02628675d0a2c816449d98bda930.png  dos.writeDouble(d);34 d18c02628675d0a2c816449d98bda930.png  dos.close();35 d18c02628675d0a2c816449d98bda930.png36 d18c02628675d0a2c816449d98bda930.png  FileInputStream fis = new FileInputStream( " dos.txt " );37 d18c02628675d0a2c816449d98bda930.png  BufferedInputStream bis = new BufferedInputStream(fis);38 d18c02628675d0a2c816449d98bda930.png  DataInputStream dis = new DataInputStream(bis);39 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readByte());40 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readShort());41 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readInt());42 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readLong());43 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readChar());44 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readBoolean());45 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readFloat());46 d18c02628675d0a2c816449d98bda930.png  System.out.println(dis.readDouble());47 d18c02628675d0a2c816449d98bda930.png  dis.close();48 ecedf933ec37d714bd4c2545da43add2.png }49 d18c02628675d0a2c816449d98bda930.png50 8f1ba5b45633e9678d1db480c16cae3f.png}

-------------------------------------------------------------------------------

运行结果:数据正常输出:

3

4

78

100000

a

false

4.5

4.0001

-------------------------------------------------------------------------------

4、PipedInputStream和PipedOutputStream

管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。

-------------------------------------------------------------------------------

------------

Java API:

------------

java.io

类 PipedInputStream

java.lang.Object

java.io.InputStream

java.io.PipedInputStream

所有已实现的接口:

Closeable

public class PipedInputStream

extends InputStream

传送输入流应该连接到传送输出流;传送输入流会提供要写入传送输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。传送输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。

从以下版本开始:

JDK1.0

-------------------------------------------------------------------------------

------------

Java API:

------------

java.io

类 PipedOutputStream

java.lang.Object

java.io.OutputStream

java.io.PipedOutputStream

所有已实现的接口:

Closeable, Flushable

public class PipedOutputStream

extends OutputStream

传送输出流可以连接到传送输入流,以创建通信管道。传送输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。

从以下版本开始:

JDK1.0

-------------------------------------------------------------------------------

------------

Java API:

------------

connect

public void connect(PipedInputStream snk)

throws IOException

将此传送输出流连接到接收者。如果此对象已经连接到其他某个传送输入流,则抛出 IOException。

如果 snk 为未连接的传送输入流,而 src 为未连接的传送输出流,则可以通过以下任一调用使其连接:

src.connect(snk)

或:

snk.connect(src)

这两个调用的效果相同。

参数:

snk - 要连接的传送输入流。

抛出:

IOException - 如果发生 I/O 错误。

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Demo9:利用管道输入流和输出流进行通讯。

-------------------------------------------------------------------------------

1

4f1150b881333f12a311ae9ef34da474.png import java.io. * ;2 4f1150b881333f12a311ae9ef34da474.png3 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublic class PipedStreamDemo 9b8a8a44dd1c74ae49c20a7cd451974e.png{4 d18c02628675d0a2c816449d98bda930.png5 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public static void main(String[] args) 9b8a8a44dd1c74ae49c20a7cd451974e.png{6 d18c02628675d0a2c816449d98bda930.png  PipedOutputStream pos = new PipedOutputStream();7 d18c02628675d0a2c816449d98bda930.png  PipedInputStream pis = new PipedInputStream();8 d18c02628675d0a2c816449d98bda930.png9 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif try 9b8a8a44dd1c74ae49c20a7cd451974e.png{10 d18c02628675d0a2c816449d98bda930.png   pos.connect(pis);11 d18c02628675d0a2c816449d98bda930.png // pis.connect(pos); 二选一即可 12 d18c02628675d0a2c816449d98bda930.png13 d18c02628675d0a2c816449d98bda930.png new Producer(pos).start();14 d18c02628675d0a2c816449d98bda930.png new Consumer(pis).start();15 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  } catch (IOException e) 9b8a8a44dd1c74ae49c20a7cd451974e.png{16 d18c02628675d0a2c816449d98bda930.png // TODO 自动生成 catch 块 17 d18c02628675d0a2c816449d98bda930.pnge.printStackTrace();18 ecedf933ec37d714bd4c2545da43add2.png  }19 ecedf933ec37d714bd4c2545da43add2.png }20 d18c02628675d0a2c816449d98bda930.png21 8f1ba5b45633e9678d1db480c16cae3f.png}22 4f1150b881333f12a311ae9ef34da474.png23 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/**/ /* 24 d18c02628675d0a2c816449d98bda930.png * 生产者线程25 8f1ba5b45633e9678d1db480c16cae3f.png */26 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclass Producer extends Thread 9b8a8a44dd1c74ae49c20a7cd451974e.png{27 d18c02628675d0a2c816449d98bda930.png28 d18c02628675d0a2c816449d98bda930.png private PipedOutputStream pos;29 d18c02628675d0a2c816449d98bda930.png30 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public Producer(PipedOutputStream pos) 9b8a8a44dd1c74ae49c20a7cd451974e.png{31 d18c02628675d0a2c816449d98bda930.png this .pos = pos;32 ecedf933ec37d714bd4c2545da43add2.png }33 d18c02628675d0a2c816449d98bda930.png34 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public void run() 9b8a8a44dd1c74ae49c20a7cd451974e.png{35 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif try 9b8a8a44dd1c74ae49c20a7cd451974e.png{36 d18c02628675d0a2c816449d98bda930.png   pos.write( " Hello, welcome you! " .getBytes());37 d18c02628675d0a2c816449d98bda930.png   pos.close();38 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  } catch (Exception e) 9b8a8a44dd1c74ae49c20a7cd451974e.png{39 d18c02628675d0a2c816449d98bda930.png   e.printStackTrace();40 ecedf933ec37d714bd4c2545da43add2.png  }41 ecedf933ec37d714bd4c2545da43add2.png }42 d18c02628675d0a2c816449d98bda930.png43 8f1ba5b45633e9678d1db480c16cae3f.png}44 4f1150b881333f12a311ae9ef34da474.png45 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/**/ /* 46 d18c02628675d0a2c816449d98bda930.png * 消费者线程47 8f1ba5b45633e9678d1db480c16cae3f.png */48 1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifclass Consumer extends Thread 9b8a8a44dd1c74ae49c20a7cd451974e.png{49 d18c02628675d0a2c816449d98bda930.png50 d18c02628675d0a2c816449d98bda930.png private PipedInputStream pis;51 d18c02628675d0a2c816449d98bda930.png52 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public Consumer(PipedInputStream pis) 9b8a8a44dd1c74ae49c20a7cd451974e.png{53 d18c02628675d0a2c816449d98bda930.png this .pis = pis;54 ecedf933ec37d714bd4c2545da43add2.png }55 d18c02628675d0a2c816449d98bda930.png56 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif public void run() 9b8a8a44dd1c74ae49c20a7cd451974e.png{57 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif try 9b8a8a44dd1c74ae49c20a7cd451974e.png{58 d18c02628675d0a2c816449d98bda930.png byte [] buf = new byte [ 100 ];59 d18c02628675d0a2c816449d98bda930.png int len = pis.read(buf);60 d18c02628675d0a2c816449d98bda930.png   System.out.println( new String(buf, 0 , len));61 d18c02628675d0a2c816449d98bda930.png   pis.close(); // 关闭输入流 62 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif} catch (Exception e) 9b8a8a44dd1c74ae49c20a7cd451974e.png{63 d18c02628675d0a2c816449d98bda930.png   e.printStackTrace();64 ecedf933ec37d714bd4c2545da43add2.png  }65 ecedf933ec37d714bd4c2545da43add2.png }66 d18c02628675d0a2c816449d98bda930.png67 8f1ba5b45633e9678d1db480c16cae3f.png}68 4f1150b881333f12a311ae9ef34da474.png

-------------------------------------------------------------------------------

运行结果:输出Hello, welcome you!

-------------------------------------------------------------------------------

posted on 2006-08-24 18:41 CoderDream 阅读(1904) 评论(1)  编辑  收藏 所属分类: Java基础知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值