IO流
1、File
1.1 概述
File:它是文件和目录路径名的抽象表示
- 文件和目录名是可以通过File封装成对象的
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。需通过具体的操作把这个路径的内容转换为具体存在的
1.2 File类的创建功能
!!!创建文件就要用创建文件的方式,创建目录就要用创建目录的方式,一个包下无论是目录还是文件都不允许重名
1.3 File类判断和获取功能
1.4 File类删除功能
方法名 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
绝对路径和相对路径的区别
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位他所表示的文件。eg:E:\\itcast\\java.txt
- 相对路径:必须使用取自其他路径名的信息进行解释。eg:myFile\\java.txt
删除目录时的注意事项
- 如果一个目录中有内容(目录,文件),不能直接删除,应该先删除目录中的内容,
- 最后才能删除目录
1.5 递归
概述:递归是指在方法定义中调用方法本身的现象
思路:将一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算
递归解决问题要找到两个内容:
- 递归出口:否则会出现内存溢出
- 递归规则:与原问题相似的规模较小的问题
2、字节流
2.1 IO流概述和分类
-
IO:输入/输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的
常见应用:文件复制;文件上传;文件下载
分类:
- 如果数据通过Window自带的记事本软件打开,且可以读懂里面的内容,就是用字符流,否则使用字节流。字节流是万能的,不知道用哪个就用字节流
2.2 字节流写数据
2.2.1 字节流写数据的三种方式
- 第三者输出方法若len取字节数组的长度,则off需为0
2.2.2 字符流写数据加异常处理
2.3 字节流读数据
2.3.1 单字节逐个读取
2.3.2 字节数组读取
2.3.3 字节流复制图片
2.3.4 字节缓冲流
构造方法:
2.3.5 字节流复制视频
3、字符流
3.1 出现字符流的原因
3.2 编码表
字符集:
- 是一个系统支持所有字符的集合,包含各个国家文字、标点符号、图形符号、数字等
- 计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码
- 常见字符集:ASCII字符集、GBXXX字符集、Unicode字符集等
3.3 字符串中的编码解码
3.4 字符流中的编码解码
3.5 字符流写数据的方法
!!通过字符流写数据会将字符放在缓冲区,为了将数据输出到文档中,需采用刷新流方法
3.6 字符流读数据
3.7 字符缓冲流
BufferedReader br = new BufferedReader(new FileReader("路径名"));
BufferedWriter bw = new BufferedWriter(new FileWriter("路径名"));
//自己封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
特有功能:
4、IO流小结
5、特殊操作流
5.1 标准输入输出流
System类中有两个静态的成员变量:
-
public static final InputStream in:标准输入流,通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
-
- 便捷输入流:Scanner sc = new Scanner(System.in);
-
public static final PrintStream out:标准输出流,通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
-
- PrintStream ps = System.out
- 便捷输出流:System.out
- 本质是一个标准的输出流,PrintStream类有的方法,System.out都可以使用
5.2 打印流
打印流分类:
- 字节打印流:PrintStream
- 字符打印流:PrintWriter
打印流的特点:
- 只负责输出数据,不负责读取数据
- 有特有的方法
字节打印流:
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据(write),查看的时候会转ASCII码;使用特有方法写数据(print/println),查看的数据即输入数据
字符打印流:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CnyHJiar-1619545011945)(…/.assets/字符打印流的构造方法.png)]
- 使用第一种构造方法,在每次输入数据后需要调用flush方法才能将文本打印至文档
- 而使用第二种方法,在构造对象是设定boolean值为true,则将自动刷新
PrintWriter pw = new PrintWriter("路径名");
pw.write("hello");
pw.wrint("\r\n"); //换行
pw.flush();
pw.println("world");
pw.flush();
PrintWriter pw1 = new PrintWriter(new FileWriter"路径名",ture);
pw.println("hello");
pw.close;
4.3 对象序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象,这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息。字节序列写道文件之后,相当于文件中持久保存了一个对象的信息,反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:
- 对象序列化流:ObjectOutputStream
- 将java对象的原始数据类型和图像写入OutputStream。可以使用ObjectInputStream读取(重构)对象,可以通过使用流的文件来实现对象的持久储存。如果是网络套接自流,则可以在另一个主机上或另一个进程中重构对象
- 构造方法:
- ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
- 序列化对象的方法:
- void writeObject(Object obj):将指定的对象写入ObjectOutputStream
- 注意:
- 一个对象要想被序列化,该对象所属的类必须实现Serializable接口
- Serializable是一个标记接口,实现该接口不需要重写任何方法
public class ObjectOutputStreamDemo {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("idea_demo\\oos.txt"));
Student s = new Student("林青霞",30);
oos.writeObject(s);
oos.close();
}
}
//对象类需实现Serialzable接口
public class Student implements Serializable {
private String name;
private int age;
public Student() {
}
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;
}
}
- 对象反序列化流:ObjectInputStream
- ObjectInputStream反序列化先前使用ObjectOutoutStream编写的原始数据和对象
- 构造方法:
- ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream
public class ObjectInputStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("idea_demo\\oos.txt"));
Object obj = ois.readObject();
Student s = (Student) obj;
System.out.println(s.getName()+","+s.getAge());
ois.close();
}
}
4.4 Properties
- 概述:
- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
public class PropertiesDemo {
public static void main(String[] args) {
//创建集合对象
Properties prop = new Properties();
//存储元素
prop.put("3120002682","zxk");
prop.put("3120002681","zzl");
Set<Object> keySet = prop.keySet();
for(Object key:keySet){
Object o = prop.get(key);
System.out.println(key+","+o);
}
}
}
- Properties作为集合的特有方法:
public class PropertiesDemo01 {
public static void main(String[] args) {
Properties prop = new Properties();
prop.setProperty("3120002682","zxk");
prop.setProperty("3120002681","zzl");
System.out.println(prop.getProperty("3120002682"));
System.out.println(prop);
Set<String> names = prop.stringPropertyNames();
for(String key : names){
System.out.println(key);
}
}
}
- Properties和IO流结合的方法
public class PropertiesDemo02 {
public static void main(String[] args) throws IOException {
//将集合的数据保存至文件
myStore();
//把文件的数据加载到集合
myLoad();
}
private static void myLoad() throws IOException {
Properties properties = new Properties();
FileReader fr = new FileReader("idea_demo\\fw.txt");
properties.load(fr);
fr.close();
System.out.println(properties);
}
private static void myStore() throws IOException {
Properties properties = new Properties();
properties.setProperty("3120002682","zxk");
properties.setProperty("3120002681","zzl");
FileWriter fw = new FileWriter("idea_demo\\fw.txt");
properties.store(fw,null);
fw.close();
}
}