A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© leixing1012 中级黑马   /  2015-9-19 20:18  /  240 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java IO流

流的概念

  Java程序通过流来进行输入/输出。

  流是生产或消费信息的抽象。

  流通过Java的输入输出系统与物理设备链接。

  尽管物理设备不尽相同,但是所有流的行为具有同样的方式。

  这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着,一个输入流能够抽象多种类型的输入:从磁盘文件、从键盘或从网络套接字;同样,一个输出流可以输出到:控制台、磁盘文件或相连的网络。处理输入输出不需要代码理解键盘和网络的不同。

  Java中流的实现是在java.io包定义的类层次结构内部的。


输入/输出流概念

  输入/输出时,数据在通信通道中流动。

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



  输入/输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。

  若程序是数据流的源,即数据的提供者,这个数据流相对于程序来说就是一个“输出数据流”(数据从程序流出);若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。

输入/输出类

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

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

  从流结构上可分为字节流(Byte Streams,以字节为处理单位或称面向字节)和字符流(Character Streams,以字符为处理单位或称面向字符)。

  字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。

  字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer。

  在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。

输入流和输出流的处理逻辑



读数据的逻辑为:

  open a stream

  while more information

  read information

  close the stream



写数据的逻辑为:

  open a stream

  while more information

  write information

  close the stream

另一种流的分类

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

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

  与目标相连的一定是节点流。

InputStream

  三个基本的读方法:

  abstract int read()

  抽象方法,所以InputStream是一个抽象类。读取输入流的下一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。

  int read(byte[] b)

  从输入流读入一些字节数据,把它们放进一个数组b,返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾。

  int read(byte[] b, int off, int len)

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

  为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?

  因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现。所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。

  程序例子:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamTest1
{

    public static void main(String[] args) throws IOException
    {
        InputStream is = new FileInputStream("d:/test.txt");

        byte[] buffer = new byte[200];

        int length = 0;

        while (-1 != (length = is.read(buffer, 0, 200)))
        {
            // 将字节数组转换成字符串
            String str = new String(buffer, 0, length);
            System.out.println(str);
        }

        // 将流所关联到的资源关闭
        is.close();
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马