J02-Java IO流总结二 《概述》
1 流的概念
流是一个信息的通道,通过通道可以访问通道连接的文件对象。
2 流的分类
根据流中数据的流向,可分为输入流和输出流
输入流:从其他的地方流入到程序内存中的,比如InputStream、Reader
输出流:从程序内存将数据写出到目的地。比如:OutputStream、Writer
根据流处理的数据单元,可分为字节流和字符流
字节流:以字节为单位来处理数据的流 。InputStream OutputStream
字符流:以字符为单位处理的流,Reader,Writer
注:
1) 字符流只能处理文本数据。事实上,字符流是封装了的字节流,通过封装,增加了字节和字符之间转换的功能
——关于这点后面的J04-Java IO流总结四 《 FileReader和FileWriter 》中有相应介绍。
2) 字节流所有的数据都能处理。
根据数据源的不同,可以分为节点流和处理流
节点流:直接和数据源相连的流,比如 FileInputStream、FileOutputStream
处理流:以流为数据源的流,比如BufferedInputStream、BufferedOutputStream
3 四大IO抽象类
InputStream、OutputStream和Reader、Writer这四个类是所有IO流类的抽象父类,了解一下这个四个抽象类的作用,后面再通过它们具体的子类熟悉相关的用法。
3.1 InputStream
InputStream抽象类是表示字节输入流的所有类的父类。InputStream是一个抽象类,因此它不可以实例化,数据的读取需要由它的子类来实现。根据节点的不同,它派生了不同的节点流子类 。
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)。
常用方法:
int read() throws IOException
read()方法从流中读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值)。注:这里返回的是int数值中的低八位,它保存了读取到的字节数据。如果未读出字节则返回-1(即:如果read()方法返回-1则表示读取到了流的末尾)。
另外需要注意的是该方法的结果是以int类型返回的,之所以以int类型返回,是为了避免和流的末尾 标志-1 产生冲突——由上面可知,我们是根据read()方法的返回结果是否为-1来判断是否读到了流的末尾的,然而在读到流的末尾之前,有时候是有可能会读到1111 1111这样的文件数据的,而1111 1111正好是-1的二进制补码形式,这个时候如果直接以byte形式返回,那么返回的就是-1,则会误判为读到了流的末尾,显然这是不正确的。如果是以int形式返回,则不会有这种问题——这时候,会将读到的字节跟0xff做&操作即b & 0xff,以取得int形式并返回。在后面的自己实现的BufferedInputStream中可以看到这个实现。
int read(byte b[]) throws IOException
该方法每次从流中读取最多 b.length 长度个字节数据,并保存到b字节数组中。如果流中剩余的字节数小于字节数组的长度,那么就全部读取进来。方法的返回值是每次读取时读到的字节数,若读取到了流的末尾,则返回-1。
int read(byte b[], int off, int len) throws IOException
该方法跟上面的第2个方法差不多同样意思,只不过它是每次从流中读取最多 len 长度个字节数据,并放到字节数组b的 [off, off + len)位置中,如果流中剩余的字节数小于len,那么就全部读取进来。方法的返回值是每次读取时读到的字节数,若读取到了流的末尾,则返回-1。
void close() throws IOException
关闭输入流对象,释放相关系统资源。
3.2 OutputStream
OutputStream是所有字节输出流的抽象父类。输出流接收输出字节并将这些字节发送到某个目的地。
常用方法:
void write(int b) throws IOException
方法往输出流中写入一个字节b对应的整数int,注意这里写入的是int的低八位中的字节数据!
void write(byte b[]) throws IOException
将整个字节数组b[] 中的内容都写入到输出流中。
void write(byte b[], int off, int len) throws IOException
将字节数组b的[off, off + len)区间上的数据写入到输出流中
void flush() throws IOException
刷新缓冲区,将缓冲区中的数据写出到目的地。输出流关闭的时候也会将缓冲区中的内容写出到目的地。
void close() throws IOException
关闭流对象,释放相关系统资源。
3.3 Reader
Reader是所有字符输入流的抽象父类,在该流中传输的数据单位为字符。事实上Reader和InputStream中的常用方法是大同小异的,只不过InputStream是以字节为单位从流中读取数据,而Reader是以字符为单位读取数据。
常用方法:
int read() throws IOException
读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode值)。如果未读出字符则返回-1(返回值为-1表示读取结束)。
int read(char cbuf[]) throws IOException
每次从流中读取最多 cbuf.length 长度个字符数据,并保存到字符数组cbuf中,如果流中剩余的字符数小于cbuf数组的长度,那么就全部读取进来。方法的返回值是每次读取时读到的字符数,若读取到了流的末尾,则返回-1。
int read(char cbuf[], int off, int len) throws IOException
该方法每次从流中读取最多 len 长度个字符数据,并放到字符数组cbuf的 [off, off + len)位置中,如果流中剩余的字符数小于len,那么就全部读取进来。方法的返回值是每次读取时读到的字符数,若读取到了流的末尾,则返回-1。
3.4 Writer
Writer是所有字符输出流的抽象父类,在该流中传输的数据单位为字符。
常用方法:
void write(int c) throws IOException
向输出流写入一个字符数据,写入的字符数据为参数b的低16位。
void write(char cbuf[]) throws IOException
将字符数组cbuf中的数据写入输出流。
void write(char cbuf[], int off, int len) throws IOException
将字符数组cbuf中的 [off, off + len)部分的数据写入输出流。
void write(String str) throws IOException
将字符串str中的字符写入到输出流中,方法的源码如下:
public void write(String str) throws IOException {
write(str, 0, str.length());
}
可见它底层调用的是下面的第5个方法。
void write(String str, int off, int len) throws IOException
该方法将一个字符串从off开始的len个字符写入到输出流
J02-Java IO流总结二 《概述》的更多相关文章
- java IO流 (二) IO流概述
1.流的分类* 1.操作数据单位:字节流.字符流* 2.数据的流向:输入流.输出流* 3.流的角色:节点流.处理流 图示: 2.流的体系结构 说明:红框对应的是IO流中的4个抽象基类.蓝框的流需要大家 ...
- java IO流(二)
一.字符编码 char计算机存储的都是二进制数据,其实就是一个一个的数值字符要存储,就必须让这个字符对应一个数 将一个字符转成数字,这个过程就叫编码,反过来将一个数字转成字符就叫解码 中国大陆 (GB ...
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- 《二》Java IO 流的分类介绍
一.根据流向分为输入流和输出流: 注意输入流和输出流是相对于程序而言的. 输出:把程序(内存)中的内容输出到磁盘.光盘等存储设备中 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序 ...
- Java IO(十二) 字符流 Writer 和 Reader
Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...
- Java IO流详解(二)——File类
在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...
- IO流(二)
二.File类 概述 文件和目录路径名的抽象表示形式 构造方法 public File(String pathname) public File(String parent,String child) ...
- Java IO(一)概述
Java IO(一)概述 一.IO概述 (一).介绍 在Java中,所有的数据都是通过流读写的,Java提供了IO来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式 ...
- Java IO流题库
一. 填空题 Java IO流可以分为 节点流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...
- JAVA.IO流学习笔记
一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...
随机推荐
- 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)
传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...
- 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
- Django入门与实践-第22章:基于类的视图
http://127.0.0.1:8000/boards/1/topics/2/posts/2/edit/ http://127.0.0.1:8000/ #boards/views.py from d ...
- python小练习--函数调用函数,让对象具有能动性
class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入 ...
- UVa 12003 Array Transformer (分块)
题意:给定一个序列,然后有 m 个修改,问你最后的序列是什么,修改是这样的 l r v p 先算出从 l 到 r 这个区间内的 小于 v 的个数k,然后把第 p 个的值改成 k * u / (r - ...
- SceneControl+AE+鼠标滚轮缩放
要为SceneControl设置鼠标滚轮缩放必须定义委托,因为SceneControl没有Wheel事件,所以委托From的Wheel事件 public Form1() { InitializeCom ...
- cried me a river--kristinia debarge
cried me a river--kristinia debarge I still remember the day that we metI hold on to every word you ...
- [CentOS]Centos设置PATH全局变量
PATH确认方法 $ echo $PATH 根据优先级先后顺序用:分割,因此可以复数指定 PATH设定方法(临时) $ export PATH=$PATH:/usr/local/scala/bin P ...
- Hyper-V启动虚拟机,消耗C盘大量磁盘空间
问题描述 经常使用Hyper-V虚拟机的朋友,可能会碰到这样的现象,当启动某些虚拟机的是否,发现C盘的空间突然减少,减少的空间与虚拟机的内存一样大少. 通过分析C盘空间的磁盘文件,发现在Hyper-V ...
- Code First 更新数据库 记录
每次都会忘记这个,所以记录一下 第一步:打开程序包管理控制台 第二步:启动迁移配置 第三步: 更新数据库的迁移的名称 因为设置了多个context,所以要指定更新的是哪一个库. 如果没有指定,会出现下 ...