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

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、字符流

        已经有字节流了,可以读取任意文件,为什么还要有字符流呢?

  1. 对于字符文件,先作为字节传输,再转成字符,耗时耗力。
  2. 对于字符文件,转成字节之后,再转回来,如果是中文,很容易乱码。

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协议&#xff0c…...

【.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 表用于存储产品层级信息&#xf…...

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.…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...