当前位置: 首页 > news >正文

IO流(完善)

一、IO

1.1 概述

​ 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

I : input 输入

O : output 输出

1.2 分类

按处理数据类型的不同,分为字节流和字符流

按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的)

image-20240812183959998

按功能不同,分为节点流和处理流

  • 节点流:直接操作数据源
  • 处理流:对其他流进行处理

1.3 四大抽象类

image-20240812184032572

1.3.1 InputStream

image-20240812184059138

1.3.2 OutputStream

image-20240812184126437

1.3.3 Reader

image-20240812184146714

1.3.4 Writer

image-20240812184206472

1.4 文件流

文件流:用于打开文件链接,操作数据

FileInputStream 字节输入

FileOutputStream 字节输出

FileReader 字符输入

FileWriter 字符输出

1.4.1 FileInputstream

1.4.1.1 概述

FileInputstream 字节输入流,用于把某个文件已字节的形式读取出来

想要读取一个文件,首先得找到这个文件

怎么找呢? 1 相对路径 2 绝对路径

相对路径:以当前文件为准,去找其他文件, ./表示当前目录, …/表示上级目录, …/…/

绝对路径:以系统跟盘符为准,比如D盘 E盘

1.4.1.2 常用方法

image-20240812184755525

1.4.1.3 Read使用

image-20240812184820792

image-20240812184830066

1.4.1.4 Read重载使用

image-20240812184859237

1.4.2 FileReader

1.4.2.1 概述

FileReader一次读取一个字符,也就是两字节,而Unicode编码也是2字节

所以 读取文本文件时,不会出现乱码问题

1.4.2.2 使用方式

image-20240812185044417

1.4.3 FileOutputstream

1.4.3.1 概述

FileOutputstream 是字节输出流,用于将内存中数据写出去

需要传入文件路径,如果该文件不存在,则会自动创建(但是不会创建目录)

1.4.3.2 常用方法

image-20240812185317356

1.4.3.3 使用方式

image-20240812185337752

1.4.4 FileWriter

image-20240812185400837

1.5 缓冲流

image-20240812185418798

特点:

  • 主要是为了提高效率而存在的,减少物理读取次数
  • 提供readLine()、newLine()这样的便捷的方法(针对缓冲字符流)
  • 在读取和写入时,会有缓存部分,调用flush为刷新缓存,将内存数据写入到磁盘

1.5.1 BufferedReader

image-20240812185530189

1.5.2 BufferedWriter

image-20240812185606318

1.6 转换流

image-20240812185629423

1.6.1 InputStreamReader

image-20240812185655549

1.6.2 OutputStreamWriter

image-20240812185725745

1.6.3 处理乱码问题

image-20240812185745429

1.7 打印流

1.7.1 概述

image-20240813202616433

1.7.2 使用方式

image-20240813202650447

1.8 数据流

1.8.1 概述

数据 --> 加密 --> 传递 --> 读取 --> 解密 --> 数据

image-20240813202732503

1.8.2 使用

image-20240813202753722

image-20240813202759435

二、File

2.1 概述

image-20240813202828655

2.2 构造方法

​ public File(String pathname)以pathname为路径创建File对象,可以是绝对路径或者相对路

径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

​ 绝对路径:是一个固定的路径,从盘符开始

​ 相对路径:是相对于某个位置开始

​ public File(String parent,String child)以parent为父路径,child为子路径创建File对象。

​ public File(File parent,String child)根据一个父File对象和子文件路径创建File对象

2.3 常用方法

获取功能:
public String getAbsolutePath():获取绝对路径
public String getPath() :获取路径
public String getName() :获取名称
public String getParent():获取上层文件目录路径。若无,返回null
public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() :获取最后一次的修改时间,毫秒值
public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
重命名功能:
public boolean renameTo(File dest):把文件重命名为指定的文件路径
判断功能:
public boolean isDirectory():判断是否是文件目录
public boolean isFile() :判断是否是文件
public boolean exists() :判断是否存在
public boolean canRead() :判断是否可读
public boolean canWrite() :判断是否可写
public boolean isHidden() :判断是否隐藏
创建删除功能:
public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目 路径下。
public boolean delete():删除文件或者文件夹
删除注意事项:
Java中的删除不走回收站。
要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

2.4 使用方式

	// 创建对象File file = new File("E:/com/a.txt");// 获取全路径System.out.println(file.getAbsolutePath());// 获取文件名,包括扩展名// 目录只获取目录名字, 如果是文件 则获取文件名+扩展名System.out.println(file.getName());// 获取父路径(上级目录)String parentPath = file.getParent();System.out.println(parentPath);// 获取父(上级) 对象File parentFile = file.getParentFile();// 判断是否是文件,如果文件不存在,也是falseSystem.out.println(file.isFile());// 判断是否是目录System.out.println(file.isDirectory());// 获取最后一次修改时间,返回毫秒数long timer = file.lastModified();System.out.println(new Date(timer));// 判断是否存在System.out.println(file.exists());// 创建文件,返回布尔型,true,表示创建好了,false表示没有创建// 只创建文件,不会创建目录System.out.println(file.createNewFile());// 删除,成功返回trueSystem.out.println(file.delete());File f1 = new File("E:/a/b/c");// 创建目录,只会创建c,a和b不会创建System.out.println(f1.mkdir());// 会创建所有目录System.out.println(f1.mkdirs());// 得是目录才行f1 = new File("E:/a/b/c/d.txt");// 如果想要创建d.txt对应的目录,不能直接创建,否则会把d.txt也当成目录// f1.mkdirs();// 需要先获取父目录,对父目录进行创建File f2 = f1.getParentFile();if (!f2.exists()) {f2.mkdirs();}f1.createNewFile();

