IO 流
File 文件/目录
File 类 用来表示 文件/目录, 一个 File 类的对象就代表 磁盘上的一个文件/目录
File 类 常见的 构造方法
- new File(String path) : 传入一个指向文件/目录 的磁盘路径,构建一个 指向该文件/目录 的 File 对象
- new File(String parent, String child) : 传入一个父路径 和 子路径,构建一个指向 文件/目录的 File 对象
- new File(File parent, String child) : 传入一个父目录 和 子路径,构建一个指向 文件/目录的 File对象
- new File(Uri uri) : 传入一个 URI 路径,构建一个 指向 文件/目录的 File 对象
File 类常见的 方法
-
exists() : 判断 资源是否存在
-
isFile() : 判断 资源是否是 文件
-
isDirectory() : 判断 资源是否是 目录
-
mkdir() : 创建目录、且只能创建最后一层目录,如果父目录不存在,则创建失败
-
mkdirs() : 创建目录、能够创建多层目录
-
delete() : 删除 空文件夹 或 文件
-
listFile() : 获取一个 目录下的所有文件和目录 (只包含一层), 如果目录下没有内容,返回 null
-
listFile(FileFilter filter) : FileFilter 消费一个file、返回一个 boolean , 过滤满足条件的数据
-
listFile(FilenameFilter filter) : FilenameFilter 消费一个 dir (父目录) 和 filename (文件名),返回boolean ,过滤满足条件的数据
-
getName() : 获取 文件/目录 的名称
-
getPath() : 获取文件的路径、在构建文件对象的时候,传入的路径是什么,返回什么。
-
getAbsolutePath() : 获取文件的绝对路径
-
getCanonicalPath() : 获取文件的绝对路径,会对相对路径进行处理、但该方法需要处理异常。
-
getParent() : 获取上一级路径
-
getAbsoluteFile() : 用法同上,返回 file 对象
-
getCanonicalFile() : 用法同上,返回 file 对象
-
getParentFile() : 用法同上,返回 file 对象
-
length() : 获取文件的大小、返回 字节数、但如果 file是目录 , 不建议使用该方法
-
lastModified() : 获取文件最后的修改时间
-
setLastModified(long) : 修改 文件的最后修改时间
-
createNewFile() : 创建一个 新的文件
-
canRead() : 是否可读
-
canWrite() : 是否可写
-
canExecute() : 是否可执行
-
isHidden() : 是否是隐藏文件
公开静态常量
- File.separator : 路径分隔符, window 操作系统使用 \ , linux 操作系统使用 /
练习:
定义一个方法、接收一个 磁盘路径 , 并 获取 该路径 下所有的 java 源文件, 并存储到 List容器中
IO流的种类
- 流的方向: 输入流(将数据读取到内存的流) 和 输出流(将内存中的数据进行写入)
- 文件类型: 字符流(能用记事本打开的文件,可以使用字符流来读和写) 和 字节流
- 流的功能: 节点流(能够直接操作文件的流) 和 过滤流
InputStream 字节输入流
- FileInputStream : (输入流、字节流、节点流)
- ByteArrayInputStream : 读取一个 byte[] 的输入流
- BufferedInputStream : 带有缓冲的输入流 (过滤流)
常见的方法
- read() : 一次读取一个字节、并返回 该字节的 码值
- read(bytes) : 读取的数据返回 byte数组中、并返回读取的 长度, 适用于 大文件读取
- readAllBytes() : 将所有的数据读取并返回 byte[], 使用于小文件的读取
OutputStream 字节输出流
- FileOutputStream : (输出流、字节流、节点流)
- ByteArrayOutputStream : 能够将数据写入一个 byte[] ,并返回 byte[]
- BufferedOutputStream : 带有缓冲的 输出流
Reader 字符输入流
- FileReader : (字符流、输入流、节点流) 用来读取 字符 文件的 流
- BufferedReader
常见的方法
-
read() : 一次读取一个字符、返回字符的 码值
-
read(chars) : 将读取的内容放入到 char数组中,并返回读取的长度
-
readLine() : 是 BufferedReader 的方法,一次读取一行,当读取的结果为 null 代表读取完成
Writer 字符输出流
- FileWriter : 用来写的一个文件输出流
- BufferedWriter
常见的方法
- newLine() : BufferedWriter 中的方法,用来实现换行效果
桥接流
将 字节流 转成 字符流
- InputStreamReader
- OutputStreamWriter
PrintStream , PrintWriter
即是节点流、也是过滤流 !
ObjectInputStream , ObjectOutputStream
对 对象的 读和写
对象序列化 ObjectOutputStream
将一个内存中的对象,通过
序列化机制
写入到指定的位置,例如磁盘、数据库等
注意: 序列化的对象所在的类 必须实现 Serializable 接口 ,并提供一个 序列化版本
File -> settings -> Edit -> inspections -> 搜索 seria… -> Serializable class without Seriali…UID
对象反序列化 ObjectInputStream
将一个被序列化的数据 读取到 内存中,并转成 具体的 对象
反序列的结果是一个和原对象内容完全相同,但地址完全不同的一个全新的克隆对象
Java 中 clone 技术
- 要克隆的对象所在的类 必须实现 Cloneable 接口
- 重写 Object 类中的 Clone 方法, 并修改 修饰符为 public (默认是 protected)
java中默认采用浅克隆技术,只克隆对象中 字面量类型属性的值 和 其他数据类型的引用地址
如果要实现深拷贝技术,则需要递归的克隆对象中的所有属性
浅拷贝的实现方式
- java 的 clone 机制
深拷贝的实现方式
- java 的 递归 clone 机制
- java 序列化与反序列化
- json 序列化与反序列化 (只适用于数据处理)
JSON 序列化 与 反序列化
json 是一种用来表示 数据的 格式 、有两种表示方式, 一种是通过
{}
来定义的, 一种是通过[]
来定义的。
{}
定义的json 和 java语言中 Map对象 , Pojo 对象 对应 。
[]
定义的json 和 java语言中的 List, Array 对应。
java 官方 没有提供 处理 JSON 的 标准 API , 通常会使用 市面上主流的 处理 JSON 的 API
常用来处理 JSON 的 API 库 有 a)、 jackson , b)、fastjson c)、gson
Fastjson
- 序列化 JSONArray.toJSONString(obj, SerializerFeature)
SerializerFeature 序列化特性:
- UseSingleQuotes : 键和值 使用 单引号
- QuoteFieldNames : 键和值 使用 双引号 (默认行为)
- WriteMapNullValue : Map集合中的值如果为 null , 默认序列化后的结果不存在,通过该配置,可以显示 空属性
- WriteEnumUsingToString : 枚举值 采用 toString() 方法的结果
- WriteEnumUsingName : 使用 枚举成员名 作为 值
- PrettyFormat : 美化序列化后的结果
- WriteDateUseDateFormat : 对日期进行格式化,格式为 yyyy-MM-dd HH:mm:ss
JSONField 注解
主要可以对要实现 (反)序列化的 Pojo类中的属性进行一个序列化配置
- serialize : 该属性是否需要序列化,默认是 true
- deserialize : 该属性是否反序列化,默认是 true
- name : 序列化的键名,默认是 属性名
- format: 可以用来设置 日期的格式,例如 yyyy-MM-dd
反序列化 带有 泛型的 类型
- parseObject(text, type) :
List<Map<String, Object>> x = parseObject(text, new TypeReferece<List<Map<String, Object>>>(){}.getType())
单例模式
能够保证 一个类的对象有且 只有 1个
单例模式的实现思路
- 构造方法必须私有化
- 提供一个静态方法 getInstance(),用来 返回一个对象
- 饿汉式 (以空间换取时间)
public class FileStore {
private static FileStore store = new FileStore();
private FileStore() {}
public static FileStore getInstance() {
return store;
}
}
- 懒汉式 (以空间换取空间)
public class FileStore {
private static FileStore store ;
private FileStore() {}
public static synchronized FileStore getInstance() {
if (store == null) {
store = new FileStore();
}
return store;
}
}
ps: 懒汉式 会存在线程安全的问题,通常会在方法上,使用 synchronized来保证线程安全。
装饰模式
是 可扩展性的 另一种表现形式 , 可以替代 java 中的继承、可以对已有的功能进行增强
装饰模式的设计思路
- 有一个抽象类 或者 接口 (提供功能、但不具备功能的实现)
- 定义具体的实现类 、实现 抽象类中定义的方法
- 定义一个抽象装饰类、并维护一个 要装饰 的主体 属性(抽象类或者接口对应的对象)
a) : 装饰类 要 继承 主体 类 、并装饰 主体 类中的具体方法 - 定义 装饰类的实现类、并负责 具体的装饰