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.…...
IndexTTS-2-LLM环境配置太难?一键镜像免配置部署实战推荐
IndexTTS-2-LLM环境配置太难?一键镜像免配置部署实战推荐 你是不是也对那些复杂的AI环境配置感到头疼?各种Python版本、依赖冲突、CUDA驱动,光是想想就让人望而却步。特别是像IndexTTS-2-LLM这样的语音合成项目,底层依赖复杂&…...
Fish Speech-1.5语音质量实测:长文本连贯性、韵律稳定性效果展示
Fish Speech-1.5语音质量实测:长文本连贯性、韵律稳定性效果展示 1. 引言:语音合成的新标杆 语音合成技术正在经历前所未有的发展,而Fish Speech-1.5无疑是这个领域的一颗新星。这个基于超过100万小时多语言音频数据训练的文本转语音模型&a…...
三菱A800变频器A8NC板卡与CC-Link网络配置实战指南
1. A8NC板卡基础认知与安装要点 第一次接触三菱A800变频器的A8NC板卡时,很多人会被这个火柴盒大小的模块难住。其实它的本质就是让变频器具备CC-Link通信能力的"翻译官"。我经手过的自动化产线项目里,90%的通信故障都源于初期安装不规范。这里…...
打字不如说话,说话不如截图——AI 代码助手的多模态输入实践捶
整体排查思路 我们的目标是验证以下三个环节是否正常: 登录成功时:服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端:浏览器是否成功接收并存储了该Cookie。 后续请求:浏览器在执行查询等操作…...
Rust的trait关联类型与泛型参数在类型系统表达力上的差异
Rust作为一门现代系统编程语言,其类型系统的设计兼顾了安全性与灵活性。在Rust中,trait关联类型与泛型参数是两种重要的抽象机制,它们在类型系统表达力上各有特点。理解二者的差异,不仅有助于写出更优雅的代码,还能在特…...
保姆级教程:用Docker一键部署YOLOv10 TensorRT模型到Jetson Orin Nano(支持USB摄像头)
极速部署YOLOv10 TensorRT模型到Jetson Orin Nano的完整实践指南 在边缘计算设备上实现高效的目标检测一直是AI开发者关注的焦点。Jetson Orin Nano作为NVIDIA推出的高性能边缘计算平台,配合YOLOv10这一最新目标检测模型,能够为各类实时视觉应用提供强大…...
去哪儿商户端分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码data {"departur…...
电磁暴露与场域隐身理论
——兼论人类通讯升维对外星文明探测与UFO现象的直接影响 一、核心立论 1. 人类当前主流通讯电磁波广播模式,本质是电磁场二维切片辐射,与爱迪生发明的电灯泡在物理底层完全同源,属于低维、暴露、高能耗的“宇宙灯塔行为”。 2. 高级星际文明…...
18. UE5 GAS RPG:从数据表格到GE的角色属性动态初始化方案
1. 为什么需要动态属性初始化 在UE5的GAS(Gameplay Ability System)框架下开发RPG游戏时,角色属性的初始化是个绕不开的话题。刚开始接触GAS时,我也习惯在AttributeSet的构造函数里直接写死初始值,就像这样:…...
玻璃采光顶密封选材及接缝设定的探讨
玻璃采光顶密封选材及接缝设定的探讨渗水或出现漏点却时有发生。玻璃采光顶与传统屋面不同,是由玻璃等不透水材质的构件装配组成,只有接缝是可能的漏水部位,这些接缝层次和构造简单,而且用高档密封材料嵌缝密封,防水不…...
