-
按流向的类型:输入流和输出流
-
按角色的划分:节点流和处理流
字节流:主要是InputStream和outPutStream
字符流:主要是Reader和Writer
输入流:只能从中读取数据,不能向其写入数据
输出流:只能向其写入数据,不能从中读取数据
注:输入流主要是InputStream和Reader,输出流主要是outPutStream和Writer
节点流:可以从或向一个特定的地方(节点)读写数据。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
3、字节流与字符流的区别
在操作上,字节流本身不会用到缓存区,是文件本身直接操作的,而字符流使用了缓存区,通过缓存区再操作文件。
例:
- 使用字节流不关闭执行
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStreamDemo {
@SuppressWarnings(“resource”)
public static void main(String[] args) throws IOException {
//第1步:使用File类找到一个文件
File f = new File(“d:” + File.separator + “a.txt”);
// 第2步:通过子类实例化父类对象
OutputStream out = null;
// 准备好一个输出的对象
out = new FileOutputStream(f);
// 通过对象多态性进行实例化
// 第3步:进行写操作
String str = “Hello World!!!”;
// 准备一个字符串
byte b[] = str.getBytes();
// 字符串转byte数组
out.write(b);
// 将内容输出
// 第4步:关闭输出流
// out.close();
// 此时没有关闭
}
}
运行结果:
分析:此时没有关闭字节流输出操作,而文件中有输出内容,证明字节流是直接操作文件本身。
- 使用字符流不关闭
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WriterDemo {
@SuppressWarnings(“resource”)
public static void main(String[] args) throws IOException {
//第1步:使用File类找到一个文件
File f = new File(“d:” + File.separator + “a.txt”);
// 第2步:通过子类实例化父类对象
OutputStream out = null;
// 准备好一个输出的对象
out = new FileOutputStream(f);
// 通过对象多态性进行实例化
// 第3步:进行写操作
String str = “Hello World!!!”;
// 准备一个字符串
byte b[] = str.getBytes();
// 字符串转byte数组
out.write(b);
// 将内容输出
// 第4步:关闭输出流
// out.close();
// 此时没有关闭
}
}
结果:
- 关闭输出流并强制清空缓存区后
// 强制性清空缓冲区中的内容
out.flush();
// 将内容输出
// 第4步:关闭输出流
out.close();
结果:
分析:程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
字节流与字符流主要的区别是他们的的处理方式:
- 字节流主要用在处理二进制数据,它是按字节来处理的。
- 字符流是按虚拟机的Encode来处理,也就是要进行字符集的转化。
- 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
- 从字节流转化为字符流时,实际上就是byte[]转化为String,反之String转化为byte[]
4、java输入/输出流体系中常用的流的分类表
注:表中粗体字所标出的类代表节点流,必须直接与指定的物理节点关联:斜体字标出的类代表抽象基类,无法直接创建实例。
5、用法
- 使用FileInputStream类读取文件内容
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
- 数据输入流测试
*/
public class firstIO {
public static void main(String [] args) throws IOException{
int i=0;
FileInputStream in=null;
try {
in=new FileInputStream(“D:\a.txt”);//从文件外读数据
} catch (FileNotFoundException e) {
// TODO: handle exception
System.out.println(“找不到文件位置”);
System.exit(-1);
}
try {
int num=0;//用于字节个数的计数
while((i=in.read())!=-1){
System.out.println((char)i);//将得到的ASCII码值转换成字符型
num++;
}
in.close();
System.out.println(“传输字节个数:”+num);
} catch (Exception e) {
// TODO: handle exception
System.out.println(“读取文件错误”);
}
}
}
- 使用FileOutputStream写入文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
- 输入输出流测试
*/
public class outIO {
public static void main(String []args){
int i=0;
FileInputStream in=null;
FileOutputStream out=null;
try {
//实例化FileInputStream,FileOutputStream对象
in=new FileInputStream(“D:\a.txt”);
out=new FileOutputStream(“D:\b.txt”);
while((i=in.read())!=-1){
最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
//实例化FileInputStream,FileOutputStream对象
in=new FileInputStream(“D:\a.txt”);
out=new FileOutputStream(“D:\b.txt”);
while((i=in.read())!=-1){
最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
[外链图片转存中…(img-EUzVAqxn-1714736202751)]
[外链图片转存中…(img-2mKCittv-1714736202751)]
[外链图片转存中…(img-YK3SJFRC-1714736202752)]