java基础-IO
1、基础概念
1.1、文件(File)
文件的读写可以说是开发中必不可少的部分,因为系统会存在大量处理设备上的数据,这里的设备指硬盘,内存,键盘录入,网络传输等。当然这里需要考虑的问题不仅仅是实现,还包括同步,读写熟读,文件类型等等都需要考虑在具体的项目中。
Java 的标准库 java.io 提供了File类的实例对象来操作文件
1.2、流(Stream)
I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
2、文件(File)
2.1、File类创建
| 名称 | 说明 |
| public File(String pathname) | 根据文件路径创建对象 |
| public File(String parent,String child) | 从父路径名字符串和子路径名字字符串创建文件对象 |
| public File(File parent,String child) | 根据父路径对应文件对象和子路径名字字符串创建对象 |
2.2、常用方法
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 isDirectory() 判断是否是文件目录
public boolean isFile() 判断是否是文件
public boolean exists() 判断是否存在
public boolean canRead() 判断是否可读
public boolean canWrite() 判断是否可写
public boolean isHidden() 判断是否隐藏
2.3、实例
public class FileTest {public static void main(String[] args) throws IOException {//1、设置目录名称String filePath = "H:\\test";//2、设置文件名称String fileName = "test.txt";//添加文件目录File file = new File(filePath);//1、判断是否存在目录boolean exists = file.exists();System.out.println("路径"+filePath+"在磁盘中是否存在:"+exists);//2、不存在,创建目录if (!exists) {boolean b = file.mkdirs();// 在磁盘中指定路径下创建目录System.out.println("创建目录是否成功:"+b);}else {System.out.println("创建目录已经存在");}//3、再判断是否存在目录boolean exists1 = file.exists();System.out.println("路径"+filePath+"在磁盘中是否存在:"+exists1);//判断传入的抽象路径名是否是一个在磁盘中已存在的文件System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的文件:"+file.isFile());// false//判断传入的抽象路径名是否是一个在磁盘中已存在的目录System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的目录:"+file.isDirectory());// trueSystem.out.println("获取绝对路径"+file.getAbsolutePath());System.out.println("获取路径"+file.getPath());System.out.println("获取名称"+file.getName());System.out.println("获取上层文件目录路径。若无,返回null"+file.getParent());System.out.println("获取文件长度(即:字节数)。不能获取目录的长度"+file.length());System.out.println("获取最后一次的修改时间,毫秒值"+new Date(file.lastModified()));System.out.println("获取指定目录下的所有文件或者文件目录的字符串数组:"+file.list());System.out.println("获取指定目录下的所有文件或者文件目录的File对象数组:"+file.listFiles());//从磁盘中删除指定文件路径下的文件或者文件目录
// file.delete();
// System.out.println("再次判断传入的抽象路径名(目录/普通文件)在磁盘中是否存在:"+file.exists());// falseSystem.out.println("=================================================================================");//添加文件File f = new File(filePath,fileName);//1、判断是否存在目录boolean e = f.exists();System.out.println("路径"+filePath+"在磁盘中是否存在:"+e);//2、不存在,创建文件if (!e) {boolean b = f.createNewFile();System.out.println("创建文件是否成功:"+b);}else {System.out.println("创建文件已经存在");}//3、再判断是否存在目录boolean e1 = f.exists();System.out.println("路径"+filePath+"在磁盘中是否存在:"+e1);// 判断传入的抽象路径名是否是一个在磁盘中已存在的文件System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的文件:"+f.isFile());// false// 判断传入的抽象路径名是否是一个在磁盘中已存在的目录System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的目录:"+f.isDirectory());// trueSystem.out.println("判断是否可读"+f.canRead());System.out.println("判断是否可写"+f.canWrite());System.out.println("判断是否隐藏"+f.isHidden());System.out.println("获取绝对路径"+f.getAbsolutePath());System.out.println("获取路径"+f.getPath());System.out.println("获取名称"+f.getName());System.out.println("获取上层文件目录路径。若无,返回null"+f.getParent());System.out.println("获取文件长度(即:字节数)。不能获取目录的长度"+f.length());System.out.println("获取最后一次的修改时间,毫秒值"+new Date(f.lastModified()));System.out.println("获取指定目录下的所有文件或者文件目录的字符串数组:"+f.list());System.out.println("获取指定目录下的所有文件或者文件目录的File对象数组:"+f.listFiles());// 从磁盘中删除指定文件路径下的文件或者文件目录
// f.delete();
// System.out.println("再次判断传入的抽象路径名(目录/普通文件)在磁盘中是否存在:"+file.exists());// false}
}
3、流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流

补充:
- 按流的角色的不同分为:节点流,处理流
节点流:直接从数据源或目的地读写数据
处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
3.1、IO 流体系图

3.2、派生类
Java的IO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的,并且子类名称都是以其父类名作为子类名后缀。

4、字节流
字节流分为字节输入流InputStream和字节输出流OutputStream,其中输入与输出是相对于内存而言的;输入即从文件中读出数据输入至内存;输出即从内存向文件中输出数据。
从jdk8文档中,InputStream 方法如下:

OutputStream方法如下:

从 Java 9 开始,InputStream 新增加了多个实用的方法:
readAllBytes():读取输入流中的所有字节,返回字节数组。
readNBytes(byte[] b, int off, int len):阻塞直到读取 len 个字节。
transferTo(OutputStream out):将所有字节从一个输入流传递到一个输出流。
4.1、实例
public class FileStreamTest {public static void main(String[] args) throws IOException {//写入FileOutputStream fileOutputStream = new FileOutputStream("H:\\test\\test.txt");String s = "test123";// 将字符串转换为byte数组byte[] outBytes = s.getBytes();fileOutputStream.write(outBytes);fileOutputStream.flush();fileOutputStream.close();System.out.println("=================================================================");//读取FileInputStream fileInputStream = new FileInputStream("H:\\test\\test.txt");//1、返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。int available = fileInputStream.available();System.out.println("available:" + available);//2、跳过并丢弃来自此输入流的 2字节数据。
// long skip = fileInputStream.skip(2);
// System.out.println("skip:" + skip);//3、读取文件内容,为了减少IO,我们创建一个Byte数组作为接收缓冲区byte[] inBytes = new byte[available];int read;//4、从输入流读取一些字节数,并将它们存储到缓冲区 b 。while ((read = fileInputStream.read(inBytes)) != -1) {// 把byte数组转换成字符串System.out.print(new String(inBytes, 0, read));}if (fileInputStream != null) {fileInputStream.close();}}
}
5、字符流
已经有字节流了,可以读取任意文件,为什么还要有字符流呢?
- 对于字符文件,先作为字节传输,再转成字符,耗时耗力。
- 对于字符文件,转成字节之后,再转回来,如果是中文,很容易乱码。
5.1、Reader

5.2、Writer

5.3、实例
public class FileStreamTest {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("H:\\test\\test.txt");String s = "少年";fw.write(s); // 将字符串写入文件// 关闭资源fw.close();FileReader fr = new FileReader("H:\\test\\test.txt");String str = new String();int b;// 循环读取while ((b = fr.read())!=-1) {str = str + (char)b;}System.out.println("str:"+str);// 关闭资源fr.close();}
}
- flush :刷新缓冲区,流对象可以继续使用。
- close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
相关文章:
java基础-IO
1、基础概念 1.1、文件(File) 文件的读写可以说是开发中必不可少的部分,因为系统会存在大量处理设备上的数据,这里的设备指硬盘,内存,键盘录入,网络传输等。当然这里需要考虑的问题不仅仅是实现,还包括同步…...
Java变量理解
成员变量VS局部变量的区别 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰…...
西南科技大学信号与系统A实验二(信号频谱分析)
一、实验目的 1.掌握用 matlab 软件绘制信号频谱的方法; 2.进一步理解抽样定理; 3.理解傅里叶变换的性质(频移特性). 二、实验原理 (一)fft 函数的调用 matlab 提供 fft 函数来计算信号 x(n)的快速离散傅里叶变换 (FFT). z 格式:y=fft(x) 计算信号 x 的快速离散傅里叶…...
C++-youtube cherno C++视频的一些知识点
对函数的调用在汇编中对应一句call func语句,其中func是一个函数的签名(signature)对程序而言,即使只有一个文件,链接器也需要链接,因为它需要链接程序入口点(entry point)一个程序的…...
sed命令
目录 一、sed 1.sed命令选项 2.语法选项 3.sed脚本格式 4.搜索替代 5.分组后向引用 1.提取版本号: 2.提取IP地址 3.提取数字权限 6.变量 二、免交互 1.多行重定向 2.免交互脚本 总结:本章主要介绍了seq和免交互的用法及相关知识 一、sed s…...
【经验分享】开发问题记录总结(持续更新)
目录 工具开发 界面类继承某自定义界面类时,出现布局混乱或者所有控件集中在左上角? 在继承自定义界面之后,以诸如 on_xxx_clicked() 模式设计的槽函数失效了? 使用pugi接口取出文本数据后,为什么该变量无法进行字符串比较&…...
MySQL导出数据库中每个表前 3000 条数据
以下是一个 Bash 脚本,它会连接到 MySQL 数据库,获取所有表名,并对每个表导出前 3000 条数据: #!/bin/bashUSERNAME"citycard" PASSWORD"密码" DATABASE"citycard" LIMIT3000# 导出数据库结构 mys…...
Spring事件注解@EventListener【观察】
一、背景 在开发工作中,我们常常会遇到这样一种情况:完成一项任务后,需要向其他模块广播消息或通知,以触发其他事件的处理。逐个发送请求固然可行,但更好的方式是采用事件监听,它是设计模式中的发布-订阅模…...
玩转Spring中强大的spel表达式!
玩转Spring中强大的spel表达式!值得推荐的好文:https://zhuanlan.zhihu.com/p/174786047...
HTTPS攻击原理 被攻击该如何防护
简单来说,HTTPS HTTP SSL/TLS。 在 HTTP 协议中,客户端通过网络传输消息与服务器进行通信。但该消息采用明文的原始格式。坏人(攻击者)很容易窃听消息。这就是我们需要 SSL/TLS 的原因。 HTTPS是一种安全的HTTP协议,…...
【.NET Core】委托(Delegate)应用详解
【.NET Core】委托(Delegate)应用详解 文章目录 【.NET Core】委托(Delegate)应用详解一、概述二、委托(Delegate)定义三、基础委托(Delegate) - 无返回值委托四、基础委托(Delegate) - 有返回值委托五、Mu…...
【LeetCode:1457. 二叉树中的伪回文路径 | 二叉树 + DFS +回文数】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
《golang设计模式》第三部分·行为型模式-06-备忘录模式(Memento)
文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 备忘录(Memento)用于在不破坏目标对象封装特性的基础上,将目标对象内部的状态存储到外部对象中,以备之后恢复状态时使用。 1.1 角色 Originato…...
Cache学习(4):Cache分配策略Cache更新策略Cache逐出策略
Cache的数据流 常用名词 Allocation 分配Eviction 驱逐分配策略和更新策略分别为当产生Cache miss和Cache hit的时候数据流的具体行为 1 Cache分配策略(Cache Allocation Policy) Cache的分配策略是指不同情况下为数据分配Cache Line的不同行为。Cac…...
角色管理--产品经理岗
研发组织管理--角色管理--产品经理岗 定位 相对稳定和简单产品的独立产品打造者,复杂产品的辅助者 所需资质 校招新人,拥有灵性拥有基础的产品力(认知,设计,创新,推进,学习)Axur…...
SQL数据迁移实战:从产品层级信息到AB测试表
文章目录 创建表插入数据清空数据表数据迁移和筛选查询数据结论 创建表 首先,代码中定义了两个表格:dim_prod_hierarchy_info 和 app_abtest_product_info,都位于 test 数据库中。 dim_prod_hierarchy_info 表用于存储产品层级信息…...
VMware系列:VMware安装Android虚拟机
VMware系列:VMware安装Android虚拟机 一. 下载镜像这里提供了三种下载镜像方式,也就是三个下载链接,这里推荐百度网盘下载二. 使用VMware Workstation Pro 创建新的虚拟机操作系统应该可以选择任意一个,笔者只试过下图中,如果读者感兴趣可以多试几个,但笔者不保证每个都可…...
链接1:编译器驱动程序
文章目录 GNU编译器示例编译 GNU编译器 GNU编译器(GNU Compiler)是由自由软件基金会(Free Software Foundation,FSF)开发和维护的一套编译器集合。这些编译器主要用于编译各种编程语言的源代码,将其转换为…...
经典滑动窗口试题(二)
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、水果成篮1、题目讲解2、讲解算法思路3、代码实现 二、找到字符串中所有字母异位词1、题目…...
easyexcel指定sheet页动态给行列加背景色
需求 1、easyexcel,有多个sheet页,某些sheet页的行、列动态需要加背景色。 2、扩展支持cellStyle标记单元格超过64000 import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
