`
langgufu
  • 浏览: 2308929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
 字节流继承体系图
下图表示字节流部分的输入与输出的对应关系。 
 

 字符流继承体系图:

下图为字符流的输入与输出的对应关系图:

 

 

 

 

 

流式IO

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

流的分类

节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

InputStream

snap001.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

snap002.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结束运行
-------------------------------------------------------------------------------

 

 import  java.io. * ;
 
 
public   class  StreamDemo   {
  
   
public   static   void  main(String[] args)  throws  Exception   {
   
int  data;
  
    
while  ((data  =  System.in.read())  !=   - 1 )   {
   System.out.write(data);
  }
 
 
  }
 
  
 }
 
  


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


基本的流类 

1、FileInputStream和FileOutputStream
 
    
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
-------------------------------------------------------------------------------
Demo2:将字符串写入特定文件,注意write方法只接收字符数组。
-------------------------------------------------------------------------------

 

  import  java.io. * ;
  
   
public   class  StreamDemo   {
  
    
public   static   void  main(String[] args)  throws  Exception   {
   FileOutputStream fos  
=   new  FileOutputStream( " 1.txt " );
 
     
/**/ /* 
    * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
   * 所以要用String的getBytes方法生成一个字符数组
     
*/
 
  fos.write( 
" http://www.cnblogs.com " .getBytes()); 
  fos.close();
  
  }
 
  
 }
 



-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
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特定的构造方法。
-------------------------------------------------------------------------------

 

import  java.io. * ;
  
public   class  StreamDemo   {
  
    
public   static   void  main(String[] args)  throws  Exception   {
  FileOutputStream fos  
=   new  FileOutputStream( " 1.txt " );
  
     
/**/ /* 
    * 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
    * 所以要用String的getBytes方法生成一个字符数组
     
*/
 
   fos.write( 
" http://www.cnblogs.com " .getBytes()); 
   fos.close();
   
    
//  使用String的这个构造方法:
    
//  String(byte[] bytes, int offset, int length) 
    
   FileInputStream fis  
=   new  FileInputStream( " 1.txt " );
    
byte [] buf  =   new   byte [ 100 ];
    
int  len  =  fis.read(buf);
   
    
//  使用String的这个构造方法:
    
//  String(byte[] bytes, int offset, int length) 
    System.out.println( new  String(buf,  0 , len));
   fis.close();   
//  使用完后记得关闭文件流 
  
  }
 
  
 }
 


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


2、BufferedInputStream和BufferedOutputStream
    
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
    
------------
Java API:
------------
构造方法摘要
BufferedOutputStream
public BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。

参数:
out - 基础输出流。
BufferedOutputStream
public BufferedOutputStream(OutputStream out,
                            int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

参数:
out - 基础输出流。
size - 缓冲区的大小。 
抛出: 
IllegalArgumentException - 如果 size <= 0
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo4:通过一个OutputStream对象来构造一个BufferedOutputStream对象。
  而FileOutputStream类是OutputStream类的子类,所以可以用它来构造。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10  } 

11  
12 }

-------------------------------------------------------------------------------
运行结果:1.txt文件为空。原因:缓冲区没有写满,程序没有向文件写数据。
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
解决方法1:使用flush()方法:
-------------------------------------------------------------------------------
Demo4:使用flush()方法,可以使程序立即向文件写数据。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.flush();
12  } 

13  
14 }

-------------------------------------------------------------------------------
运行结果:数据被写入相应的文件。
-------------------------------------------------------------------------------
解决方法2:使用close()方法:
-------------------------------------------------------------------------------
Demo5:使用close()方法,同样可以使程序立即向文件写数据。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.close();
12  } 

13  
14 }

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

flush()和close()的区别:
还要使用流对象,还需要写数据,使用flush(),否则使用close()。

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

-------------------------------------------------------------------------------
Demo6:使用BufferedInputStream流,从文件中读取数据。
  同样要用InputStream流对象或者其子类的对象来构造。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " 1.txt " );
 8   BufferedOutputStream bos  =   new  BufferedOutputStream(fos);
 9   bos.write( " http://www.cnblogs.com " .getBytes());
10   
11   bos.close();
12   
13   FileInputStream fis  =   new  FileInputStream( " 1.txt " );
14   BufferedInputStream bis  =   new  BufferedInputStream(fis);
15    byte [] buf  =   new   byte [ 100 ];
16    int  len  =  bis.read(buf);
17   
18    //  使用String的这个构造方法:
19    //  String(byte[] bytes, int offset, int length) 
20    System.out.println( new  String(buf,  0 , len));
21   bis.close();
22  } 

23  
24 }

-------------------------------------------------------------------------------
运行结果:输出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
public DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。计数器 written 被设置为零。

参数:
out - 基础输出流,将被保存供以后使用。
-------------------------------------------------------------------------------
Demo7:使用DataOutputStream流,将基本数据类型以二进制形式写入文件中。
  同样要用InputStream流对象或者其子类的对象来构造,
  这里使用BufferedOutputStream对象来构造。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " dos.txt " );   //  获得写入文件功能 
 8    BufferedOutputStream bos  =   new  BufferedOutputStream(fos);  //  获得缓冲功能 
 9    DataOutputStream dos  =   new  DataOutputStream(bos);   //  获得写入基本类型功能 
10    
11     /* 
12    * 定义8种基本类型的对象
13     */ 

14    byte  b  =   3 ;
15    short  s  =   4 ;
16    int  i  =   78 ;
17    long  l  =   100000 
18    char  ch  =   ' a ' ;
19    boolean  bl  =   false ;
20    float  f  =   4.5f ;
21    double  d  =   4.0001 ;
22   
23     /* 
24    * 将8种基本类型的对象写入文件中
25     */ 

26   dos.writeByte(b);
27   dos.writeShort(s);
28   dos.writeInt(i);
29   dos.writeLong(l);
30   dos.writeChar(ch);
31   dos.writeBoolean(bl);
32   dos.writeFloat(f);
33   dos.writeDouble(d);
34   dos.close();
35  } 

36  
37 }

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

 1  import  java.io. * ;
 2  
 3  public   class  StreamDemo  {
 4  
 5    public   static   void  main(String[] args)  throws  Exception  {
 6   
 7   FileOutputStream fos  =   new  FileOutputStream( " dos.txt " );   //  获得写入文件功能 
 8    BufferedOutputStream bos  =   new  BufferedOutputStream(fos);  //  获得缓冲功能 
 9    DataOutputStream dos  =   new  DataOutputStream(bos);   //  获得写入基本类型功能 
10    
11     /* 
12    * 定义8种基本类型的对象
13     */ 

14    byte  b  =   3 ;
15    short  s  =   4 ;
16    int  i  =   78 ;
17    long  l  =   100000 
18    char  ch  =   ' a ' ;
19    boolean  bl  =   false ;
20    float  f  =   4.5f ;
21    double  d  =   4.0001 ;
22   
23     /* 
24    * 将8种基本类型的对象写入文件中
25     */ 

26   dos.writeByte(b);
27   dos.writeShort(s);
28   dos.writeInt(i);
29   dos.writeLong(l);
30   dos.writeChar(ch);
31   dos.writeBoolean(bl);
32   dos.writeFloat(f);
33   dos.writeDouble(d);
34   dos.close();
35   
36   FileInputStream fis  =   new  FileInputStream( " dos.txt " );
37   BufferedInputStream bis  =   new  BufferedInputStream(fis);
38   DataInputStream dis  =   new  DataInputStream(bis);
39   System.out.println(dis.readByte());
40   System.out.println(dis.readShort());
41   System.out.println(dis.readInt());
42   System.out.println(dis.readLong());
43   System.out.println(dis.readChar());
44   System.out.println(dis.readBoolean());
45   System.out.println(dis.readFloat());
46   System.out.println(dis.readDouble());
47   dis.close();
48  } 

49  
50 }

-------------------------------------------------------------------------------
运行结果:数据正常输出:
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。不建议对这两个对象尝试使用单个线程,因为这样可能会死锁该线程。传送输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。 

connect
public void connect(PipedInputStream snk)
             throws IOException
将此传送输出流连接到接收者。如果此对象已经连接到其他某个传送输入流,则抛出 IOException。

如果 snk 为未连接的传送输入流,而 src 为未连接的传送输出流,则可以通过以下任一调用使其连接: 
 src.connect(snk)
或: 
 snk.connect(src)
这两个调用的效果相同。

参数:
snk - 要连接的传送输入流。 
抛出: 
IOException - 如果发生 I/O 错误。
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo9:利用管道输入流和输出流进行通讯。
-------------------------------------------------------------------------------

 1  import  java.io. * ;
 2  
 3  public   class  PipedStreamDemo  {
 4  
 5    public   static   void  main(String[] args)  {
 6   PipedOutputStream pos  =   new  PipedOutputStream();
 7   PipedInputStream pis  =   new  PipedInputStream();
 8   
 9     try   {
10    pos.connect(pis); 
11     // pis.connect(pos); 二选一即可 
12     
13     new  Producer(pos).start();
14     new  Consumer(pis).start();
15    } 
  catch  (IOException e)  {
16     //  TODO 自动生成 catch 块 
17     e.printStackTrace();
18   } 

19  } 

20  
21 } 

22  
23  /* 
24  * 生产者线程
25   */ 

26  class  Producer  extends  Thread  {
27  
28   private  PipedOutputStream pos;
29  
30    public  Producer(PipedOutputStream pos)  {
31    this .pos  =  pos;
32  } 

33  
34    public   void  run()  {
35     try   {
36    pos.write( " Hello, welcome you! " .getBytes());
37    pos.close();
38    } 
  catch  (Exception e)  {
39    e.printStackTrace();
40   } 

41  } 

42  
43 } 

44  
45  /* 
46  * 消费者线程
47   */ 

48  class  Consumer  extends  Thread  {
49  
50   private  PipedInputStream pis;
51  
52    public  Consumer(PipedInputStream pis)  {
53    this .pis  =  pis;
54  } 

55  
56    public   void  run()  {
57     try   {
58     byte [] buf  =   new   byte [ 100 ];
59     int  len  =  pis.read(buf);
60    System.out.println( new  String(buf,  0 , len));
61    pis.close();   //  关闭输入流 
62    } 
  catch  (Exception e)  {
63    e.printStackTrace();
64   } 

65  } 

66  
67 } 

68 

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

分享到:
评论

相关推荐

    Java IO 字节流 字符流

    Java IO系统分为两大类:字节流和字符流。字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 ...

    javaIO字节流读取文件方式总结共4页.pdf.zip

    本资料“javaIO字节流读取文件方式总结共4页.pdf”详细介绍了Java字节流在读取文件时的各种方法和应用场景。本文将深入探讨这些知识点。 首先,Java中的字节流分为输入流(InputStream)和输出流(OutputStream)。...

    java IO 字节流详解及实例代码

    Java IO 字节流详解及实例代码 Java IO 字节流是 Java 编程语言中最基本的输入/输出机制。它提供了各种输入/输出流,以满足不同的输入/输出需求。在本文中,我们将详细介绍 Java IO 字节流的概念、分类、实例代码和...

    Java IO字符流和字节流

    ### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、...3、JAVA IO流经典代码示例,示例从易到难。代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。

    IO流 javaio java 流

    Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又可以进一步细分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)...

    JavaIO字节输出流的总结共6页.pdf.zip

    Java IO字节输出流是Java平台中用于处理数据输出的核心部分,它允许程序将字节数据写入到各种目标,如文件、网络连接或者内存缓冲区。在Java中,字节输出流通常与字节输入流配合使用,完成数据的读取和写入操作。...

    ByteIO_java_字节流_

    Java的`java.io`包提供了大量预定义的字节流类,例如`FileInputStream`和`FileOutputStream`用于文件操作,`SocketInputStream`和`SocketOutputStream`则涉及网络通信。 在`ByteIO.java`文件中,我们可以预期看到...

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    该代码源码资源是一个用于讲解Java IO流的示例代码库。它包含了常见的IO类和方法的使用...通过研究这些代码示例,读者将能够了解如何使用不同类型的IO类来进行文件读写、字符流、字节流、网络传输等各种常见的IO操作。

    java io流 案例

    Java IO库提供了丰富的类和接口来支持不同类型的流,包括字节流、字符流、对象流、缓冲流、转换流以及过滤流等。 字节流(Byte Stream)是处理原始二进制数据的流,分为输入流和输出流。InputStream和OutputStream...

    Java IO流 总结

    字节流是Java IO流中最基本的流类型,可以处理一切类型的数据。字节流可以分为两种:输入流和输出流。 a) 输入流:InputStream InputStream是字节流的输入流,负责从外部世界输入数据到Java应用程序中。常用的...

    Java-Io流,练习

    1. 字节流:Java的`java.io`包中提供了处理字节流的类,如`InputStream`和`OutputStream`作为所有字节输入流和输出流的基类。它们的子类如`FileInputStream`和`FileOutputStream`分别用于文件的读写。 2. 字符流:...

    java中IO流例子

    IO流分为字节流(Byte Stream)和字符流(Character Stream),它们构成了Java IO系统的基础。 1. **字节流**: - 字节流主要处理单个字节的数据,包括`InputStream`和`OutputStream`两个抽象基类。例如,`...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    java IO流读写

    在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode编码的16位字符。 1. **字节流**: - `InputStream` 和 `OutputStream` 是所有...

    JAVA IO流技术

    - 处理数据单元:字节流按字节进行读取(InputStream、OutputStream),字符流按字符进行读取(Reader、Writer)。 - 功能差异:节点流直接连接到数据源或目的地,如`FileInputStream`,而处理流不直接连接,它们...

    java IO流精讲 JAVA IO流实例开发

    其次,根据处理的数据类型,IO流又分为字节流和字符流。字节流处理原始的8位字节数据,如FileInputStream和FileOutputStream;而字符流处理Unicode字符,如Reader和Writer。字符流通常用于处理文本数据,它们内部...

    JavaIO流详细总结

    - 字节流:处理单个字节的数据,包括InputStream和OutputStream两大类,它们的子类如 FileInputStream 和 FileOutputStream 分别用于文件的读写。 - 字符流:处理Unicode字符,包括Reader和Writer两大类,其子类如...

    java io流源代码

    IO流在Java中分为两大类:字节流和字符流,每种流又有输入流和输出流之分。字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符。 1. 字节流: - **InputStream** 和 **OutputStream** 是所有字节...

Global site tag (gtag.js) - Google Analytics