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:繁体中文
字符流的类结构
文件字符流:
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:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
- 使用缓冲流读文件:
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();
}
- 使用缓冲流写入文件:
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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!