转换流
处理流,需要传入节点流
OutputStreamWriter
字节输出流转为字符输出流
// 字节输出流
FileOutputStream fos = new FileOutputStream("D:\\123.txt");
// 转换为字符流
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write("xxxxxxxxxxxxx");
osw.flush();
// osw 关闭后 会自动把 fos也关闭
osw.close();
InputStreamReader
字节输入流转为字符输入流
InputStreamReader(InputStream in)
InputStreamReader(InputStream in , Charset cs) //指定字符集
InputStreamReader(InputStream in , CharsetDecoder dec) //指定字符集解码器
void close()
String getEncoding()
int read()
int read(char[] char , int start , int length)
boolean ready()
先开启的流后关闭
缓冲流
BufferedReader
字符输入缓冲流
作用 : 提供效率,把输入和输出先保存到缓冲区,然后一次写入/写出
// 字节流
FileInputStream fis = new FileInputStream("./src/com/Test_01.java");
// 转换为字符
InputStreamReader isr = new InputStreamReader(fis);
// 字符缓冲流
BufferedReader br = new BufferedReader(isr);
){
String temp = null;
while ((temp=br.readLine()) != null) {
System.out.println(temp);
}
BufferedWriter
bw.write("anisa萨迪克");
// 写出换行
bw.newLine();
bw.write("anisa萨迪克");
// 刷缓存
bw.flush();
打印流
打印流默认指向控制台
// 使用system中打印流,默认打印控制台
System.out.println("Hello");
PrintStream out = System.out;
out.println("java.....");
// 自己创建打印流
FileOutputStream fos = new FileOutputStream("D:/log.txt");
// 创建打印流,方便输出操作
PrintStream ou1 = new PrintStream(fos);
// 使用原始的字节输出流,操作麻烦,并且类型受限
fos.write("开始执行...".getBytes());
// 打印流中,封装了操作,使操作更加方便,另外有很多print方法重载,支持所有类型
ou1.println("开始执行.....");
ou1.println(true);
ou1.println(1);
ou1.println(1.2);
// System 提供了 设置 out打印路径的方法
System.setOut(ou1);
// 下面所有的打印语句,都是向指定文件打印
System.out.println("xxxxxxxxxxxxxxxxxx");
文件复制
先输入再输出
输入和输出 目录不能一致
// 默认是覆盖写入,当创建输出流对象的时候,由于是覆盖写入,会直接把对应文件清空
// FileOutputStream fos = new FileOutputStream("D:/log.txt");
// 如果是追加写入,则不会清空对应的文件
// 但是如果是文件复制的话,会出现死循环问题
FileOutputStream fos = new FileOutputStream("D:/log.txt", true);
数据流
DataInputStream和DataOutputStream
写入与读取的顺讯保持一致
dos.writeByte(b);
dos.writeInt(i);
dos.writeLong(l);
dos.writeChar(c);
dos.writeBoolean(flag);
dos.writeUTF("你好吗");
System.out.println(dis.readByte());
System.out.println(dis.readInt());
System.out.println(dis.readLong());
System.out.println(dis.readChar());
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
序列化
创建对象的4种方式 :
1. new 用的最多
2. 反射机制 : 通过字符串就可以创建对象
3. 反序列化
4. clone 不使用了,被序列化代替
序列化流 就是将对象转换为二进制流的一种实现手段,通过序列化可以将该对象持久化存储和进行传输
序列化的对象必须实现Serializable接口,但是该接口中没有任何功能,仅仅是一种标记
序列化 就是把对象持久化存储到硬盘 中的过程
反序列化就是把硬盘中的对象载入到堆内存当中
应用场景 :
序列化将数据对象转换为二进制流,能够做到持久化存储和网络传输,如果不经过序列化处理,就无法进行数据传输和存储
数据由网络传输,从不同机器之间的传递,需要经过一个序列化与反序列化的流程
对象 --> 序列化 --> 数据加密处理 --> 网络传输 --> 数据解密处理 --> 反序列化 --> 对象
// System.out.println(user);
// 创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/123.o"));
// 序列化对象
oos.writeObject(user);
// 刷缓存
oos.flush();
// 关闭
oos.close();
// 创建反序列化流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"D:/123.o"));
// 反序列化,读取对象,返回Object类型
User user = (User) ois.readObject();
// 关闭资源
ois.close();
要序列化的对象必须实现Serializable接口
版本控制
如果序列化之后,我们的类文件发生了更改
每个类都有UID,来表示当前版本,只要发生更改,UID也会随着更改
所以只要类更改了,或者添加新功能了,此时如果再进行反序列化 就会报错
所以 一般我们会单独指定一个UID 来保证版本一致,一般写1L即可
Transient
如果不想让某个变量被序列化,可以使用transient修饰符修饰
可以把没必要的数据不进行序列化操作,从而提升序列化和反序列化的效率
private static final long serialVersionUID = 1L;
public transient String name;
File类
常用方法
// 获取文件对象
// 如果路径是 "" 空字符串 就等于是 ./ 当前目录
File file = new File("D:\\17期\\课件");
// 绝对位置 D:\\17期\\课件
System.out.println(file.getAbsolutePath());
// 名字 课件
System.out.println(file.getName());
// 父路径 D:\17期
System.out.println(file.getParent());
// 是否是目录 true
System.out.println(file.isDirectory());
// 是否是文件 false
System.out.println(file.isFile());
// 最后一次修改时间 返回毫秒数
System.out.println(new Date(file.lastModified()));
// 判断是否存在 true
System.out.println(file.exists());
file = null;
File file1 = new File("D:\\com\\a\\b.docx");
// 删除.,成功返回true
System.out.println(file1.delete());
file1 = new File("D:\\com\\a\\b\\c");
// 判断是否存在
System.out.println(file1.exists());
// 递归创建所有目录,但是不会创建文件
// mkdir 只能创建一个子目录.,如果上级目录也不存在,就不创建
file1.mkdirs();
file1 = new File("D:/com/a/a.txt");
// 创建文件,创建成功是true,否则是false
file1.createNewFile();
// 改名字
file1.renameTo(new File("D:/com/a/把.txt"));
file1 = new File("D:/com/a");
// 获取所有子文件对象
File[] subFiles = file1.listFiles();
for (File file2 : subFiles) {
System.out.println(file2.getAbsolutePath());
}