【Java EE】文件IO

Author:MTingle
major:人工智能

---------------------------------------

Build your hopes like a tower!

目录

一、文件是什么?

二、针对文件系统操作的API

1.文件路径,文件名,文件是否存在

2. 创建文件

3.删除文件(*在线程结束时)

4. 创建File对象代表的⽬录

5. 文件改名及文件移动

三. 针对文件内容的操作(写文件 / 读文件)

1. 字节流(inputStream / outputStream)

1). 打开关闭文件 及 .read()

2). read一次读若干个字节

3). 读取汉字

4).写文件

2. 字符流(Reader / Writer)

3. 查找硬盘上文件的位置

4. 实现文件复制

3. 在目录中搜索,按照文件内容的方式搜索


一、文件是什么?

针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时, 往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概 念,就类似办公桌上的⼀份份真实的⽂件⼀般。

二、针对文件系统操作的API

1.文件路径,文件名,文件是否存在

public class IODemo1 {public static void main(String[] args) throws IOException {File f=new File("./test.txt");System.out.println(f.exists());System.out.println(f.isFile());System.out.println(f.getName());System.out.println(f.getPath());System.out.println(f.getAbsolutePath());System.out.println(f.getCanonicalPath());}
}

2. 创建文件

public class IODemo2 {public static void main(String[] args) throws IOException {File f=new File("./test.txt");boolean ret=f.createNewFile();System.out.println("ret: "+ret);System.out.println(f.exists());}
}

3.删除文件(*在线程结束时)

