java----IO流
《基本介绍》
《常见操作》
《创建文件的方法》
《获取文件信息》
《目录操作与文件的删除》
在Java编程中,目录是被当成特殊的文件来处理的
所以其可以用File类中的全部方法
《流》
字节流输入,输出更慢,但可以保证更加无损,处理二进制文件更好
字节流包括:
字节输入流,其顶级父类是InputStream
字节输出流,其顶级父类是OutputStream
字符流同理
《InputStream字节输入流常用子类》
《FileInputStream》
这个类中的方法:
《read()》
注意:
这种方法千万不能用来读入汉字。在Java中,汉字站3个字节,而这里的方法是一个字节一个字节读入,读汉字会出现乱码
《read(byte[] b)》
上述方法有点慢,一般可以用下面这个方法来优化读入速度:
结果:
《关于byte与char》
既然上面提到了这个就回忆一下:
byte是整数类型,占1个字节,可以保存-128~127之间的整数
char是字符类型,占2个字节,char 本质上保存的还是整数,然后将对于整数的ASCII的字母输出
一个字节有8位(8bit)
《OutputStream字节输出流》
《FileOutputStream》
《写入时不覆盖的方法》
write()方法默认会将原先的内容全部清空,为了达到只是追加的效果,在使用FileOutputStream构造器时,如下:
《文件拷贝》
《FileReader》
用这种方式去读不会出现中文乱码,因为其会根据编码的模式,读一个字符时,用3个字节还是2个字节
《FileWriter》
《处理流》
节点流:
其对特定的数据源进行操作,但是这样的话功能比较单一,效率比较慢
但是对于处理流,如:
设计模式思想:
处理流在关闭流的时候只要关闭外层流,内部的节点流会自动关闭
《BufferedReader》
尽量用BufferedReader读取文本文件,如果读取二进制文件可能会有损失
《常用方法》
《public String readLine()》
《BufferedWriter》
《处理字节的处理流BufferedInputStream》
《处理字节的处理流BufferedOutputStream》
《使用字节处理处理流拷贝图片》
《处理流中的对象流》
InputStream: 文件->程序 Output: 程序->文件
《序列化:ObjectOutputStream》
最后记得关闭流:oos.close();
《反序列化ObjectInputStream》
最后记得关闭流:ois.close();
《对象处理流细节》
对于第三点的说明:
当添加了序列化的版本号后,我们在往Dog类中加新属性后就会认为是类的升级版,而不是一个新的类
对于第四点要注意
对于第五点的解释:
《后序学习对这里手动序列化的补充》
手动序列化的使用场景:比如我的密码不可能在不加密的情况下直接序列化,我想要我的密码在序列化的时候自动加密该如何作?
这个时候就要使用序列化的另一个接口了:Externalizable,其中有两个方法要我们实现
1.public void writeExternal(ObjectOutput out);
这个方法是通过out.write(xxx),来将要序列化的变量写进流中
2.public void readExternal (ObjectInput in);
这个方法是将我们写进流中的变量再读取出来
1 package com.cilinmengye.IO;
2
3 import java.io.*;
4
5 class User implements Externalizable {
6 private String name, password;
7 private A a;
8 private int age;
9 private boolean vip;
10
11 public User() {
12 ;
13 }
14
15 public User(String name, String password, A a, int age, boolean vip) {
16 this.name = name;
17 this.password = password;
18 this.a = a;
19 this.age = age;
20 this.vip = vip;
21 }
22
23 public void writeExternal(ObjectOutput out) throws IOException {
24 out.writeObject(name);
25 out.writeObject(password);
26 out.writeObject(a);
27 out.writeInt(age);
28 out.writeBoolean(vip);
29 }
30
31 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
32 name = (String) in.readObject();
33 password = (String) in.readObject();
34 a = (A) in.readObject();
35 age = in.readInt();
36 vip = in.readBoolean();
37 }
38
39 @Override
40 public String toString() {
41 return "User{" +
42 ", name='" + name + '\'' +
43 ", password='" + password + '\'' +
44 ", a=" + a +
45 ", age=" + age +
46 ", vip=" + vip +
47 '}';
48 }
49 }
50
51 class A implements Serializable {
52 private String name;
53 private B a;
54
55 public A(String name, B a) {
56 this.name = name;
57 this.a = a;
58 }
59
60 @Override
61 public String toString() {
62 return "A{" +
63 "name='" + name + '\'' +
64 ", a=" + a +
65 '}';
66 }
67 }
68
69 class B implements Serializable {
70 private int x;
71
72 public B(int x) {
73 this.x = x;
74 }
75
76 @Override
77 public String toString() {
78 return "B{" +
79 "x=" + x +
80 '}';
81 }
82 }
83
84
85 public class ObjectStream {
86 public static void main(String[] args) {
87 B b = new B(1);
88 A a = new A("11", b);
89 User user = new User("22", "33333", a, 10, true);
90 System.out.println("写入文件之前");
91 System.out.println(user);
92 try (
93 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("com/cilinmengye/IO/a.txt"));
94 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("com/cilinmengye/IO/a.txt"));
95
96 ) {
97 out.writeObject(user);
98 user = (User) ois.readObject();
99 } catch (IOException | ClassNotFoundException e) {
100 e.printStackTrace();
101 }
102 System.out.println("写入文件之后");
103 System.out.println(user);
104 }
105 }
《标准输入输出流》
《标准输入流》
《标准输出流》
《转换流》
《InputStreamReader》
《OutputStreamWriter》
《使用演示》
《打印流》
《PrintStream:字节打印流》
《PrintWriter:字符打印流》
《Properties》
注意:这个类本身是一个集合类(HashTable)