IO流补充

本文阐述了Java中File类的使用,包括构造函数、文件操作方法,以及IO流、字符流和字节流的区别。涉及序列化、反序列化、单例模式和装饰模式的示例和应用场景。
摘要由CSDN通过智能技术生成

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流的种类

  1. 流的方向: 输入流(将数据读取到内存的流) 和 输出流(将内存中的数据进行写入)
  2. 文件类型: 字符流(能用记事本打开的文件,可以使用字符流来读和写) 和 字节流
  3. 流的功能: 节点流(能够直接操作文件的流) 和 过滤流

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 技术

  1. 要克隆的对象所在的类 必须实现 Cloneable 接口
  2. 重写 Object 类中的 Clone 方法, 并修改 修饰符为 public (默认是 protected)

java中默认采用浅克隆技术,只克隆对象中 字面量类型属性的值 和 其他数据类型的引用地址
如果要实现深拷贝技术,则需要递归的克隆对象中的所有属性

浅拷贝的实现方式

  • java 的 clone 机制

深拷贝的实现方式

  1. java 的 递归 clone 机制
  2. java 序列化与反序列化
  3. 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个

单例模式的实现思路

  1. 构造方法必须私有化
  2. 提供一个静态方法 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 中的继承、可以对已有的功能进行增强

装饰模式的设计思路

  1. 有一个抽象类 或者 接口 (提供功能、但不具备功能的实现)
  2. 定义具体的实现类 、实现 抽象类中定义的方法
  3. 定义一个抽象装饰类、并维护一个 要装饰 的主体 属性(抽象类或者接口对应的对象)
    a) : 装饰类 要 继承 主体 类 、并装饰 主体 类中的具体方法
  4. 定义 装饰类的实现类、并负责 具体的装饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值