IO包:
in,out
File类
文件和目录路径名的抽象表示。
字段:
为了在不同操作系统上执行,提供了静态属性
File.pathSeparator 分好
File.separator 斜杠
构造方法:
通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(File parent, String child)
先传过来一个文件,然后在此文件中创建文件
File parent 也可以是String parent ,就看是传进对象还是传进路径
方法:
creatNewFile() 创建成功返回True,如已经存在则返回False
mkdir() 创建文件夹,跟名字没关系
mkdirs() 创建层级目录,中间用“/”隔开
delete() 删除文件,成功返回True,失败返回False
exists() 判断当前文件是否存在
getAbsolutePath() 返回抽象路径名的绝对路径字符串
getName() 返回抽象路径的文件名称
getParent() 返回此抽象路径的父文件路径
getParentFile() 返回父抽象路径名
getPath() 获取路径
length() 文件长度(字节长度)
isDirectory() 判断是否是文件夹
isFile() 判断是否是文件
listFiles() 获取当前文件夹里的所有文件对象,返回抽象路径名数组
public class Demo1 {
public static void main(String[] args) throws IOException {
File d = new File("D://");
File[] files = d.listFiles();
listFiles(files);
}
public static void listFiles(File[] files ){
if(files!=null && files.length>0){
for (File file: files) {
if (file.isFile()){
if (file.getName().endsWith(".png")){
System.out.println("找到了一个avi文件"+file.getAbsolutePath());
}
}else{
File[] files2 = file.listFiles();
listFiles(files2);
}
}
}
}
}
文件过滤器案例:
绝对路径:从盘符开始,一个完整的路径,例如:C://a.txt
相对路径:在Java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在开发中常用
IO流:
概述:可以将这种数据传输方式,看做是一种数据的流动,按照流动的方向分为输入Input和输出Output,Java中的IO操作主要指的是IO包下的一些常用类的使用,通过这些类,可以对数据进行读取(输入Input)和写入(输出Output)
IO流的分类:
按照传输的方向:输入流和输出流
按照传输数据类型:字节流和字符流
顶级父类
字节流:
--- 输入流: InputStream
--- 输出流: OutputStream
字符流:
--- 输入流: Reader
--- 输出流: Writer
一切皆字节:计算机中任何数据都是以二进制存储
数据传输时,也都是以二进制方式存储的
后续的任何流,底层都是二进制
OutputStream类:
此抽象类是表示输出字节流的所有类的超类。
方法:
close() 关闭流,使用完毕后必须关闭流
flush() 刷新此输出流并强制写出任何缓冲的输出字节。
nullOutputStream() 返回一个新的OutputStream,丢弃之前所有的字节
write(byte[] b) 从指定的字节数组写入到此输出流
write(byte[] b, int off, int len) 从指定字节数组的off开始的Len个字节写入到此输出流
write(int b) 将指定字节写入,24个高位被忽略
FileOutputStream子类:
构造方法:
FileOutputStream(File file) 创建输出流,传入指定的文件对象
FileOutputStream(File file, boolean append) 第二参数传入布尔值,指定是否在原
来的内容往后写,还是重新开始写
FileOutputStream(String name) 创建输出流,传入指定的文件名称或路径
FileOutputStream(String name,boolean append) 布尔值原理同上
方法:Close和write方法和OutputStream的方法相同
InputStream类
此抽象类是表示输入字节流的所有类的超类。
方法:
close() 关闭流,使用完毕后必须关闭流
read() 读取字节数据,返回值为int(0-255),返回-1表示后面无数据
read(byte[] b) 从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。
返回int为实际读取的字节数量,-1表示没有数据
read(byte[] b, int off, int len) 从此输入流数组第off开始读取len个数据
FileInputStream子类:
构造方法:
FileInputStream(File file) 传入一个文件对象,创建一个文件的读取输入流
FileInputStream(String name) 传入指定的文件名或对象,创建输入流
方法:
close和read方法同InputStream的方法相同
FileInputStream fis = new FileInputStream("D://a.txt");
while (true){
byte b = (byte) fis.read();
if(b==-1){
break;
}
System.out.println((char)b);
}
fis.close();
byte[] bytes = new byte[8];
int len = fis.read(bytes);
System.out.println(new String(bytes,0,len));
len = fis.read(bytes);
System.out.println(new String(bytes,0,len));
避免出现读取长度不够,自动补齐的情况
Writer类:
字符输出流,用于写入字符流的抽象类。避免字节流读取半个文字,造成乱码
方法:
writer(char[] cbuf) 写入一个数组
write(char[] cbuf, int off, int len) 写入一个数组的一部分
writer(int c) 写入一个字符
writer(String str) 写入一个字符串
write(String str, int off, int len) 写入一个字符串的一部分
close() 关闭流
flush() 刷新流
append(char c) 追加到文件
FileWriter子类:
构造方法:
与FileoutStream的构造方法差不多,多一个
FileWriter(String fileName, Charset charset) 指定字符集去读取
FileWriter(String fileName, Charset charset, boolean append)
FileWriter(File file, Charset charset)
FileWriter(File file, Charset charset, boolean append)
方法:
同Writer
Reader类:
字符输入流,用于读取字符流的抽象类
方法:
close() 关闭流
read() 读取一个字符
read(char[ ] cbuf) 读取一组字符
read(char[] cbuf, int off, int len) 读取一组字符的一部分
FileReader子类:
都也差不多
flush()刷新管道:舒心缓存,将文字写入,close()方法会自动刷新,不刷写不进去
转换流:
将字节流装饰为字符流 :使用了装饰者设计模式
FileOutputStream fos = new FileOutputStream("D://a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
FileInputStream fis = new FileInputStream("D://a.txt");
InputStreamReader isr = new InputStreamReader(fis);
打印流:
PrintStream和PrintWriter类:
方法:使用print和println
区别:PrintWriter需要刷新管道
可以将字节流转换成打印流
缓存读取流:
将字符输入流,转换为带有缓存,带有一次读一行的缓存字符读取流
BufferedReader类:
readline(): 一次读取一行 读到结尾返回null
BufferedWriter类
收集日常异常日志:
写在try - catch 下
PrintWriter pw = new PrintWriter("D://a.txt");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
pw.println(sdf.format(new Date()));
e.printStackTrace(pw);
pw.close();
Properties文件和Properties类:
基于Map 存储的是 键=值
load() 可以传入字节流或者字符流,读取
store() 将map集合所有的键值对,变成Properties文件,第二个参数是注释“#”开头
序列化与反序列化
序列化:将对象存储在文件中
ObjectOutputStream类和ObjectOutputStream类
实现Serializable接口
部分属性序列化:
1.在不想被序列化的属性前加上transient修饰词
2.在不想被序列化的属性前加上static修饰词
3.在实体类中加上writeObject()和readObject()方法
4.Externalizable接口实现,他继承自Serializable接口,需要实现readExternal 和
writerExternal方法
try-with-resources
在try小括号里面声明的资源,会自动在finally里面释放