public class IODemo3 {public static void main(String[] args) throws InterruptedException, IOException {
//        File file=new File("./test.txt");
//        boolean ret=file.delete();
//        System.out.println(ret);File file=new File("./test.txt");boolean ret=file.createNewFile();System.out.println("ret: "+ret);file.deleteOnExit();Thread.sleep(5000);}
}

4. 创建File对象代表的⽬录

public class IODemo4 {public static void main(String[] args) {File file=new File("./aaa/bbb/ccc");boolean ret=file.mkdirs();System.out.println(ret);}
}

5. 文件改名及文件移动

public class IODemo5 {public static void main(String[] args) {// 改名//        File src=new File("./test.txt");
//        File dest=new File("./test2.txt");
//        src.renameTo(dest);// 移动文件File src=new File("./test2.txt");File dest=new File("./aaa/test2.txt");src.renameTo(dest);}
}

三. 针对文件内容的操作(写文件 / 读文件)

在进行文件操作的时候,我们在结束操作的时候一定要调用 .close() 方法关闭文件,否则就会造成 文件资源泄露 / 内存泄漏 问题.

文件描述符表记录了当前进程都打开了哪些文件,每打开一个文件,都需要在文件描述符表中占据一个位置,如果不关闭的话,一直打开会造成文件描述符表被耗尽(文件描述符表有长度上限),当文件描述符表被耗尽,就会造成一系列的逻辑问题

1. 字节流(inputStream / outputStream)

以字节为单位,一次最少读写一个字节

1). 打开关闭文件 及 .read()

public class IODemo6 {public static void main(String[] args) throws IOException {// 打开文件
//            InputStream inputStream=null;
//        try {
//           inputStream=new FileInputStream("./test.txt");
//        }finally { // 防止文件结束时未执行到关闭位置,使用finally确保文件被关闭//关闭文件
//            inputStream.close();
//        }try (InputStream inputStream=new FileInputStream("./test.txt")){while (true) {int b=inputStream.read(); // 读到文件末尾,read会返回 -1 if (b==-1) {break;}System.out.printf("%x ",b);}}}
}

在此处我们更推荐使用第二种方法进行打开关闭文件,一旦出了 try 代码块,此时 try 自动帮我们调用inputStream的close方法.

此处的read方法,看起来是 int 类型,实际上是 byte ,实际的取值是 0- 255 ,此处有一个特殊情况,若读到文件末尾,则返回 -1 ,所以使用 int .

使用无参数版本,每次调用读取一个字节,返回值就表示读到的这个字节的值.

有参数版本中, offset 在此处表示偏移量

2). read一次读若干个字节

public class IODemo7 {public static void main(String[] args) throws IOException {// 一次读若干个字节try (InputStream inputStream=new FileInputStream("./test.txt")){while (true) {byte[] buffer=new byte[1024];int n=inputStream.read(buffer);if (n==-1) {break;}for (int i = 0; i < n; i++) {System.out.printf ("%x ",buffer[i]);}}}}}

read 的第二三个版本,返回的 int 表示实际读取的字节个数, buffer 是一个常见的术语,表示 "缓冲区",往往是一个内存空间,读文件就是把硬盘数据读取到内存中,上面这种写法,一次读取若干个字节,会比一次读取一个高效,类似的,一次写若干个字节,也比一次写一个字节更高效,操作硬盘本身就是一个比较低效的操作,期望低效的操作出现的次数越少越好,这样效率就会更高

3). 读取汉字

public class IODemo8 {public static void main(String[] args) throws IOException {// 一次读若干个字节(汉字)try (InputStream inputStream=new FileInputStream("./test.txt")){while (true) {byte[] buffer=new byte[1024];int n=inputStream.read(buffer);if (n==-1) {break;}String s=new String(buffer,0,n);System.out.println(s);}}}
}

此处的 String 是通过前 n 个字节构造,而不是整个数组,实际读取的文件内容可能不足1024

4).写文件

写文件与读文件类似,三个版本的含义也相似

public class IODemo9 {public static void main(String[] args) throws IOException {
//        try (OutputStream outputStream=new FileOutputStream("./test.txt")){
//            byte[] buffer=new byte[]{97,98,99,100,101,102};
//            outputStream.write(buffer);
//
//        }try (OutputStream outputStream=new FileOutputStream("./test.txt",true)){byte[] buffer=new byte[]{97,98,99,100,101};outputStream.write(buffer);}}
}

注释部分与未注释的部分的区别为少了一个 true ,当我们实施写操作打开文件的时候,注释版本中没有填 true ,系统默认为 false ,此时当我们打开文件时,会清空文件之前的所有内容,若我们不想把文件原来的内容清空,而是继续往下写文件,将内容写到文件的末尾,我们需要在末尾加上一个 true ,此时我们打开文件时就不会将原有的内容清空.

此处的参数 append 的含义为追加.

2. 字符流(Reader / Writer)

以字符为单位进行读写,一次最少读写一个字符,在utf8中,一个汉字需要三个字节来表示,所以读写汉字的时候,每次读写都需要以3个字节为单位进行,不能一次读写半个汉字. Reader 和 Writer 的使用和 inputStream outputStream 类似.只不过此时是按照 char 为单位操作了

public class IODemo10 {public static void main(String[] args) throws IOException {// 字符流读
//        try (Reader reader=new FileReader("./test.txt")) {
//            while (true) {
//                char[] buffer = new char[1024];
//                int n = reader.read(buffer);
//                if (n==-1) {
//                    break;
//                }
//                String s = new String(buffer, 0, n);
//                System.out.println(s);
//            }
//        }// 字符流写try (Writer writer=new FileWriter("./test.txt")){String s="你好啊";writer.write(s);}}
}

此处的代码里,有一个关键问题, char 占两个字节,但是我们的汉字是占3个字节(utf8),但是此处读取来的每个字节咋就成2个字节了呢?

此处这个代码,相当于把当前文件的 utf8 在按照字符读取的时候,先转换成 unicode ,每个 char 中存储的是对应的 unicode 的值,如果是基于 unicode 最终还可以构造回 utf8 的 String.

文件utf8 => char[] unicode => String utf8

上述的替换过程我们无法直接感知到, java 里面已经封装好了.

public class IODemo11 {public static void main(String[] args) {try (Writer writer=new FileWriter("./test.txt")){String s="你好啊";writer.write(s);} catch (IOException e) {throw new RuntimeException(e);}}
}

Scanner 也可以辅助我们进行读文件, Scanner(System.in) ,括号内部本质上就是一个 inputStream.

public class IODemo12 {public static void main(String[] args) throws FileNotFoundException {try (InputStream inputStream=new FileInputStream("./test.txt")){Scanner scanner=new Scanner(inputStream);while (scanner.hasNextLine()) {String s=scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

3. 查找硬盘上文件的位置

public class IODemo13 {// 查找硬盘上的文件位置public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入文件名: ");String fileName=scanner.next();System.out.println("请输入文件目录: ");String rootPath=scanner.next();File rootFile=new File(rootPath);if (!rootFile.isDirectory()) {System.out.println("输入文件目录有误!");return;}scanDir(fileName,rootFile);}private static void scanDir(String fileName, File rootPath) {File[] files=rootPath.listFiles();if (files==null) {return;}for (File f:files) {//      System.out.println("查找中,当前路径为: "+f.getAbsolutePath());if (f.isDirectory()) {scanDir(fileName,f);}else if (f.isFile()) {if (fileName.equals(f.getName())) {System.out.println("找到了,绝对路径为: "+f.getAbsolutePath());}}else {;}}}
}

此处我们使用递归,就是要进行树的遍历,把目录中,以及其中的子目录,所有的文件都遍历一遍,看是否有符合要求的

4. 实现文件复制

public class IODemo14 {// 复制文件public static void main(String[] args) throws IOException {Scanner scanner=new Scanner(System.in);System.out.println("请输入要复制的源文件: ");String srcPath=scanner.next();System.out.println("请输入要复制的目标文件: ");String destPath=scanner.next();// 检查文件合理性// 1.复制的源文件File srcFile=new File(srcPath);if (!srcFile.isFile()) {System.out.println("源文件路径有误!");return;}// 2.目标文件File destFile=new File(destPath);if (!destFile.getParentFile().isDirectory()) {System.out.println("目标文件路径有误!");return;}try (InputStream inputStream=new FileInputStream(srcPath);OutputStream outputStream=new FileOutputStream(destPath)){while (true) {// 把内容读到inputStreambyte[] buffer=new byte[1024];int n=inputStream.read(buffer);if (n==-1) {break;}// 把内容写到outputStreamoutputStream.write(buffer,0,n);}}}
}

把一个文件复制一下,成为另一个文件,就是把第一个文件读方式打开,一次读取出这里的每个字节,再把读到的内容写入另一个文件里.

3. 在目录中搜索,按照文件内容的方式搜索

public class IODemo15 {public static void main(String[] args) throws IOException {Scanner scanner=new Scanner(System.in);System.out.println("请输入要查找的路径: ");String rootPath=scanner.next();System.out.println("请输入要查找的词: ");String word=scanner.next();// 检查路径合理性File rootFile=new File(rootPath);if (!rootFile.isDirectory()) {System.out.println("查询路径有误!!!");return;}// 开始查找scanDir(word,rootFile);}private static void scanDir(String word, File rootFile) throws IOException {File[] files=rootFile.listFiles();if (files==null) {return;}for (File f:files) {System.out.println("当前遍历到: "+f.getAbsolutePath());// 1.找到对应目录if (f.isFile()) {searchInFile(word,f);}else if (f.isDirectory()) {scanDir(word,f);}else {;}}}private static void searchInFile(String word, File f) throws IOException {try (InputStream inputStream=new FileInputStream(f);){// 拼接字符StringBuilder stringBuilder=new StringBuilder();while (true) {byte[] buffer=new byte[1024];int n=inputStream.read(buffer);if (n==-1) {break;}String string=new String(buffer,0,n);stringBuilder.append(string);}// 字符匹配if (stringBuilder.indexOf(word)!=-1) {System.out.println("找到了"+word+"路径为: "+f.getAbsolutePath());return;}}}
}

用户输入一个目录,一个要搜索的词,遍历文件的过程中没如果文件包含了要搜索的词,此时就把文件的路径打印出来.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537623.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软考中级软件设计师——数据结构与算法基础学习笔记

软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构&#xff08;存储结构&#xff09; 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所…

Flask-SQLAlchemy一对多 一对一 多对多关联

一. 组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── tem…

【Matlab 肌电信号分析】

一、数据预处理 1.1 数据读取 使用matlab从rhd文件中读取原始数据&#xff0c;共64个通道。 1.2 数据滤波 使用 60Hz的Notch filter 和150Hz的高通Butterworth滤波器进行降噪 二、波峰提取 > 每个通道分别根据相应的规则提取出波峰、波谷附近的波形。 三、信号聚类 3.1 降…

Postman接口测试、Python接口自动化测试

接口自动化测试笔记&#xff0c;自用 来源&#xff1a;https://www.bilibili.com/video/BV1Cs4y1C73Hp45&vd_source37bf552472afa993fb78c918d1dea2bc 目录 一、Postman接口测试 1.postman自动关联 1&#xff09;创建环境并选择 2&#xff09;使用自动关联技术&#xf…

iPhone 上丢失了重要的联系人?如何恢复已删除的 iPhone 联系人

丢失 iPhone 上的联系人可能会带来灾难。无论是一份很棒的新工作机会、潜在的恋爱对象&#xff0c;还是您一直想打电话的老朋友&#xff0c;如果您打开“联系人”应用时看到空白&#xff0c;这绝不是好事。不过&#xff0c;一切并非全无&#xff0c;仍然可以通过备份或专业软件…

月薪14K的网安公司,来做一下笔试题呀~

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 网络安全简介…

【Linux】基础IO认识(2)

基础IO认识&#xff08;2&#xff09; 1、补充系统调用1、1、read调用1、2、stat 2、重定向2、1、文件描述符的分配规则2、2、实现重定向(dup2) 3、缓冲区的理解3、1、缓冲区典型实例3、2、缓冲区代码形式展示 4、深化和实践利用4、1、在shell中加入重定向4、2、简单实现库的封…

模拟火车世界5/Train Sim World 5 (容量289GB)百度网盘下载

版本介绍 Build.15665692|容量289GB|官方简体中文|支持键盘.鼠标.手柄 游戏介绍 来《模拟火车世界5》里&#xff0c;全世界的铁路尽属于你&#xff01;在标志性的特色城市中&#xff0c;驾驶列车穿越铁轨&#xff0c;飞驰在 3 条全新线路上&#xff0c;用新的角色迎接新的挑战…

教师薪酬管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;老师信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【FreeRL】Rainbow_DQN的实现和测试

文章目录 前言环境1 PER note2 C51 note3 Noisy note4 Rainbow note其他 前言 具体代码实现见&#xff1a;https://github.com/wild-firefox/FreeRL/blob/main/DQN_file/DQN_with_tricks.py 将其中所有的trick都用上即为Rainbow_DQN。 效果如下&#xff1a;&#xff08;学习曲…

vue 案例使用

el-switch 按键的使用 <el-switchclass"switchStyle" v-model"boolValue" :active-value"1" :inactive-value"0" active-text"ON" inactive-text"OFF" active-color"#13ce66" inactive-color&qu…

明星御用剪辑师亲授:PR剪辑技巧大全

在这个视频内容大爆炸的时代&#xff0c;一个好的剪辑工具就如同一位得力的助手&#xff0c;能让你在视频制作的道路上事半功倍。今天&#xff0c;就让我来为大家揭秘几款PR剪辑工具&#xff0c;它们各具特色&#xff0c;能够帮助你轻松应对各种剪辑需求。让我们开始吧&#xf…

kali——tshark的使用

目录 前言 使用方法 tshark提取流量为文档 前言 tshark 是一个命令行的网络分析工具&#xff0c;它用于捕获和分析网络流量。它支持多种网络协议&#xff0c;包括 TCP、UDP、ICMP 等。Tshark 可以用于调试网络问题、进行安全审计、分析应用程序性能等。 在 Kali Linux 中&…

绿咖啡豆缺陷检测系统源码分享

绿咖啡豆缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

ubuntu虚拟机装载共享文件夹导致的诡异错误

最近使用vmware station 15 安装了 ubuntu22.04 的虚拟机。在装载共享文件夹不久后便会出现诡异的错误。目前在网络上好像没有人把这归结到装载共享文件夹的问题上&#xff0c;故以供参考。 第一次&#xff1a; 在装载之后大概第二次开机&#xff0c;出现报错界面。 提示蓝牙…

驱动器磁盘未格式化恢复实战

驱动器磁盘未格式化的深度剖析 在日常的数字生活中&#xff0c;驱动器作为数据存储的重要载体&#xff0c;承载着用户无数的珍贵资料。然而&#xff0c;当遇到“驱动器中的磁盘未被格式化”的提示时&#xff0c;这份平静往往会被瞬间打破。这一状况不仅让用户感到困惑和焦虑&a…

精选评测!分享5款AI写论文最好用的软件排名

写作是一项既费时又费力的任务&#xff0c;尤其是对于科研人员来说&#xff0c;撰写论文更是一项必不可少的挑战。幸运的是&#xff0c;现在有多款免费的AI写作工具可以大大简化这一过程。小编精心挑选了5款免费的AI写作工具&#xff0c;旨在帮助大家提高写作效率&#xff0c;让…

word文档的读入(8)

如何读取答题卡中的选择题答案&#xff0c;并把所有的信息导入到Excel表格中&#xff5e; 在初始化了字典中的字段并获取了标准答案和学生答案后&#xff0c;现在只需使用if语句将学生答案studentAnswerOne和标准答案value进行比较。选择题一道题2分&#xff0c;答案正确时&…

pgsql的威胁操作--危险行为

pgsql的威胁操作--危险行为 要在PostgreSQL中列出所有数据库并删除指定的数据库 进入容器Pgsql docker exec -it 04d438beab57 /bin/bash 登录pgsql 使用以下命令登录到PostgreSQL psql -U postgres -h localhost -p 5432 列出数据库详细信息 postgres# \l 这将显示所有…

C语言代码练习(第二十六天)

今日练习&#xff1a; 数据的交换输出输入 n 个数&#xff0c;找出其中最小的数&#xff0c;将它与最前面的数交换后输出这些数 输入一个英文句子&#xff0c;将每个单词的第一个字母改成大写字母 输入一个十进制数 N &#xff0c;将它转换成 R 进制数输出 数据的交换输出输入 …