2.5 递归复制

2.5.1 获取目录下所有文件

image-20240813203121740

image-20240813203156812

2.5.2 单个文件复制

image-20240813203240251

2.5.3 递归复制

public static void main(String[] args) {File file = new File("D:\\33期\\课件");m1(file);}public static void m1(File file) {// 判断是否是文件if (file.isFile()) {// 如果是文件,则打印文件路径// System.out.println(file.getAbsolutePath());// 源文件路径String oldFilePath = file.getAbsolutePath();// 目标文件路径String targetFilePath = "E" + oldFilePath.substring(1);// 判断目标目录是否存在File targetParentFile = new File(targetFilePath).getParentFile();if (!targetParentFile.exists()) {// 不存在就创建targetParentFile.mkdirs();}try (// 字节输入流FileInputStream fis = new FileInputStream(oldFilePath);// 字节输出流FileOutputStream fos = new FileOutputStream(targetFilePath);// 字节输入缓冲流BufferedInputStream bis = new BufferedInputStream(fis);// 字节输出缓冲流BufferedOutputStream bos = new BufferedOutputStream(fos);) {// available 可读取的字节个数// 数组大小并不是越大越好,大小刚刚好最合适byte[] bytes = new byte[fis.available()];int temp = 0;while ((temp = bis.read(bytes)) != -1) {bos.write(bytes, 0, temp);bos.flush();}System.out.println("复制完成");} catch (Exception e) {e.printStackTrace();}return;}// 如果不是文件,就获取所有子文件,进行遍历File[] subFiles = file.listFiles();// 对每一个子文件进行相同的判断操作for (File subFile : subFiles) {m1(subFile);}}

三、对象流

3.1 概述

image-20240813203341687

3.2 注意

想要实现序列化,必须实现Serializable接口,该接口没有其他方法功能,仅仅是标记可以被序列化而已

否则会出现以下错误

image-20240813203415488

3.3 序列化

image-20240813203436879

3.4 反序列化

image-20240813203456247

3.5 serialVersionUID

​ Exception in thread “main” java.io.InvalidClassException: day02.User; local class incompatible: stream classdesc serialVersionUID = 2880521591786075964, local class serialVersionUID = -8655810197319643838

image-20240813203535321

3.6 Transient

23552651830)]

3.4 反序列化

[外链图片转存中…(img-ieN7EOSU-1723552651831)]

3.5 serialVersionUID

​ Exception in thread “main” java.io.InvalidClassException: day02.User; local class incompatible: stream classdesc serialVersionUID = 2880521591786075964, local class serialVersionUID = -8655810197319643838

[外链图片转存中…(img-lQv9O7lv-1723552651831)]

3.6 Transient

image-20240813203605413

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2.4 playwright 实战-爬取某宝商品信息
  • 四款录屏大师,一键搞定!新手也能快速上手?
  • Python数值计算(24)——PCHIP
  • Chapter 9 Operational Amplifiers
  • 快速上手Spring Boot
  • 6G:融合5G与AI,重塑网络交互与智能决策的未来
  • NB模组AT 命令用法记录
  • 如何使用yolov5-master进行训练
  • 书生.浦江大模型实战训练营——(四)书生·浦语大模型全链路开源开放体系
  • JavaScript高阶笔记总结第三天:(JavaScript高阶完结)
  • JavaScript中的字符串与数字转换
  • 人工智能GPU算力评估分析
  • Unity动画模块 之 Animation
  • Gradle相关的语法
  • 官宣|Apache Flink 1.20 发布公告
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Docker入门(二) - Dockerfile
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS 系统授权开发
  • isset在php5.6-和php7.0+的一些差异
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • mysql 数据库四种事务隔离级别
  • TypeScript实现数据结构(一)栈,队列,链表
  • 闭包--闭包之tab栏切换(四)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 数组大概知多少
  • 算法---两个栈实现一个队列
  • 探索 JS 中的模块化
  • 通过git安装npm私有模块
  • 网页视频流m3u8/ts视频下载
  • 微服务入门【系列视频课程】
  • 用jquery写贪吃蛇
  • 源码安装memcached和php memcache扩展
  • scrapy中间件源码分析及常用中间件大全
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ## 1.3.Git命令
  • #Linux(帮助手册)
  • (1)虚拟机的安装与使用,linux系统安装
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (六)c52学习之旅-独立按键
  • (六)软件测试分工
  • (全注解开发)学习Spring-MVC的第三天
  • (四)鸿鹄云架构一服务注册中心
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)c++ std::pair 与 std::make
  • (转)fock函数详解
  • **PHP二维数组遍历时同时赋值
  • .htaccess配置重写url引擎
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core引入性能分析引导优化
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例