一.什么是高级流
- 高级流不能直接作用于文件,需要装载普通流或转换流
- 高级流可分为:缓冲流/二进制流/对象流
- 缓冲流:BufferedReader/BufferedWriter类
- 二进制流:DataInputStream/DataOutputStream类
- 对象流:ObjectInputStream/ObjectOutputStream类
二.缓冲流的用法
- 缓冲流具有缓冲区,其.readLine()可以读取一行的数据,可以提高文件读取效率
- 操作步骤:
1.创建文件对象
2.创建流对象并载入文件对象
3.创建缓冲流对象并载入转换流对象
4.读取数据
5.关闭流操作 - 代码示例 BufferedReader.readLin()
import java.io.*;
/**
* @ Author: Zhangyu
* @ Date: 2020/8/5
* @ Description:
*/
public class Test {
public static void main(String[] args) {
File f=new File("D:\\1.txt");//创建文件类对象
FileReader fr=null;//创建转换流对象,声明在外面,方便后面关流操作
BufferedReader bf=null;//同理
try {
fr=new FileReader(f);//实例化对象,并载入文件对象置流中
bf=new BufferedReader(fr);//实例化缓冲流对象,将流载入其中
String s = bf.readLine();//获取第一行数据,并赋值到字符串对象中
System.out.println(s);//输出读取到的字符串
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bf.close();//关闭流操作
fr.close();//关闭流操作
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 代码示例 BufferedWriter.writer(String s)
import java.io.*;
/**
* @ Author: Zhangyu
* @ Date: 2020/8/5
* @ Description:
*/
public class Test {
public static void main(String[] args) {
File f=new File("D:\\1.txt");//创建文件类对象
FileWriter fw=null;//创建转换流对象,声明在外面,方便后面关流操作
BufferedWriter bw=null;//同理
try {
fw=new FileWriter(f);//实例化对象,并载入文件对象置流中
bw=new BufferedWriter(fw);//实例化缓冲流对象,将流载入其中
String s ="好好学习java";
bw.write(s);//将字符串s写入文件对象中
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三.二进制流
- 将文件以二进制格式存储,提高存储效率
- 下面实现,将读取系统内的图片,并复制到项目工程中
- 实现步骤:
1.创建文件对象传入图片路径
2.创建普通输入流并传入文件对象
3.创建DataInputStream对象并载入普通输入流对象
4.读取文件数据内容保存至byte数组,数组长度为文件内容长度即:File.length();
5.创建普通输出流对象并载入输出文件路径
6.创建DataOutputStream对象并载入普通输出流对象
7.将byte数组的数据写入路径对应文件位置 - 代码实现
import java.io.*;
/**
* @ Author: Zhangyu
* @ Date: 2020/8/5
* @ Description:
*/
public class Test {
public static void writePhoto(String readPath,String writePath){//readPath为读取文件的路径,writePath为写入文件的路径
File f=new File(readPath);
FileInputStream fis=null;
DataInputStream dis=null;
FileOutputStream fos=null;
DataOutputStream dos=null;
try {
fis=new FileInputStream(f);
dis=new DataInputStream(fis);
fos=new FileOutputStream(writePath);
dos=new DataOutputStream(fos);
byte[] b=new byte[(int)f.length()];
dis.read(b);
dos.write(b);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
dos.close();
fos.close();
dis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
writePhoto("D:1.jpg","1.jpg");//调用方法,指定读取文件路径,与写入文件路径
}
}
四.对象流
-
配合序列化Serializable,将内存中的数据对象永久存储在磁盘中(持久化)
-
操作步骤:
1.创建一个类绑定接口Serializable
2.创建FileOutputStream对象并传入保存文件路径
3.创建ObjectOutputStream对象并载入输出流
4.调用writeObject()方法传入需要存储至文件中的对象
5.关闭流操作 -
代码实现
//学生类
public class Student implements Serializable {
private String name;
private int age;
public Student(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;
}
}
import java.io.*;
/**
* @ Author: Zhangyu
* @ Date: 2020/8/5
* @ Description:
*/
public class Test {
public static void writePhoto(Student student,String writePath){//需要存储的文件对象,writePath为写入文件的路径
FileOutputStream fos=null;
ObjectOutputStream oos=null;
try {
fos=new FileOutputStream(writePath);
oos=new ObjectOutputStream(fos);
oos.writeObject(student);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Student student=new Student("张宇",25);
writePhoto(student,"2.txt");
}
}