JavaIO流简介

来源:互联网 发布:外星人 台式机 知乎 编辑:程序博客网 时间:2024/05/22 03:37

Java的IO流:

1.      字节流的抽象基类

InputStream、OutputStream

2.      字符流的抽象基类

Read、Writer

注:

         由这四个类派生出来的子类名臣都是其父类名作为子类的后缀

         如InputStream的子类FileInputStream

         如Reader的子类FileRader

先来了解一下InputStream、OutputStream的子类分部情况:

在来了解一下Reader、Writer的子类分部情况

 

 

        Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所 有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键 盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不 同。Java中流的实现是在java.io包定义的类层次结构内部的。

 

一、输入/输出流概念

 

       输入/输出时,数据在通信通道中流动。所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。

 

         输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。

 

 

 

二、输入/输出类

    在java.io包中提供了60多个类(流)。

   1.从功能上分为两大类:输入流和输出流。

   2. 从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符)。字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。字符流是Java1.1版后新增加的以字符 为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer。

 

一个简单的字符流操作:拷贝文本文件

package com.wangjing;

 

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

 

/**

 *

 *@author wJing

 *time:2014-2-10 22:05:29

 */

public class CopyFileDemo {

 

        publicstatic void main(String[] args) {

                  copy1();

         }

         //从C盘读取一个字符就往d盘写

        publicstatic void copy1() {

                  try{

                           FileWriterfw = new FileWriter("d:\\demo.txt",true);

                           FileReaderfr = new FileReader("c:\\demo.txt");

 

                           intch = 0;

 

                           while((ch= fr.read()) != -1) {

                                    fw.write(ch);

                           }

 

                           fr.close();

                           fw.close();

                  }catch (IOException e) {

                           e.printStackTrace();

                  }

         }

 

         publicvoidcopy2() {

                  FileWriterfw = null;

                  FileReaderfr = null;

 

                  try{

                           fw= new FileWriter("d:\\demo.txt",true);

                           fr= new FileReader("c:\\demo.txt");

                           

                           char[]buf = new char[1024];

                           

                           intlen = 0;

                           

                           while((len= fr.read(buf)) != -1) {

                                    fw.write(buf,0, len);

                           }

                           

                  }catch(IOException e) {

                           thrownew RuntimeException(e);

                  }finally {

                           if(fr!= null) {

                                    try{

                                              fr.close();

                                    }catch (IOException e) {

                                              e.printStackTrace();

                                    }

                           }

                           if(fw!= null) {

                                    try{

                                              fw.close();

                                    }catch (IOException e) {

                                              e.printStackTrace();

                                    }

                           }

                  }

         }

 

}

一个简单的字节流操作,拷贝图片

package com.wj.stream;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

 

/**

 *

 *@author wJing

 *time :2014-2-11 22:26:59

 *

 * 拷贝图片资源

 */

public class CopyPic {

 

        publicstatic void main(String[] args) {

                  FileOutputStreamfos = null;

                  FileInputStreamfis = null;

                  try{

                           fis= new FileInputStream("d:\\a.jpg");

                           fos= new FileOutputStream("d:\\1_copy.jpg");

                           

                           byte[]buf = new byte[1024];

                           intlen = 0;

                           while((len= fis.read(buf)) != -1) {

                                    fos.write(buf,0, len);

                           }

                  }catch (Exception e) {

                           thrownew RuntimeException("复制文件出错!!!");

                  }finally {

                           if(fis != null) {

                                    try{

                                              fis.close();

                                    }catch (IOException e) {

                                              e.printStackTrace();

                                    }

                           }

                           if(fos != null) {

                                    try{

                                              fos.close();

                                    }catch (IOException e) {

                                              e.printStackTrace();

                                    }

                           }

                  }

         }

 

}

 

总结:

流操作的基本规律:

最痛苦的就是流对象太多,不知道该用哪一个

通过三个明确来完成:

 

1.      明确源和目的

源:输入流。InputStream      Reader

目的:输出流。OutputStream Writer

2.      操作的数据是否是纯文本

是:字符流

不是:字节流

3.      当体系明确后,在明确要使用哪个具体对象

通过设备进行区分:

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台


0 0
原创粉丝点击