Java.io包的File类,File类用于目录和文件的创建、删除、遍历等操作,但不能用于文件的读写。

Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流。如何理解流的概念呢?可以把流看成流动的自来水,打开水龙头,自来水就会通过自来水管从水源流到用户家中,同样的道理,水库中的水也会通过管道流入到水源。从水源流出到用户住家为自来水的输出流,从水库流入到水源为自来水的输入流,只有这样,自来水才能源源不断地流出到用户家中。

如果把水源看成文件,用户住家为读取文件的对象,水库为写入文件的对象,就很容易理解Java的输入与输出流了。当Java程序的写入对象(水库)需要将自来水写入到水源(文件)时,需要建立一条从写入对象(水库)到水源(文件)的通道,这个通道就是输入流;当Java程序的读取对象(用户住家)需要读取水源(文件)时,也需要建立一条从水源(文件)到读取对象(用户住家)的通道,这个通道就是输出流。

在Java程序中,要想从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样程序就可以从文件中读取数据了;反之,如果要在Java程序中把数据写入到文件中,也需要在程序和文件之间建立一条数据输出的通道。当程序创建输入流对象时,Java会自动建立这个数据输入通道,而创建输出流时,Java也会自动建立这个数据输出通道。如下图所示:

Java程序读取与写入数据

输入流是从文件读取数据,是一个拉取数据的过程;输出流是将数据写入到文件,是一个推送数据的过程。

为了便于理解输入输出流,前面都是以文件为数据源来讨论的。其实,Java的输入与输出流支持任何数据源的读取与写入,包括键盘、文件、网络、数据库等数据源。

输入流和输出流按读取和写入的数据单位可分为字节流和字符流,字节流是以字节为单位传输数据的流,字符流是以字符为单位传输数据的流。

Java所提供的输入流和输出流类封装在Java.io包中,Java输入输出流的体系结构如下图所示:

Java输入输出流体系结构

从图中可以看出,Reader和Write为字符输入输出流,InputStream和OutputStream为字节输入输出流。这四个类属于抽象流类,不能在程序中直接实例化使用,可以使用其派生的类。

InputStream类

InputStream抽象类是表示字节输入流的所有类的超类,它以字节为单位从数据源中读取数据,其派生的常用子类说明如下:

● FileInputStream类

该类以字节为单位从文件中读取数据。

● ByteArrayInputStream类

该类在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。

● ObjectInputStream类

该类从输入流读入对象,读取对象信息。

InputStream类定义了Java的输入流模型,下面是其常用方法的一个说明:

● public abstract int read() throws IOExecption

该方法用于从输入流中读取数据的下一个字节,返回读到的字节值,若遇到流的末尾,返回-1。

● public int read(byte[] b) throws IOExecption

该方法用于从输入流中读取b.length个字节的数据,并将数据存储到缓冲区数组b中,返回的是实际读到的字节数。

● public int read(byte[] b,int off,int len) throws IOExecption

该方法用于从输入流中读取len个字节的数据,并从数组b的off位置开始写入到这个数组中。

● public void close() throws IOExecption

关闭此输入流,并释放与此输入流相关联的所有系统资源。

OutputStream类

OutputStream抽象类是表示字节输出流的所有类的超类,它以字节为单位将数据写入数据源,其派生的常用子类说明如下:

● FileOutputStream类

该类以字节为单位将数据写入到文件。

● ByteArrayOutputStream类

该类在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。

●ObjectOutputStream类

该类将对象信息写入到输出流。

下面是OutputStream类的常用方法介绍。

●public abstract void write(int b) throws IOExecption

该方法用于将指定的字节写入到输出流。

● public int write(byte[] b) throws IOExecption

该方法用于将b.length个字节从指定的byte数组写入到输出流。

● public int write(byte[] b,int off,int len) throws IOExecption

该方法用于将len个字节的数据,并从数组b的off位置开始写入到输出流。

● public void close() throws IOExecption

关闭此输出流,并释放与此输出流相关联的所有系统资源。

Reader类

Read抽象类是表示字符输入流的所有类的超类,它以字符为单位从数据源中读取数据。其派生的常用子类说明如下:

● InputStreamReader类

该类从数据源读取字节并将其解码为使用指定的字符集的字符。

● FileReader类

该类继承于InputStreamReader,用于读取字符类文件,如文本文件。

● BufferedReader类

该类用于将缓冲区中的数据以字符为单位读取。

下面是Reader类的常用方法介绍。

● public int read(int b) throws IOExecption

该方法用于读取单个字符,返回作为整数读取的字符,如果已经到达流的末尾,返回-1。

