File类:
- java中文件和目录路径名的抽象表示,通过调用其中的方法可以对文件和文件夹进行操作
- File类实例的创建:构建方法的参数一般为目标文件或者文件夹的路径,可以为绝对路径或者相对路径,也可以分开两个参数传递父路径和子路径
- 绝对路径:从存储盘开始的路径
- 相对路径:相对于项目目录的路径
- File类的常用方法
- getPath(), getAbsolutePath(), getName(), length() -> 获得文件大小,以字节为单位
- exists(), isDirectory(), isFile(),以上三个方法返回值均为布尔值
- createNewFile(), delete(), mkdir(), mkdirs()
- mkdirs() 用于创建目录,区别是会创建任何必须但不存在的父目录
- list() 返回String[], listFiles() 返回File[]
字节字符 & 输入输出流
- Input > 写入 > reader
- Output > 写出 > writer
字节输出流
- OutputStream -> FileOutputStream
- FileOutputStream
- 构造方法:File或者文件路径String作为参数;在创建实例的时候可以添加参数 boolean append 来说明是否续写
- 调用write(int b) 或者 wirte(byte[] b)输出内容
- 输出换行:windows:\r\n;Linux:\n;max:\r
字节输入流
- InputStream > FileInputStream
- 同样是创建实例时以File或者文件路径String作为参数传递
- read() 方法:若没有参数则返回以int形式返回读到的结果,若有byte[]作为参数传递则将读到的内容放置在数组中,将读到的字节数长度作为结果返回
- 不过无论是哪种方法,在读到文件结尾处都会返回-1
字符输入 & 输出流
- 以字符为单位读写数据,Reader > FileReader & Writer > FileWriter
- 使用方法跟字节流差不多,不过区别在于当用数组接受数据时,不是用byte[]而是char[]作为参数传递
Properties - 可以序列化的Map
- Properties properties = new Properties();
- 向创建好的properties中添加键值对:setProperties(key, value)
- properties.store(Writer/ OutputStream, String comment) // 这里的comment似乎是不可以省略的
- properties.load(Reader / InputStream)
缓冲流:
- BufferedInputStream, BufferedOutputStream
- BufferedReader, BufferedWriter
- 构造参数为 Input/OutputStream / Reader / Writer
- eg. BufferedReader br = new BufferedReader(new FileReader(“xxx.txt”));
- 其操作文件的读写方法基本上是一致的
- 如果在使用缓冲流的基础上再使用数组的话,效率会更高
转换流
- 当以字符为单位进行读写的时候,如果读写对象所使用的字符集不同的话,就会出现编码解码之间的冲突,可以使用转换流来规定编码或者解码时所使用的的字符集来防止乱码的出现
- 创建方法
- 因为要使用到字节流,所以在创建的时候要传递 InputStream / OutputStream 作为参数
- 同时要制定所使用的字符集
- eg. InputStreamReader is = new InputStreamReader(new FileInputStream(“xxx.txt”), “CharSet”)
序列化
- ObjectInputStream & ObjectOutputStream
- eg. ObjectOutputStream
- 初始化通过 InputStream / OutputStream 实现,在创建ObjectInputStream / OutputStream对象的时候以InputStream / OutputStream作为对象传递,同时设定目标文件的路径
- 然后调用方法 readObject() / writeObject 来时实现对象的读写
- 要使用序列化功能的类要实现Serializable接口,不过其实这个接口没有任何实际意义上的功能,仅仅是一个标记接口
- 如果尝试对没有实现Serializable接口的类实例进行序列化,就会抛出NotSerializableException
- 对于不需要进行序列化的属性,可以使用transient关键字进行修饰
- 对于反序列化对象,JVM必须要能找到该类的class文件,如果找不到的话就会抛出 ClassNotFoundException
- 如果对象在序列化之后,class文件发生了修改,那么就会在反序列化的时候产生InvalidClassException,不过可以通过设定final static 的 serialVersionUID 来防止这种情况发生