IO
1.IO概述、分类
ps(一切皆为字节)
2.1字节输出流(OutputStream类&FileOutputStream类)的介绍
2.2字节输出流写数据到文件(内存到硬盘)
2.3文件存储原理图
2.4字节输出流写多个字节的方法
2.5字节输出流的续写与换行
3.1字节输入流(InputStream类&FileInputStream类)的介绍
3.1字节输入流读取字节数据
3.2字节输入流一次读取一个字节原理图
3.3字节输入流一次读取多个字节
已知:b.txt文件中存有ABCDE
原理分析
优化
4.文件复制(练习)
代码
package learn.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName FileDemo
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 8:41
* @Version 1.0
**/
//文件复制练习:
public class FileDemo {
public static void main(String[] args) throws IOException {
long start=System.currentTimeMillis();
//创建字节输入流
FileInputStream fis = new FileInputStream("d:\\cat.jpg");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("c:\\cat.jpg");
//1.循环读写文件
/* int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}*/
//2.优化1.方式
byte[] bytes=new byte[1024];
int len=0;
while ((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//关流
fos.close();
fis.close();
long end=System.currentTimeMillis();
System.out.println("复制文件共耗时:"+(end-start)+"毫秒");
}
}
打印结果截图
5.使用字节流读取中文出现的问题
6.1字符输入流(Reader类&FileReader类)的介绍
6.2字符输入流读取字符数据
6.3字符输出流(Writer类&FileWriter类)的介绍
6.4字符输出流的基本使用----写出单个字符到文件
6.5flush和close方法的区别
6.6字符输出流写数据的其他方法
6.7字符输出流的续写和换行
7.1 IO流异常的处理
7.2 JDK1.7与JDK1.9流中异常的处理
8.1 Properties集合的基本使用
打印结果截图
8.2 Properties集合中的store方法
打印结果截图
ps(若使用字节流进行上述操作,则会出现乱码,如:
)
8.3 Properties集合中的load方法
ps(一般使用Properties的load方法读取配置文件都是使用字符输入流FileReader操作,尽量少使用字节输入流,因为配置文件中可能存在中文,这样读出来的数据就会乱码,当然,如果保证配置文件中没有中文,则两种流都可以用来读取配置文件)
9.缓冲流概念及原理
10.1 BufferedOutputStream(字节缓冲输出流)
10.2 BufferedInputStream(字节缓冲输入流)
缓冲区
数组+缓冲区,效率快
11.测试(使用字节缓冲流和不使用字节缓冲流复制文件的效率对比)
(一)一个字节一个字节地读取,再一个字节一个字节输出
代码
package learn.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName FileDemo
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 8:41
* @Version 1.0
**/
//文件复制练习:
public class FileDemo {
public static void main(String[] args) throws IOException {
long start=System.currentTimeMillis();
//创建字节输入流
FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
//1.循环读写文件
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
//关流
fos.close();
fis.close();
long end=System.currentTimeMillis();
System.out.println("复制文件共耗时:"+(end-start)+"毫秒");
}
}
打印结果截图
(二)定义字节数组来存储读取的多个字节,然后再一次性将数组中的字节输出
代码
package learn.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @ClassName FileDemo
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 8:41
* @Version 1.0
**/
//文件复制练习:
public class FileDemo {
public static void main(String[] args) throws IOException {
long start=System.currentTimeMillis();
//创建字节输入流
FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
//1.循环读写文件
/* int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}*/
//2.优化1.方式
byte[] bytes=new byte[1024];
int len=0;
while ((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//关流
fos.close();
fis.close();
long end=System.currentTimeMillis();
System.out.println("复制文件共耗时:"+(end-start)+"毫秒");
}
}
打印结果截图
(三)使用字节缓冲流复制文件(没有用到数组存储字节)
代码
package learn.io;
import java.io.*;
/**
* @ClassName FileDemo3
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 15:50
* @Version 1.0
**/
public class FileDemo3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
//创建字节输入流
FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
//创建字节缓冲输入流,并把字节输入流对象当参数传进去
BufferedInputStream bis = new BufferedInputStream(fis);
//创建字节缓冲输出流,并把字节输出流对象当参数传进去
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
//关流
bos.close();
bis.close();
long end = System.currentTimeMillis();
System.out.println("复制文件共耗时:" + (end - start) + "毫秒");
}
}
打印结果截图
(四)使用字节缓冲流复制文件(用到数组存储字节)
代码
package learn.io;
import java.io.*;
/**
* @ClassName FileDemo3
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 15:50
* @Version 1.0
**/
public class FileDemo3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
//创建字节输入流
FileInputStream fis = new FileInputStream("d:\\jQuery1.11.3_hemin.chm");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("c:\\jQuery.chm");
//创建字节缓冲输入流,并把字节输入流对象当参数传进去
BufferedInputStream bis = new BufferedInputStream(fis);
//创建字节缓冲输出流,并把字节输出流对象当参数传进去
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
//关流
bos.close();
bis.close();
long end = System.currentTimeMillis();
System.out.println("复制文件共耗时:" + (end - start) + "毫秒");
}
}
打印结果截图
综上所述
复制文件效率高低:字节缓冲流(使用到字节数组)>字节流(使用到字节数组)>字节缓冲流(没用到字节数组)>字节流(没用到字节数组)
12.1 BufferedWriter(字符缓冲输出流)
ps(上述代码中的bw.write("\r\n")可以使用bw.newLine()方法代替,该方法是BufferedFileWrite的一个特有成员方法,它会根据操作系统的不同来获取不同的行分隔符)
12.2 BufferedReader(字符缓冲输入流)
13.对文本进行排序(练习)
题目:对一下内容进行排序
分析
代码
package learn.io;
import java.io.*;
import java.util.HashMap;
import java.util.Set;
/**
* @ClassName FileDemo4
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 17:04
* @Version 1.0
**/
public class FileDemo4 {
public static void main(String[] args) throws IOException {
//1.创建HahMap集合,键存储文本的序号(1.,2.,...),值用来存储每行文本内容
HashMap<String, String> map = new HashMap<String, String>();
//2.创建字符缓冲输入流对象,参数传入字符输入流对象,同时字符输入流对象中绑定有要读取的文本位置
BufferedReader br = new BufferedReader(new FileReader("in.txt"));
//3.创建字符缓冲输出流对象,参数传入字符输出流对象,同时字符输出流对象中绑定有要输出的文件路径
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
//4.读取in.txt文件内容
String str = null;
while ((str = br.readLine()) != null) {
//5.使用字符串的split方法将每行文本内容进行分割成序号+内容两部分
String[] arr = str.split("\\.");
//6.将arr数组中的内容存储到定义好的map集合中
map.put(arr[0], arr[1]);
}
//7.遍历map集合
Set<String> keySet = map.keySet();
for (String key : keySet) {
String value = map.get(key);
//8.将得到的键和值进行拼接,输出到out.txt目标文件中
bw.write(key + "." + value);
bw.newLine();
}
//8.释放资源
bw.close();
br.close();
}
}
结果截图
14.1字符编码和字符集
14.2编码引出的问题
15.1转换流原理图
15.2 OutputStreamWriter介绍和代码实现
15.3 InputStreamReader介绍和代码实现
15.4转换文件编码(练习)
题目
分析
代码
package learn.io;
import java.io.*;
/**
* @ClassName FileDemo5
* @Description TODO
* @Author Administrator
* @Date 2020/11/9 19:53
* @Version 1.0
**/
public class FileDemo5 {
public static void main(String[] args) throws IOException {
//1.编写输入转换流InputStreamReader,参数传递字节输入流和指定的编码表名称
InputStreamReader isr = new InputStreamReader(new FileInputStream("我是GBK格式.txt"), "GBK");
//2.编写输出转换流OutputStreamWriter,参数传递字节输出流和指定的编码表名称
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("我是UTF-8格式.txt"), "UTF-8");
//3.使用InputStreamReader对象中的read方法读文件
int len = 0;
while ((len = isr.read()) != -1) {
//4.使用OutputStreamWriter对象中的write方法将读取到的内容写到指定文件中
osw.write(len);
}
//5.释放资源
osw.close();
isr.close();
}
}
16.1序列化与反序列化的概述
16.2对象的序列化流ObjectOutputSream
前提:定义实体类Person,属性name,age,添加构造方法,getter和setter,以及重写toString,Person类需要实现接口Serializable接口
16.3对象的反序列化流ObjectInputSream
17.transient关键字(瞬态关键字)
18.1 InvalidClassException异常原理及解决方案
19.序列化集合(练习)
题目
分析
代码
定义Person实体类
package learn.io;
import java.io.Serializable;
/**
* @ClassName Person
* @Description TODO
* @Author Administrator
* @Date 2020/11/10 9:02
* @Version 1.0
**/
public class Person implements Serializable {
private static final long SerialVersionUID = 8888L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试
package learn.io;
import java.io.*;
import java.util.ArrayList;
/**
* @ClassName FileDemo6
* @Description TODO
* @Author Administrator
* @Date 2020/11/10 9:02
* @Version 1.0
**/
public class FileDemo6 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.定义ArrayList集合存储Person对象
ArrayList<Person> arrayList = new ArrayList<>();
arrayList.add(new Person("徐凤年", 22));
arrayList.add(new Person("鱼幼薇", 20));
arrayList.add(new Person("韩生宣", 59));
//2.创建序列化流ObjectOutputStream对象,对集合进行序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
oos.writeObject(arrayList);
//3.创建反序列化流ObjectInputStream对象,对集合进行反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
Object o = ois.readObject();
//4.把Object类型强转为ArrayList集合类型
ArrayList<Person> personList = (ArrayList<Person>) o;
//5.遍历集合,打印对象信息
for (Person person : personList) {
System.out.println(person);
}
}
}
打印结果截图
20.打印流概述和使用