一文了解IO框架,从此对IO不再发怵

BufferedOutputStream使用write方法写入缓冲区,flush方法写入磁盘。如果不调用flush方法,则只是写入到缓冲区中,没有写入磁盘文件中。close方法中会自己调用flush方法。

public static void main(String[] args) throws IOException {

//新建缓冲输出流
FileOutputStream fileOutputStream = new FileOutputStream(“d:\buffer.txt”);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

for(int i=0;i<10;i++){
//写入缓冲区(默认8k)
bufferedOutputStream.write(“abcdefg\r\n”.getBytes());
//刷新到磁盘
bufferedOutputStream.flush();
}
//关闭(内部会调用flush方法)
bufferedOutputStream.close();
}

对象流:

ObjectOutputStream、ObjectInputStream,使用流传输对象的过程称为序列化(将对象写入流中write的过程)和反序列化(读取并重构一个对象read的过程),所以在序列化和反序列化的过程中,会伴随有大量的io操作,使用对象流的几点好处:

  • 增强缓冲区功能
  • 增强了八种基本数据类型和字符串功能
  • 增强了读写对象的功能(readObject()从流中读取一个对象、writeObject(Object obj)向流中写入一个对象)
序列化和反序列化的实现:

首先创建实例类,用于序列化和反序列化

//创建对象并实现Serializable接口
public class Student implements Serializable{

/**

  • 序列化版本号id–保证序列化的类和反序列化的类是同一个类
    */
    private static final long serialVersionUID = 1L;

int age;
String name;

}

实现对象的序列化和反序列化操作:

public static void main(String[] args) throws IOException {

//序列化:
//表示一个二进制文件
FileOutputStream fileOutputStream = new FileOutputStream(“d:\stu.bin”);
//创建ObjectOutputStream
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//新建对象(该实例需要实现Serializable表明该对象可以序列化)
Student stu = new Student(12,“zs”);
//写入文件 实现序列化
objectOutputStream.writeObject(stu);
//关闭输出流(内部会调用flush方法)
objectOutputStream.close();

//反序列化:
//新建文件输入流和对象输入流
FileInputStream fileInputStream = new FileInputStream(“d:\stu.bin”);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
//读取对象(反序列化)
Student student = (Student) objectInputStream.readObject();
//关闭流
objectInputStream.close();
System.out.println(student.toString());
}

实现对象的序列化和反序列化时,需要注意的几点:
  • 序列化类必须要实现Serializable接口
  • 序列化类中的对象属性也需要实现Serializable接口
  • 序列化版本号ID(serialVersionUID),保证序列化的类和反序列化的类是同一个类
  • 使用transient(瞬时的)修饰属性,这个属性就不能序列化了
  • 静态属性是不能序列化的,静态属性属于类不属于某个对象
  • 序列化多个对象,可以借助List集合来实现

字符流

字符编码和字符集是两个基础性的概念,很多开发人员对其都并不陌生,但是很少有人能将其讲得很准确。

字符集(character set)是一个系统支持的所有抽象字符的集合。字符(character)就是各种文字和符号,包括国家文字、标点符号、图形符号、数字等。但是我们常说的字符集,其实是指编码字符集,编码字符集是指,这个字符集里的每一个字符,都对应到唯一的一个代码值。

字符编码的定义:是编码字符集的字符和实际的存储值之间的转换关系,当编码方式和解码方式不同,会出现乱码

常见的编码字符集有:

  • ISO-8859-1:收录除了ASCII外,还包括西欧、希腊、泰语、阿拉伯语、希伯来语对应的文字符号
  • UTF-8:针对Unicode码表的可变长度字符编码(一个汉字三个字节)
  • GB2312:简体中文
  • GBk:简体中文、扩充 GB2312的升级版
  • BIG5:繁体中文
字符流的类结构

image.png

文件字符流:

FileReader:

  • read():读取单个字符
  • read(char[] c):从流中读取多个字符,将读到的内容存入c数组,返回实际读到的字符数;如果达到文件的尾部(读完了),则返回-1

使用文件字符流读取文件:

