JavaEE-文件和IO(二)

news2025/1/14 1:01:49

目录

    • 2.2 文件内容相关的操作
  • 三、文件操作案例
    • 3.1 案例一
    • 3.2 案例二
    • 3.3 案例三

2.2 文件内容相关的操作

  1. 打开文件
  2. 读文件
  3. 写文件
  4. 关闭文件

针对文件内容的读写,java标准库提供了一组类~
首先按照文件的内容,分为两个系列

  1. 字节流对象,针对二进制文件,是以字节为单位进行读写的,读:InputStream,写:OutputStream。
  2. 字符流对象,针对文本文件,是以字符为单位进行读写的,读:Reader,写:Writer。

InputStream
在这里插入图片描述
在这里插入图片描述
read提供了三个版本的重载

  1. 无参版本:一次读一个字节
  2. 一个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数
  3. 三个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数,不是从数组的起始位置放置,而是从中间位置放置(off这个下标的位置)len表示最多能放多少个元素(字节)

在这里插入图片描述 在这里插入图片描述
IO操作失败的可能性是非常大的,另外硬盘也容易出现“坏道”

package file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

@SuppressWarnings({"all"})
public class Demo8 {
    public static void main(String[] args) {
        // 构造方法中需要指定打开文件的路径
        try {
            // 1. 创建对象,同时也是在打开文件
            InputStream inputStream = new FileInputStream("d://tst.txt");
            // 2. 尝试一个一个字节的读,把整个文件读完
            while (true) {
                int b = inputStream.read();
                if (b == -1)
                    break;
                System.out.println(b);
            }
            // 3. 读完之后要记得关闭文件,释放资源
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
更好的做法是把close放到finally里面
改进之后的代码

package file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

@SuppressWarnings({"all"})
public class Demo8 {
    public static void main(String[] args) {
        // 构造方法中需要指定打开文件的路径
        InputStream inputStream = null;
        try {
            // 1. 创建对象,同时也是在打开文件
            inputStream = new FileInputStream("d://tst.txt");
            // 2. 尝试一个一个字节的读,把整个文件读完
            while (true) {
                int b = inputStream.read();
                if (b == -1)
                    break;
                System.out.println(b);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 3. 读完之后要记得关闭文件,释放资源
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

try (InputStream inputStream = new FileInputStream("d:/test.txt");){
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    break;
                }
                System.out.println(b);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

在这里插入图片描述
在这里插入图片描述

try (InputStream inputStream = new FileInputStream("d:/test.txt")){
            // 一次读取若干个字符
            while (true) {
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                if (len == -1) {
                    // 如果返回-1 就读完了
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.println(buffer[i]);
                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

在这里插入图片描述
OutputStream
在这里插入图片描述

public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
//            outputStream.write(97);
//            outputStream.write(98);
//            outputStream.write(99);
            byte[] buffer = new byte[]{97, 98, 99};
            outputStream.write(buffer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

package file;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

@SuppressWarnings({"all"})
public class Demo10 {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("d/test.txt")){
            // 按照字符来读
            while (true) {
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if (len == -1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.println(buffer[i]);
                }
                String s = new String(buffer, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

package file;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

// 按照字符来写
@SuppressWarnings({"all"})
public class Demo11 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("d:?test.txt")){
            writer.write("xyz");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

三、文件操作案例

3.1 案例一

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要
删除该文件

用户输入一个目录~
再输入一个要删除的文件名~

package file;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

// 案例1 查找文件并删除
@SuppressWarnings({"all"})
public class Demo12 {
    public static void main(String[] args) {
        // 1. 先输入要扫描的目录,以及要删除的文件
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        String rootDirPath = scanner.next();
        System.out.println("请输入要删除的文件名");
        String toDeleteName = scanner.next();
        File rootDir = new File(rootDirPath);
        if (!rootDir.isDirectory()) {
            System.out.println("输入的要扫描的路径有误!");
            return;
        }
        // 2. 遍历目录,把指定目录中的所有文件都遍历一遍,从而要找到删除的文件
        //    通过这个方法来实现递归遍历并删除的操作
        scanDir(rootDir, toDeleteName);
    }

    private static void scanDir(File rootDir, String toDeleteName) {
        // 1. 先列出 rootDir 中都有哪些内存
        File[] files = rootDir.listFiles();
        if (files == null) {
            // rootDir 是一个空目录
            return;
        }
        // 2. 遍历当前列出的这些内容,如果是普通文件,就检测文件名是否是要删除的文件
        //    如果是目录,就递归的进行遍历
        for (File f : files) {
            if (f.isFile()) {
                // 普通文件的情况
                if (f.getName().contains(toDeleteName)) {
                    // 不要求名字完全一样,只要文件名中包含了关键字即可删除
                    // 就进行删除操作
                    deleteFile(f);
                }
            } else if (f.isDirectory()) {
                // 目录就递归的进行遍历
                scanDir(f, toDeleteName);
            }
        }
    }

    private static void deleteFile(File f) {
        try {
            System.out.println(f.getCanonicalPath() + "确认要删除吗?");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if (choice.equals("Y") || choice.equals("y")) {
                f.delete();
                System.out.println("文件删除成功!");
            } else {
                System.out.println("文件取消删除!");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3.2 案例二

进行普通文件的复制

需要让用户指定两个文件路径
一个是原路径(被复制的文件)
一个是目标路径(复制之后生成的文件)
打开源路径的文件,读取里面的内容,并写入目标文件

package file;


import jdk.internal.util.xml.impl.Input;

import java.io.*;
import java.util.Scanner;

@SuppressWarnings({"all"})
public class Demo13 {
    public static void main(String[] args) {
        // 1. 输入两个路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的源路径:");
        String src = scanner.next();
        System.out.println("请输入要拷贝的目标路径:");
        String dest = scanner.next();
        File srcFile = new File(src);
        if (!srcFile.isFile()) {
            System.out.println("输入的源路径不正确!");
            return;
        }
        // 此处不太需要检查目标文件是否存在,OutputStream写文件的时候能够自动创建不存在的文件
        // 2. 读取源文件,拷贝到目标文件中
        try (InputStream inputStream = new FileInputStream(src)) {
            try (OutputStream outputStream = new FileOutputStream(dest)){
                // 把inputStream中的数据写到OutputStream
                byte[] buffer = new byte[1024];
                while (true) {
                    int len = inputStream.read(buffer);
                    if (len == -1) {
                        break;
                    }
                    // 写入的时候,不能把整个buffer写进去,可能只有一部分是有效数据
                    outputStream.write(buffer, 0 , len);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3.3 案例三

扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
注意:我们现在的方案性能较差,所以尽量不要在太复杂的目录下或者大文件下实验

进行文件内容的查找
先输入一个路径
再输入一个要查找文件内容的”关键字“

递归遍历文件,找到看哪个文件里的内容包含了关键字,就把对应的文件路径打印出来

package file;


import java.io.*;
import java.util.Scanner;

@SuppressWarnings({"all"})
public class Demo14 {
    public static void main(String[] args) throws IOException {
        // 1. 输入要扫描的文件路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        String rootDirPath = scanner.next();
        System.out.println("请输入要查询的关键词:");
        String word = scanner.next();
        File rootDir = new File(rootDirPath);
        if (!rootDir.isDirectory()) {
            System.out.println("输入的路径非法!");
            return;
        }
        // 2. 递归遍历
        scanDir(rootDir, word);
    }

    private static void scanDir(File rootDir, String word) throws IOException {
        // 1. 先列出 rootDir 中都有哪些内容
        File[] files = rootDir.listFiles();
        if (files == null) {
            return;
        }
        // 2. 遍历每个元素,针对普通文件和目录进行分别处理
        for (File f : files) {
            if (f.isFile()) {
                // 针对文件进行内容查找
                if (containsWord(f, word)) {
                    System.out.println(f.getCanonicalPath());
                }
            } else if (f.isDirectory()) {
                // 针对目录进行递归
                scanDir(f, word);
            }
        }
    }

    private static boolean containsWord(File f, String word) {
        // 写代码,慎重使用缩写
        StringBuilder stringBuilder = new StringBuilder();
        // 把 f 中的内容都读出来,放到一个StringBuilder中
        try (Reader reader = new FileReader(f)){
            char[] buffer = new char[1024];
            while (true) {
               int len = reader.read(buffer);
               if (len == -1) {
                   break;
               }
               // 把这一段读到的结果,放到StringBuilder中
                stringBuilder.append(buffer, 0, len);
            }
        }  catch (IOException e) {
            throw new RuntimeException(e);
        }
        // indexOf 返回的是子串的下标,如果word 再stringBuilder中不存在就返回-1
        return stringBuilder.indexOf(word) != -1;
    }
}

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

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

相关文章

手把手教你写web全栈入门项目—React+Koa+MongoDB(3w字教程,真的很详细,有代码)

手把手教你写web全栈入门项目—ReactKoaMongoDB 文章目录手把手教你写web全栈入门项目—ReactKoaMongoDB前言一、推荐基础二、所需环境三、软件四、项目源码五、文章结构六、遇到问题怎么办前端一、页面登录页首页二、目录结构三、技术选择四、开始项目1、页面组件1.1 目录1.2 …

JavaScript 所见所得文本编辑器 Froala Editor 4.0.17Crack

Froala Editor v4.0.17 清除格式工具现在可以从粘贴的内容中删除内联样式。 2023 年 1 月 24 日 - 9:07新版本 特征 清除格式工具现在可以从粘贴的内容中删除内联样式。 改进的“删除时保留格式”功能可保留已删除文本的格式并将其应用于替换文本。 选择图像时&#xff0c;用于…

day20|77. 组合。回溯的开始

回溯思路 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} } 77. 组合…

91.使用注意力机制的seq2seq以及代码实现

1. 动机 2. 加入注意力 key和value是一样的 假设英语句子长为3的话&#xff0c;就会有3个key-value pair&#xff0c;key和vlaue是一个东西&#xff0c;每一个key-value pair对应第i个词的RNN的输出。之前的seq2seq只使用了最后的key-value&#xff0c;现在则是把所有的key-val…

JavaWeb语法八:网络原理初识

目录 1.局域网与广域网 1.1&#xff1a;局域网 1.2&#xff1a;广域网 2&#xff1a;网络基础知识 3.协议分层 3.1&#xff1a;分层的好处 3.2&#xff1a;TCP/IP五层&#xff08;或四层&#xff09;模式 4&#xff1a;封装和分用 4.1&#xff1a;封装 4.2&#xff1…

MyBatisPlus入门简介

目录 1. 入门案例 问题导入 1.1 SpringBoot整合MyBatisPlus入门程序 2. MyBatisPlus概述 问题导入 2.1 MyBatis介绍​​​​​​​ 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 SpringBoot整合MyBatisPlus入门程序 ①&#xff1a;创建新模块&am…

P3368 【模板】树状数组 2

【模板】树状数组 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 xxx&#xff1b; 求出某一个数的值。 输入格式 第一行包含两个整数 NNN、MMM&#xff0c;分别表示该数列数字的个数和操作的总个数。 第…

[Ext JS] Grid Summary(汇总行)特性

Ext.grid.feature.Summary 是 Grid 的feature之一。 这个特性会在表格的最下方多一行汇总。 汇总行主要包含两个部分: 值的计算效果的渲染使用后的效果如下: 定义方式 定义的步骤如下: 在grid的配置中使用features 加入 summary 的特性类型 ftype: summary在columns的每一列…

千峰学习【Ajax】总结

1.同步和异步 2.Ajax状态码 3.创建对象&#xff0c;发送请求 <script>//1.创建XHR&#xff1a; new XMLHttpRequest():var xhr new XMLHttpRequest();// console.log(xhr);//2&#xff0c;配置open(请求方式&#xff0c;请求地址&#xff0c;是否异步(默认为异步)) loc…

ESP32( IDF平台)+MAX30102 配合Pyqt上位机实现PPG波形显示与心率计算

0 引言 年前买了一个MAX30102模块&#xff0c;在家无聊做了这个demo对一些相关的知识进行学习。 主要学习的内容&#xff1a; 光体积变化描记图&#xff08;Photoplethysmogram, PPG&#xff09;测量原理学习。ESP32 IDF平台的MAX30102驱动开发&#xff0c;主要是初始化配置…

8、快捷键的使用

文章目录8、快捷键的使用8.1 常用快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源代码第5组&#xff1a;查找、替换与关闭第6组&#x…

理光M340W激光打印机加粉清零

粉盒型号&#xff1a; M340L&#xff08;如图&#xff09;&#xff1a; 加粉及清零&#xff1a; 原装粉盒不用考虑加粉了&#xff0c;原装粉盒墨粉用完后建议更换品牌代用的墨粉盒&#xff0c;品牌代用的墨粉盒直接带加粉口及清零齿轮&#xff1b; 1、加粉&#xff0c;打开加粉…

通信原理简明教程 | 物联网通信技术简介

文章目录1 物联网通信技术概述1.1 物联网通信的产生和发展1.2 物联网通信系统2 RFID技术2.1 RFID系统的组成2.2 RFID系统的工作原理2.3 RFID的典型应用3 ZigBee技术3.1 ZigBee技术的特点及应用3.2 ZigBee协议3.3 ZigBee网络的拓扑结构4 蓝牙通信技术4.1 蓝牙协议4.2 蓝牙网络连…

缓存失效问题和分布式锁引进

缓存失效问题 先来解决大并发读情况下的缓存失效问题&#xff1b; 1、缓存穿透  缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中&#xff0c;将去查询数据库&#xff0c;但是数 据库也无此记录&#xff0c;我们没有将这次查询的 null 写入缓存&#x…

CNN中池化层的作用?池化有哪些操作?

(还没写完~) 一、What is 池化 1. 基本介绍 池化一般接在卷积过程后。池化,也叫Pooling,其本质其实就是采样,池化对于输入的图片,选择某种方式对其进行压缩,以加快神经网络的运算速度。这里说的某种方式,其实就是池化的算法,比如最大池化或平均池化。在卷积神经网络…

Linux常见命令 21 - 网络命令 ping、ifconfig、last、lastlog、traceroute、netstat

目录 1. 测试网络连通性 ping 2. 查看和设置网卡 ifconfig 3. 查看用户登录信息 last 4. 查看所有用户最后一次登录时间 lastlog 5. 查看数据包到主机间路径 traceroute 6. 显示网络相关信息 netstat 1. 测试网络连通性 ping 语法&#xff1a;ping [-c] IP地址&#xff0c…

【计算几何】叉积

叉积 海伦公式求三角形面积 已知三角形三条边分别为a&#xff0c;b&#xff0c;c,设 pabc2p \frac{abc}{2}p2abc​, 那么三角形的面积为&#xff1a; p(p−a)(p−b)(p−c)\sqrt{p(p-a)(p-b)(p-c)}p(p−a)(p−b)(p−c)​ 缺点&#xff1a;在开根号的过程中精度损失 概念 两个…

DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释)

目录 那年深夏 引入 1.什么是深度优先搜索&#xff08;DFS&#xff09;&#xff1f; 2.什么是栈&#xff1f; 3.什么是递归&#xff1f; 图解过程 问题示例 1、全排列问题 2、迷宫问题 3、棋盘问题&#xff08;N皇后&#xff09; 4、加法分解 模板 剪枝 1.简介 2.剪枝的…

Jupyter notebook折叠隐藏cell代码块 (hidden more than code cell in jupyter notebook)

Nbextensions 中的 hidden input 可以隐藏cell 我们在notebook中嵌入了一段画图的代码&#xff0c;影响代码阅读&#xff0c;搜一下的把这段代码隐藏。 我们使用了 jupyter notebook配置工具 Nbextensions。找到hidden input&#xff0c;这样只会隐藏输入的代码&#xff0c;而…

Tkinter的Radiobutton控件

Tkinter的Radiobutton是一个含有多个选项的控件&#xff0c;但是只能选择其中的一个选项 使用方法 R1tk.Radiobutton(root,textA,variablevar,valueA,commandprintf) R1.pack() R2tk.Radiobutton(root,textB,variablevar,valueB,commandprintf) R2.pack() R3tk.Radiobutton(ro…