一、io包 i:in o:out 表示进和出
1.File :文件和目录路径名的抽象表示 不要轻易调用delete删 真的能删掉
如果出现抛出异常不能操作 那么编辑器管理员身份运行 或者换d盘
File dir = new File("c://1.txt")
//返回文件的父文件夹
dir.getParentFile()
//创建文件
dir.createNewFile();
//创建文件夹
dir.mkdir();
//创建一层文件夹
dir.mkdirs();
2.创建文件的三种方法:
length方法是返回文件大小 get…()方法返回文件路径 renameTo 重命名并移动
3.对于不同的操作系统有不同的路径分隔符和名称分隔符
java统一使用: 路径分隔符(;) :File.pathSeparator 名称分隔符(\):File.separator
4.查找文件
e.listFiles() :把这一层的所有文件装进一个数组中 判断是否是文件夹:.isDirectory()
必须先判断不为空且长度大于0
5.文件过滤器:接口FileFileter 必须实现才能使用
二、相对路径和绝对路径
绝对路径:从盘符开始,是一个完整的路径。例如:c://a.txt
相对路径:在JAVA代码中是相对于项目目录的路径,这是一个不完整的便捷路径,在java开发中很常用 例如: . a.txt的路径就在这个项目路径的文件夹里
三、io流概述 :
1.可以将这种数据传输的操作,看做是一种数据的流动,按照流动的方向分为输入input和输出 output
2.java中的io操作主要指的是java.IO包下的一些常用类的使用,通过这些类对数据进行读取(输入input)和写出(输出output)
3.分类:
按照流的方向来分,分为:输入流和输出流
按照流动的数据类型:字节流 和 字符流
字节流 :
- 输入流 :顶级父类 ImputStream
- 输出流 :顶级父类OutputStream
字符流 :
- 输入流 :顶级父类 Reader
- 输出流 : 顶级父类 Write
5.字节流概念:一切皆字节 计算机中的任何数据(文本,图片,视屏,音乐等)都是以二进制的形式存储的
在数据传输时,也是以二进制形式存储的。任何流,在传输时底层都是二进制
5.1OutputStream 字节输出流 把程序的东西写到文件里
5.1.1方法:
close() :关闭输出流并释放资源 使用完一定要把流关掉
flush():刷新输出流并写出缓冲的输出字节
nullOutputStream() :返回新的outputstream 丢弃所有字节
write(byte[] b): 写一个字节数组的所有内容
write(byte[] b , int off ,int length) :在指定数组中从下表 off开始 写的长度为length
write(int b ):将字节写入此输出流 写的是int实际是字节
5…1.2常用子类:
FileOutputStream : 文件输出流 构造方法:1.传文件名 2.传文件路径 两个传参的时候都可以加上boolean类型值用来判断是接着写还是 清空重写 只有同一个流调用时判断是否接着写 两个流不会清空 在关闭流以后不要在写东西 会出错
两种方法:
5.2 InputStream :字节输入流 把文件的内容传到程序中
5.2.1 方法:
close():关闭流
read():从流中读取下一个字节
read(byte[] b):将从流中读取到的数据 存储到字节数组中 文件有100字节 数组10字节 存满10字节 返回值为int类型存取多少字节 如果读完没东西可读返回 -1
5.2.2常用子类:
FileInputStream:文件输入流 构造方法:1.传文件名 2.传文件路径
四、文件加密
System.out.println("请输入文件位置");
Scanner s = new Scanner(System.in);
String file = s.next();
File old = new File(file);
File news = new File(old.getParent(),"mi"+old.getName());
FileInputStream fis = new FileInputStream(old);
FileOutputStream fos = new FileOutputStream(news);
while (true){
int b = fis.read();
if(b == -1)
break;
fos.write(b^10);
原理:异或运算 任何数据异或相同数字两次 结果就是其本身
五、字符编码
常用编码 UTF-8
六、字节流读取文字可能出现的乱码
输出乱码:项目默认使用UTF-8 记事本不是 在项目里创建一个File 因为字节流在存储时数组可能读取一个字的半个编码 所以有时候会乱码 字符流是读一个字
七、字符流
close() append():是否追加输入 write()
1.文件字符流
写:
FileWriter f = new FileWriter(“文件名或路径”,true决定是否追加)
f.write("要写入的字符串")
f.write('要写入的字符')
f.append(“要追加写入的数据”).append("")//...可以一直追加
//他的返回值是writer 要强转
FileWriter f2 = (FileWriter)f.append(“要追加写入的数据”)
f.close();
读:
FileReader f = new FileReader(“文件名或路径”)
int c = f.read(); \\返回一个字符
syso((char)c);\\一次读一个字符
while(true){
int c = f.read();
if(c == -1)
break;
syso((char)c);
}
f.close();
打印字符串:
FileReader f = new FileReader(“文件名或路径”);
char[] c = new char[100]; 要考虑是否有100个字符 他的默认存储时0 也就是空格
int length = f.read(c);
String t = new String(c,0,length);
syso(t);
syso(t.length());
八、字节流和字符流的区别
字符输出一般会加一个操作:f.flush(); 刷新缓存空间 强制把缓存空间里的内容写到文件中去 关闭的时候相当于进行了一次刷新 如果正常不写关闭不写刷新 append追加不会写入
字符输出时每写一段内容要刷新一下
九、转化流:将字节流转换(装饰)为字符流 :使用装饰者设计模式
输入流:
FileInputStream f = new FileInputStream("c://a.txt");
//将字节输入流转换为字符输入流;
//参数1.要转换的字节流
//参数2.指定编码名称
InputStreamReader i = new InputStreamReader(f,"gbk");
while(true){
int c = i.read();
if(c == -1)
break;
syso((char)c)
}
f.close();
输出流:
FileOutputStream f = new FileOutputStream("c://a.txt");
//将字节输出流转换为字符输出流;
OutputStreamWriter i = new OutputStreamWriter(f);
i.write("床前明月光");
i.flush();
i.close();
十、打印流:用于打印字符(syso) 和 缓存读取流:
//字符输出(打印流)
像文件里输出一行内容
用Stream 或 Writer 用PrintWriter 需要刷新管道
PrintStream p = new PrintStream("c://a.txt");
p.println("aaaa");
/*缓存读取流 将字符输入流 转换为带有缓存 可以一次读取一行的缓存字符读取流
要是字节流 先转换成字符流 在转缓存读取流*/
FileReader f = new FileReader("c://c.txt");
BufferedReader b = new BufferedReader(f);
String t = b.readLine(); 读到结尾返回null
syso(t);
十一、收集异常日志
通过try catch捕捉异常然后通过e.printStackTrace(打印流文件)打印异常 传入文件里
十二、Properties 属于map集合 扩展部分跟io有关联
配置文件
Properties p = new Properties();
//存储 键->值
p.store(存储文件,首行注释)
.load(写入文件);
十三、序列化 与反序列化
序列化:存储的数据必须实现Serializable接口 这是一个标记接口没有抽象方法 同时如果这个对象类中有自定义属性也必须实现这个接口
反序列化
十四、try - with - resources既算io知识点也算异常处理知识点
1.7之前 因为io流引用完要关闭 但是嵌套trycatch会很麻烦 所以引入此操作 try catch运行结束后会自动调用close()关闭流 前提是他必须实现一个Closeable接口 也就是这个类里有close这个方法
1.9版本优化 1.7版本创建的流在trycatch结束后没有办法引用 因此更新之后在trycatch前创建 直接传入对象 多个对象用分号隔开