简介
- IO流是一种存储和读写数据的解决方案
- I/O : input / output
- 流 : 指数据如同流水般传输,描述其状态
- IO流的类位于java.io包下
- IO流分为字节流,字符流,从中可细分出输入流和输出流
(字节流一般处理非文本文件,毕竟图片,影像等存储信息以字节为单位)
(字符流一般处理纯文本文件,因为除英文,语言都以多个字节进行处理)
(当然纯文本文件只存储英文,用字节流解析也是可以的)- 字节流以一个字节为单位进行数据的读取和存储
字符流以一个字符为单位进行数据的读取和存储
(根据所用字符集,来确定一个字符为几个字节) - 反常识,输入和输出是以内存为参照物的
- 输入流: 文件 -> 内存
- 输出流: 内存 -> 文件
- 字节流以一个字节为单位进行数据的读取和存储
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象父类 / 基类 | InputStream | OutputStream | Reader | Writer |
这四个基类为抽象类,不能直接用,只能使用对应的子类
以下以最典型的类来说明
字节输入流
-
FileInputStream用于访问文件数据的输入
-
其构造方法有重载
public FileInputStream(String name) public FileInputStream(File file) //可以以路径或File对象为参数
-
关于File对象的概述点击此处
//示例 import java.io.FileInputStream; FileInputStream fis = new FileInputStream("myio//copy.txt"); //父级路径和子级路径之间只有一个"/",但因为在java中"/"为转译符号,故需使用两个"/" int b = fis.read(); //write()为输入流的方法,将文件中数据以字节为单位读入内存,返回值为0~255之间的int值(因为这是ASCII码表的范围),如没有可读字节,返回-1 fos.close(); //将文件和内存之间的"管道"关闭, 如果不这样的话,电脑系统默认该文件仍在使用中 System.out.println(b); //很明显,输出文件中第一个字母
-
如果文件不存在,会报错
FileInputStream类的read()拥有三种重载int read() //以上已介绍 int read(byte[] b) //将最多b.length个字节读入一个byte数组,返回实际读入字节数,若没有可读字节,则返回-1 int read(byte[] b, int off, int len) //与第二个基本一致,不过最多一次读入len个数组,从off索引开始
第一个read()要将其读入的数据用变量存储,来进行使用
第二个,第三个read()读入的数据则用数组存储,进行使用
字节输出流
-
FileOutputStream用于访问文件的输出
其构造方法为public FileOutputStream(String name) public FileOutputStream(File file) //可以以路径或File对象为参数
//示例 import java.io.FileOutputStream; FileOutputStream fos = new FileOutputStream("myio//a.txt"); //父级路径和子级路径之间只有一个"/",但因为在java中"/"为转译符号,故需使用两个"/" fos.write(97); //write()为输出流的方法,将字符集对应的数字转换为字符,存入文件,返回值为字符 fos.close(); //将文件和内存之间的"管道"关闭, 如果不这样的话,电脑系统默认该文件仍处于使用中 //很明显,文件中会写入"a"
-
如果文件不存在,会自动创建,但必须保证父级路径的存在
-
如文件已存在,则会清空文件,
需要使用构造方法的重写来开启续写开关,才能避免此情况FileOutputStream fos = new FileOutputStream("myio//a.txt", true); //true为开启标志,false为关闭标志 //读者大可试试其用法,比如来一张鸡哥来试试
FileOutputStream类的write()拥有三种重载,切记没有返回值
void write(int b) //一次写入一个字节,以上已介绍 void write(byte[] b) //一次写入一个字节数组 void write(byte[] b, int off, int len) //一次写入从off索引开始的len个字节
字符输入流
- FileWriter类用于访问文件的输入
- 其构造方法为FileWriter
public FileWrite(String name) public FileWrite(File file) //可以以路径或File对象为参数 //当然同样可以启动续写,true或false
- FileWriter的成员方法
void write(int c) //写出一个字符 void write(String str) //写出一个字符串 void write(String str, int off, int len) //写出一个字符串的一部分 void write(char[] cbuf) //写出一个字符数组 void write(char[] cbuf, int off, int len) //写出字符数组的一部分 //char[] chuf为其自带的缓冲区,这个缓冲区位于内存中, //与字节流的byte[] b相比,速度很快
- 用法和以上是一致的,不再赘述了
字符输出流
-
FileReader类用于访问文件的输入
其构造方法为public FileReader(String name) public FileReader(File file) //可以以路径或File对象为参数
- FileReader的成员方法
int read() int read(char[] chuf) int read(char[] cbuf, int off, int len) //char[ ] chuf为其自带的缓冲区,这个缓冲区位于内存中,与字节流的byte[] b相比,速度很快 //其他的不多赘述了
细节
- 输出流有一个相同功能的方法,flush(),
用于刷新此输出流,并强制写出所有缓冲的数据 - 当然close()是所有流共有的方法,用于关闭流,释放系统资源
- 字符流有缓冲区,字节流没有
- 输入流,指定文件不存在会报错,但输出流则会创建一个
这是因为数据从内存到文件,必定需要一个容器文件,这是有意义的
数据从文件到内存,若不存在,还强行创建,内存也不会得到数据,故没有意义
家人们,文章制作不易,愿这杯Java如你心愿,还请一键三连!!!