IO简介
1.流Stream
在学习IO流之前,我们首先需要学习的概念就是Stream流
为了方便理解,我们可以把数据的读写操作抽象成数据在"管道"中流动,但需注意:
1.流只能单方向流动
2.输入流用来读取 → in
3.输出流用来写出 → out
4.数据只能从头到尾顺序的读写一次
所以以程序的角度来思考,In/out 相对于程序而言的输入(读取)/输出(写出)的过程.
2.IO流的继承结构
在java中,根据处理的数据单位不同,可以把流分为字节流和字符流
字节流 : 针对二进制文件
字符流 : 针对文本文件
再结合对应类型的输入和输出方向,常用的流有:
File
字节流:针对二进制文件
InputStream
FileInputStream
BufferedInputStream
ObjectInputStream
OutputStream
FileOutputStream
BufferedOutputStream
ObjectOutputStream
字符流:针对文本文件
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
PrintWriter一行行写出
3.字节输入流InputStream
此抽象类是表示字节输入流的所有类的超类/抽象类,不可创建对象哦
常用方法:
abstract int read() 从输入流中读取数据的下一个字节
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组,off表示存时的偏移量
void close() 关闭此输入流并释放与该流关联的所有系统资源
4.字节输出流OutputStream
此抽象类是表示输出字节流的所有类的超类.输出流接受输出字节并将这些字节发送到某个接收器.
常用方法:
Void close() 关闭此输出流并释放与此流相关的所有系统资源
Void flush() 刷新此输出流并强制写出所有缓冲的输出字节
Void write(byte[ ] b) 将b.length个字节从指定的byte数组写入此输出流
Void write(byte[ ] b,int off ,int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
Abstract void write(int b) 将指定的字节写入此输出流
5.字符输入流Reader
用于读取字符流的抽象类。
常用方法:
int read() 读取单个字符
int read(char[] cbuf) 将字符读入数组
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区
abstract void close() 关闭该流并释放与之关联的所有资源
6字符输出流Writer
写入字符流的抽象类
常用方法:
Abstract void close() 关闭此流,但要先刷新它
Void write(char[ ] cbuf) 写入字符数组
Void write(int c) 写入单个字符
Void write(String str) 写入字符串
Void write(String str,int off,int len) 写入字符串的某一部分
Abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分
7.字节流代码展示
package io;
import org.junit.Test;
import java.io.*;
/**
* 字节输入流InputStream
* 字节输出流OutPutStream
*/
public class IODemo {
public static void main(String[] args) throws IOException {
InputStreamIn();
// OutPutStreamOut();
}
/**
* 字节输出流
* 仅限写入
*/
private static void OutPutStreamOut() throws IOException {
//创建一个File对象
File file = new File("E:\\first\\a.txt");
/*
* 创建一个字节输入流,不能直接调用OutputStream,因为OutputStream是一个抽象类
* 所以需要调用他的子类FileOutputStream();括号里面需要传入一个文件的路径也就是File
* 还有一个选项可写可不写,就是在后面加上一个true,意思就是追加,不写默认就是不追加
* 但是FileInputStream这个抽象类会抱一个错误也就是:FileNotFoundException找不到文件
* 这个错误直接抛出就可以,因为还没有学try{}catch(){}
*/
OutputStream out = new FileOutputStream(file,true);//这句是在文本后面追加
// OutputStream out = new FileOutputStream(file);//这句是不追加覆盖掉之前写的代码
/*
* out.write()方法里面需要传入一个int类型的值
* 我传入的是97,但是97对应的是Unicode中的a
* 所以在文本中显示的就是a
*/
out.write(97);
out.write(97);
out.write(97);
out.write(97);
out.close();
}
/**
* 字节输入流
* 仅限读取
*/
private static void InputStreamIn() throws IOException {
//创建一个file文件
File file = new File("E:\\first\\a.txt");
/*
* 创建一个字节输入流,不能直接调用InputStream,因为InputStream是一个抽象类
* 所以需要调用他的子类FileInputStream();括号里面需要传入一个文件的路径也就是File
* 但是FileInputStream这个抽象类会抱一个错误也就是:FileNotFoundException找不到文件
* 这个错误直接抛出就可以,因为还没有学try{}catch(){}
*/
InputStream in = new FileInputStream(file);
//这边我们定义一个int类型的变量来接收读取的
int b;
/*
* in.read();读取文本中的下一个内容返回值是一个int类型的
* 当in.read();返回的是-1的时候证明他读完文本中的内容了
*/
while ((b = in.read()) != -1) {
//这便需要进行强转一下才能查看文本中的内容
System.out.print((char) b);
}
in.close();
}
}
8.字符流代码展示
package io;
import java.io.*;
/**
* 字符输出流Reader
* 字符输入流Writer
*/
public class RWDemo {
public static void main(String[] args) throws IOException {
// ReaderDemo();
WriterDemo();
}
/**
* 字符输入流
* 用法和OutputStream同理
*/
private static void WriterDemo() throws IOException {
//创建一个file文件
File file = new File("E:\\first\\a.txt");
/*
* 创建一个字符输入流
* 这边也会报错:FileNotFoundException未找到文件
* FileWriter()对象也是需要传入参数的第一个是File文件对象
* 第二个是true,为追加,也可以不写,不写就是覆盖之前的代码
*/
Writer out = new FileWriter(file,true);
/*
* out.write()方法里面需要传入一个int类型的值
* 我传入的是98,但是98对应的是Unicode中的b
* 所以在文本中显示的就是b
*/
out.write(98);
out.write(98);
out.write(98);
out.write(98);
out.close();
}
/**
* 字符输出流
* 用法和InputStream同理
*/
private static void ReaderDemo() throws IOException {
//创建一个file文件
File file = new File("E:\\first\\a.txt");
/*
* 创建一个字符输出流
* 这边也会报错:FileNotFoundException未找到文件
*/
Reader in = new FileReader(file);
int b;
//这边也会报错:IOException
while((b=in.read())!=-1){
System.out.print((char)b);
}
in.close();
}
}