目录
一、java.io.File
public class File
implements Serializable, Comparable<File>
1.1 常用构造方法
File(String pathname)
1.2 常用方法
1.3 字段
二、文件遍历案例
三、文件过滤器
四、相对与绝对路径
绝对路径:以盘符开始,是一个完整的路径,例如c://a.txt
相对路径:java中是相对于项目目录路径,这是一个不完整的路径,在Java开发中很常用 例如 a.txt
五、流概述
package IO;
import java.io.*;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* @author liweijie
*/
public class Demo {
/**
* IO流概述
* 可以将这种数据传输操作,看做一种数据的流动 , 按照流动的方向分为输入Input和输出Output
* Java中的IO操作主要指的是 java.io包下的一些常用类的使用. 通过这些常用类对数据进行读取(输入Input) 和 写出(输出Output)
*
* IO流的分类:
* 按照流的方向来分,可以分为:输入流和输出流.
* 按照流动的数据类型来分,可以分为:字节流和字符流
*
* 字节流:
* - 输入流 : InputStream
* - 输出流 : OutputStream
* 字符流:
* - 输入流 : Reader
* - 输出流 : Writer
*
*
* 一切皆字节:
* 计算机中的任何数据(文本,图片,视频,音乐等等)都是以二进制的形式存储的.
* 在数据传输时 也都是以二进制的形式存储的.
* 后续学习的任何流 , 在传输时底层都是二进制.
* @param args
*/
public static void main(String[] args) throws FileNotFoundException {
}
}
六、java.io.OutputStream
* 一切皆字节:
* 计算机中的任何数据(文本,图片,视频,音乐等等)都是以二进制的形式存储的.
* 在数据传输时 也都是以二进制的形式存储的.
* 后续学习的任何流 , 在传输时底层都是二进制.
OutputStream是抽象类
注意:
写完一定要关闭close;
七、java.io.FileOutputStream
构造方法:
其中append为true则表示,在文件末尾添加数据,否则表示重新写入数据
public static void main(String[] args) throws IOException {
//OutputStream
FileOutputStream fos = new FileOutputStream("e://a.txt"); // 没有添加append参数,表示默认false 即覆盖原数据
byte[] bytes = {65,66,67,68,69};
fos.write(bytes);
fos.close(); //写在哪在哪关闭
System.out.println("已经写出");
}
通过字符串+getBytes函数,获得字节数组:
public static void main(String[] args) throws IOException {
//OutputStream
FileOutputStream fos = new FileOutputStream("e://a.txt"); // 没有添加append参数,表示默认false 即覆盖原数据
byte[] bytes = "TEST".getBytes();
fos.write(bytes);
fos.close(); //写在哪在哪关闭
System.out.println("已经写出");
}
八、java.io.FileInputStream
构造方法
常用方法:
当read方法读到1的时候,说明已经读到末尾
最推荐使用的方法
九、文件加密和解密工具
public static void main(String[] args) throws IOException {
System.out.println("请输入文件的全路径");
Scanner scanner = new Scanner(System.in);
String filename = scanner.nextLine();
//原文件
File oldFile = new File(filename);
//加密文件 加前缀mi-
File newFile = new File(oldFile.getParent(),"mi-"+oldFile.getName());
FileInputStream fis = new FileInputStream(oldFile);
FileOutputStream fos = new FileOutputStream(newFile);
while (true){
int b = fis.read();
if(b==-1){
break;
}
//任何数据^10两次 结果还是其本身 加密解密过程
fos.write(b^10);
}
System.out.println("加密或解密完成");
}
十、字节流读取文字
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("e:\\a.txt");
byte[] b = new byte[10];
int len = fis.read(b);
System.out.println(new String(b,0,len));
len = fis.read(b);
System.out.println(new String(b,0,len));
}
由于提前限定了一次读取的字节数为10,所以出现了读取不到一个完整汉字的情况,因而出现乱码。但是UTF-8使用动态编码表,由于提前不知道每个字符需要多少字节,所以此方法不行。
所以下面引入了字符流,用来解决读取半字的问题
十一、字符输出
字符流用来操作文字,而字节流可以操作任何文件,所以字节流更加常用。
注意:
决定是否在原文件基础上追加的,是声明字符流对象是的append属性(为true则是追加模式);
append与write在实际实现上,没有区别,但是append会返回Writer对象;
append方法的返回值(Writer类型)可以强转为该对象(FileWriter类型),所以可以继续调用append,因而称为“追加”;
十二、字符读取
基本使用方法同字节流。
char默认值是 空白字符,对应的int数值是0
十三、flush刷新管道
字符输出时,以字符为单位,但计算机中都是以字节为单位。当一个字符占用多个字节时,字符输入流未读取单个字符全部字节之前,会将已读取字节放入缓存;
字符输出流fw.flush()会将缓存中字符强制写入到文件中,fw.close()也会有此效果;
如果不执行的话,就不会将字符写入文件中,如图:
十四、字节转换字符流
转换流。将字节流装饰为字符流:使用了装饰者模式;
为什么要使用字节流+转换流?直接字符流不香吗?:由于平常使用时,可能获取的是字节流,所以才有这种转换方式
十五、Print与BufferedReader
15.1 打印流
1)打印字节流与打印字符流
打印字节流
打印字符流(记得flush或close)
打印字节流和打印字符流在使用上差别不大,但字符流需要调用flush,否则不会写入到文件中;
2)字节流转换为打印流
15.2 缓存读取流
十六、收集异常日志
普通的异常控制台显示
可以将异常信息保存在txt文档中,并加上日期,便于后期核查
十七、properties
17.1 概述
properties继承HashTable属于Map集合(键值对),但其扩展部分含有IO相关用法(配置文件)
17.2 常用方法
1)store方法:将properties对象内容写入字节流/字符流所指的文件中
十八、序列化技术
18.1 概述
由于垃圾回收机制的存在,一些属性或对象,在程序关闭之后,便消失,无法重复利用,所以有人在想能不能将把对象完整的存储在文件中,使用时再取出来,即对象在内存中存储的字符序列(看上去像是乱码);
将文件中的对象读取到程序中来,就是反序列化;
虽然序列化很方便,但是却十分容易产生Bug(占Bug总数将近三分之一),所以Java官方提出近几年将要进行整改,建议大家不要使用此方法;(了解下也是有必要的)
18.2 序列化
Java官方规定,所有对象均不能序列化,想要序列化,需添加标记
添加标记:实现接口Serializable。添加代码后没有任何飘红,即说明不需要实现任何方法,因此这个接口被称为标记接口。
18.3 反序列化
十九、try-with-resources
19.1 原因
1)在文件流使用完毕后需要关闭
2)为了使close一定被执行,需要将其放在finally中
3)所以需要将fr提到try之前,但仍可能产生空指针异常
4)继续try-catch处理
5)综上,这么多步骤就是为了读入一个字符
19.2 解决方法
1)jdk1.7之前:在try中new的对象会在try或catch块执行完毕后执行close。但要求,能使用此方法的类必须实现Closeable或AutoCloseable两个接口
2)但是,如果后面还有代码块需要用到try中的对象时,就显得不方便了。JDK9进行了改进