博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java IO 流
阅读量:6358 次
发布时间:2019-06-23

本文共 2195 字,大约阅读时间需要 7 分钟。

Java IO流

 

流的概念

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

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

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

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

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

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

 

输入/输出流概念

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

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

 

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

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

 

输入/输出类

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

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

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

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

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

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

 

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

 

读数据的逻辑为:

  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的子类来实现。

  程序例子:

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();    }}

 

 

 

参考资料

  圣思园张龙老师Java SE系列视频教程。

转载地址:http://lnfma.baihongyu.com/

你可能感兴趣的文章
IE FF(火狐) line-height兼容详解
查看>>
谷歌Pixel 3吸引三星用户, 但未动摇iPhone地位
查看>>
VUE中使用vuex,cookie,全局变量(少代码示例)
查看>>
grep -w 的解析_学习笔记
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
mysqld_multi实现多主一从复制
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>
JVM(五)垃圾回收器的前世今生
查看>>
Spring Boot 自动配置之@EnableAutoConfiguration
查看>>
web前端笔记
查看>>
finally知识讲解
查看>>
Matplotlib绘图与可视化
查看>>
openstack ocata版(脚本)控制节点安装
查看>>
【微信公众号开发】获取并保存access_token、jsapi_ticket票据(可用于微信分享、语音识别等等)...
查看>>
datatable 获取最大值
查看>>
sqlserver2012一直显示正在还原(Restoring)和从单用户转换成多用户模式(单用户连接中)...
查看>>