● public int read(char[] cbuf) throws IOExecption

该方法用于将字符读入到cbuf,返回读取的字符数。

● public abstract int read(char[] cbuf,int off,int len) throws IOExecption

该方法用于读取len个字符的数据,并从数组cbuf的off位置读入到这个数组中。

● public abstract void close() throws IOExecption

关闭此输入流,并释放与此输出流相关联的所有系统资源。

Writer类

Writer抽象类是表示字符输出流的所有类的超类,它以字符为单位向数据源写出数据。其派生的常用子类说明如下:

● OutputStreamWriter类

该类将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流的输出对象。

● FileWriter类

该类从 OutputStreamWriter 类继承而来。该类按字符向字符类文件写入数据。

● BufferedWriter类

该类用于将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。

下面是Writer类的常用方法介绍。

● public void write(int b) throws IOExecption

该方法用于向数据源写入单个字符。

● public void write (char[] cbuf) throws IOExecption

该方法用于向数据源写入字符数组。

● public abstract void write (char[] cbuf,int off,int len) throws IOExecption

该方法用于向数据源写入len个字符数据,并从数组cbuf的off位置开始。

● public void write (String str) throws IOExecption

该方法用于向数据源写入字符串。

● public abstract void flush() throws IOExecption

刷新该输出流的缓冲,将缓冲的数据全部写入到数据源。

● public abstract void close() throws IOExecption

关闭此输出流,关闭之前需先调用flush()。

■ 知识点拨

流是一个抽象的概念,它代表一串数据的集合,当Java程序需要从数据源读取数据时,就需要开启一个到数据源的流。同样,当程序需要输出数据到目的地时,也需要开启一个流。流的创建是为了更方便地处理数据的输入和输出。

深入理解Java输入输出流的更多相关文章

  1. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  2. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

  3. Java输入输出流(转载)

    转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ...

  4. Java 输入输出流 (七)

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  5. Java基础学习总结(47)——JAVA输入输出流再回忆

    一.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列. Java的I/O流提供了 ...

  6. Java输入输出流(一)——常用的输入输出流

    1.流的概念:在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流--输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分 ...

  7. java 输入输出流1 FileInputStrem&&FileOutStream

    通过文件输入流读取问价 package unit6; import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...

  8. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

  9. java输入输出流(内容练习)

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...

随机推荐

  1. Yii2.0 RESTful API 之速率限制

    Yii2.0 RESTFul API 之速率限制 什么是速率限制? 权威指南翻译过来为限流,为防止滥用,你应该考虑对您的 API 限流. 例如,您可以限制每个用户 10 分钟内最多调用 API 100 ...

  2. Hibernate之关联关系(一对多)

    今日分享hibernate框架的简单关联关系 一:关联关系简介 1.1 什么是关联关系 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性. 例如: class B{ ...

  3. 微软发布云端基因服务:推动AI驱动的精准医疗

    微软发布云端基因服务:推动AI驱动的精准医疗 2018年03月07日 00:00:00 微软研究院AI头条 阅读数:117    版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  4. 一次腾讯云centos服务器被入侵的处理

    昨天一大早,我还没到公司呢,就收到腾讯云安全中心发来的服务器异常登录告警,登录控制台一看,ip还是美国的,一脸懵逼.由于本人之前也没有过处理服务器入侵的经验,而且这台服务器目前还没有部署商用系统,所以 ...

  5. Plugin 免费CSS生成器CssCollector

    下载: 百度云 自己在做Web开发的时候,页面里会有很多样式类,一个个复制到样式表里总感觉很麻烦 网上也没有找到合适的工具,可以一键生成样式表 所以,干脆自己做一个咯~ 案例展示 花了一天时间,CSS ...

  6. 解决window 12 service 不能调用excel ,报"System.Runtime.InteropServices.COMException (0x800A03EC)

    Step1: 运行comexp.msc -32 注意因为excel 是32 位的,所以这里用的32位的操作, 如用64位的操作命令:dcomcnfg.exe,将找不到excel com 进入compo ...

  7. HugePages概述--翻译自19C文档

    翻译自: https://docs.oracle.com/en/database/oracle/oracle-database/19/unxar/administering-oracle-databa ...

  8. c#通用语言运行时CLR

  9. SPI学习笔记1

    SPI 简介 SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola首先在其 MC68HCXX 系列处理器上定义的. SPI ...

  10. 详解分布式系统里session同步

    1.什么是session?什么又是cookie?他俩有啥联系和区别? 2.为什么要在多台服务器间进行session的共享同步? 3.以及有哪些方法来实现这个同步? 大家快搬板凳,老王开始扯淡咯~ 1. ...