学习过程:先分清IO流的分类,在从最简单的类开始,然后比较每个类的优点,记得手敲一遍
一、Java的IO流分类:
- 按照数据流向
输入流 : 读数据
输出流 : 写数据 - 按照数据类型
字节流: 字节输入流、字节输出流
字符流:字符输入流、字符输出流
如下图:
一般情况,我们都是按照 IO 流的分类是按照数据类型来说的,windows自带的记事本打开后,我们可以读懂的使用字符流,否则使用字节流,不知道使用什么的时候就直接使用字节流 😮
输入流的超类: InputStream
输出流的超类: OutputStream
字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据
😮 😮 😮到这里,你应该记住字节流和字符流是如何区分。看下图:
二、Java中的 字节流
InputStream 字节输入流的所有类的超类
OutputStream 字节输出流的所有类的超类
两个类都为抽象类,子类都是以父类类名为后缀
(当你知道这个类的超类规范的时候,学习其中一个子类,对比其它子类解决的问题就好了 )
字节输出流 FileOutputStream 为例(详解点击链接查看)
构造函数初始化:
FileInputStream(String name)
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
- FileOutputStream三种写入文件方式:
public class FileOutputStreamDemo01 {
public static void main(String[] args) throws IOException {
//创建文件输入流 指定写入文件:
// FileOutputStream fos=new FileOutputStream(new File("D:\\桌面\\毕业\\基本信息.txt"));
FileOutputStream fos=new FileOutputStream("D:\\桌面\\毕业\\基本信息.txt");
/**
* 方式一:将指定字节写入文件
*/
fos.write(97);
fos.write(98);
fos.write(99);
/**
* 方式二:将指定字节数组写入此文件
*/
byte[] by={'H','E','L','L','O'};
fos.write(by);
/**
* 方式三:指定片段写入
*/
//最后一定记得关闭,释放资源
fos.write(by,1,2);
fos.close();
}
}
运行结果:
相对于文件来说,这里叫写入,所以是写入文件!相对于内存条,是输出,也就是上面说的字节输出流
接下来了解字节输入流
与之对应的:
字节输入流 FileInputStream(详解点击链接)学习直接看里面的样例代码,了解构造函数就好了
为了提高速度,所以有了子类的子类 BufferedInputStream ,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(与之对应的BufferedOutputStream)
还有几个子类可以参照 JavaAPI 查看类的详情
😮 😮 😮 到这里 你应该掌握了字节流中最基本的读写数据
三个代码样例可以学习一下增加印象:复制文本、复制图片、复制视频
三、Java 中的 字符流
Reader 用于读取字符流的抽象类。
子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
Writer 用于写入字符流的抽 象类。
子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
解读:这里的 Reader 是内存读取了硬盘文件中的字符所以是读取字符流,Writer 从内存中向硬盘文件中写入字符
字符输入流以OutputStreamReader为例:
构造函数初始化:
OutputStreamWriter(OutputStream out)
创建一个使用默认字符编码的OutputStreamWriter。
五中写数据方式:(提醒:往硬盘文件写数据)
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class OutputStreamWriteDemo {
public static void main(String[] args)throws Exception {
//OutputStreamWriter(OutputStream out)创建一个使用默认字符编码的OutputStreamWriter
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\桌面\\基本信息.txt"));
//写入单个字符
osw.write(97);
osw.flush(); //刷新流
//写入字符数组
char [] chars={'a','b','c','d'};
osw.write(chars);
osw.flush();
//字符数组写入一部分
osw.write(chars,1,3);
osw.flush();
//写入字符串
osw.write(new String(chars));
osw.flush();
//写入字符串的一部分
osw.write(new String(chars),1,3);
osw.flush();
osw.close();
//close关闭时会先刷新流再关闭;
}
}
与之相对的 InputStreamReader 字符流读数据
InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
两种读数据方式:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderDemo02 {
public static void main(String[] args)throws IOException {
InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\桌面\\基本信息.txt"));
//一次读取一个字符
// int ch;
// while((ch=isr.read())!=-1){
// System.out.print((char)ch);
// }
// isr.close();
//一次读取一个字符数组
char[] chars=new char[1024];
int len;
while ((len=isr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
}
}
😮 😮 😮 相对于上面的 InputStreamReader 和 OutputStreamWriter 太长,容易拼错,所以可以使用他们的子类 FileReader 和 FileWriter
FileReader类:
FileReader(File file)
创建一个新的 FileReader ,给出 File读取。
FileWriter 类
FileWriter(File file)
给一个File对象构造一个FileWriter对象。
使用FileReader、FileWriter 代替InputStreamReader、OutputStreamWriter方便我们写代码,但是如果需要解决字符流中的编码问题,还是需要使用OutputStreamWriter、InputStreamReader中的方法
为了提高字符流的读写速度,可以使用字符缓冲流
BufferedReader 和BufferedWriter
具体方法的使用可以查看API