public static void main(String[] args) throws IOException {
//创建FileReader
FileReader fReader = new FileReader(“d:\h.txt”);
//读取
//单个字符读取
int data = 0;
while((data = fReader.read())!=-1){
System.out.println((char)data);

}

//使用字符数组,多字符读取
char[] buf = new char[128];
int count = 0;
while((count = fReader.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}

fReader.close();
}

FileWriter:

  • write(String str)一次性写入多个字符,将b数组中所有的字符,写入输出流

使用文件字符流写入文件:

public static void main(String[] args) throws IOException {
//创建FileWriter
FileWriter fWriter = new FileWriter(“d:\h.txt”);
for(int i = 0;i<10;i++){
fWriter.write(“abcdefg”);
fWriter.flush();
}

fWriter.close();
}

  • 使用FileReader和FileWriter实现文件复制(只能复制文本文件,不能复制图片/音频等其他二进制文件):

public static void main(String[] args) throws IOException {
//创建FileReader
FileReader fReader = new FileReader(“d:\h1.txt”);
//创建FileWriter
FileWriter fWriter = new FileWriter(“d:\h2.txt”);

int data = 0;
//读写
while((data = fReader.read())!=-1){
fWriter.write(data);
}
fReader.close();
fWriter.close();
}

字符缓冲流:
  • BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现高效读取
  • BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
  1. 使用缓冲流读文件:

public static void main(String[] args) throws IOException {

//创建缓冲流
FileReader fileReader = new FileReader(“d:\h.txt”);
BufferedReader bReader = new BufferedReader(fileReader);

//方法1 使用字节数组
char[] buf = new char[1024];
int count = 0;
while((count = bReader.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
//方法二 使用readLine读取一行
String line = null;
while((line = bReader.readLine())!=null){
System.out.println(line);
}
bReader.close();
}

  1. 使用缓冲流写入文件:

public static void main(String[] args) throws IOException {

//创建
FileWriter fileWriter = new FileWriter(“d:\w.txt”);
BufferedWriter bWriter = new BufferedWriter(fileWriter);
//写入
for(int i = 0;i<10;i++){
bWriter.write(“abcdefg”);
//写入换行符
bWriter.newLine();
bWriter.flush();
}
bWriter.close();
}

转换流:

InputStreamReader/OutputStreamWriter:

  • 可以将字节流转换为字符流(InputStreamReader将字节输入流转换为字符输入流,OutputStreamWriter将字节输出流转换为字符输出流)
  • 可以设置字符的编码方式

InputStreamReader是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符,它使用的字符集可以由名称指定或显式给定。 OutputStreamWriter:字符流通向字节流的桥梁

public static void main(String[] args) throws IOException {

//创建
FileInputStream fis = new FileInputStream(“d:\a.txt”);
//设置字符的编码方式
InputStreamReader isr = new InputStreamReader(fis, “utf-8”);
//读取
int data = 0;
while((data = isr.read())!=-1){
System.out.println((char)data);
}
isr.close();

//创建
FileOutputStream fos = new FileOutputStream(“d:\b.txt”);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos,“utf-8”);
//写入
for(int i = 0 ;i<10;i++){
outputStreamWriter.write(“abcdefg”);
}
//关闭
outputStreamWriter.close();
}

File文件相关的api

代表物理盘符中的一个文件或者文件夹。常用的方法如下:

  • createNewFile()—创建一个文件
  • mkdir()—创建一个新目录
  • delete()—删除文件或空目录
  • exists()—判断file对象所代表的对象是否存在
  • getAbsoulutePath()—获取文件的绝对路径
  • getName()—获取名字
  • getParent()—获取文件所在的目录
  • isDirectory()—是否是目录
  • isFile()—是否是文件
  • length()—获取文件的长度
  • listFiles()—获取目录中所有的内容
  • renameTo()— 修改文件名为

结语

本文只是从基本的使用上展示了io框架是如何应用的,通过本文可以从宏观上了解io框架,同时对io框架的分类以及应用有一个更清楚的认识,当然更多的使用还是要看api的,在工作中灵活的使用才能有更深刻的认识。接下来还会从应用中更深入的剖析io。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
1715807510604)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值