【Java文件操作】文件系统操作文件内容操作
文件系统操作
常见API
在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法:
-
构造方法:
File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径和子路径创建一个File对象。File(File parent, String child):根据父File对象和子路径创建一个File对象。
-
文件或目录的基本信息:
boolean exists():判断文件或目录是否存在。boolean isFile():判断是否为一个普通文件。boolean isDirectory():判断是否为一个目录。String getName():获取文件或目录的名称。String getPath():获取路径名称。long length():获取文件的字节长度。
-
文件操作:
boolean createNewFile():创建一个新文件,如果文件已存在则返回false。boolean delete():删除文件或目录。boolean mkdir():创建一个新目录。boolean mkdirs():创建多级目录。boolean renameTo(File dest):重命名文件或目录。
-
文件的读写:
File[] listFiles():列出目录中的所有文件和子目录。String[] list():列出目录中的所有文件和子目录的名称。
-
路径操作:
String getAbsolutePath():获取文件的绝对路径。String getParent():获取文件父目录的路径。
-
权限和属性:
boolean canRead():判断文件是否可读。boolean canWrite():判断文件是否可写。boolean canExecute():判断文件是否可执行。
这些方法为文件和目录的创建、删除、重命名及信息获取提供了方便的API。可以根据需要使用这些方法进行文件管理操作。
经典面试题
扫描指定文件目录,找到文件名包含指定字符的所有普通文件,让用户判断是否删除该文件
import java.io.File; // 导入File类,用于处理文件和目录
import java.util.Scanner; // 导入Scanner类,用于接收用户输入public class Example {public static void main(String[] args) {// 创建Scanner对象以接收用户输入Scanner scanner = new Scanner(System.in);System.out.println("请输入要查找的路径名:");String path = scanner.next(); // 读取用户输入的路径名File rootPath = new File(path); // 创建File对象// 检查输入的路径是否是一个目录if (!rootPath.isDirectory()) {System.out.println("你输入的不是一个合法的路径!!!");return; // 如果不是合法路径,结束程序}System.out.println("请输入要删除文件的关键词:");String word = scanner.next(); // 读取用户输入的关键词scanDir(rootPath, word); // 调用scanDir方法进行目录扫描}// 递归扫描目录,查找含有特定关键词的文件private static void scanDir(File path, String word) {File[] files = path.listFiles(); // 列出当前目录下的所有文件和子目录if (files == null) {return; // 如果没有文件,返回}// 遍历文件数组for (File file : files) {// 如果当前项是文件,则检查是否需要删除if (file.isFile()) {checkDelete(file, word); // 调用checkDelete方法检查文件} else {// 如果当前项是目录,递归调用scanDir方法scanDir(file, word); }}}// 检查文件名是否包含关键词,并处理删除操作private static void checkDelete(File file, String word) {// 检查文件名是否包含指定的关键词if (file.getName().contains(word)) {System.out.println(file.getName()); // 打印匹配的文件名System.out.println("是否删除该文件?"); // 提问用户是否删除Scanner scanner = new Scanner(System.in);String check = scanner.next(); // 读取用户输入的确认信息// 如果用户输入"shi",表示确认删除if (check.equals("shi")) {boolean delete = file.delete(); // 尝试删除文件if (delete) {System.out.println("删除成功!"); // 删除成功提示} else {System.out.println("删除失败!"); // 删除失败提示}} else {return; // 如果用户不想删除,返回}} else {return; // 如果文件名不包含关键词,返回}}
}
运行效果如下:

文件内容操作
Read 类常见API
在Java中,Reader类是一个抽象类,主要用于读取字符流。常用的Reader子类包括FileReader、BufferedReader、InputStreamReader等。以下是一些常见的Reader类的方法:
-
构造方法:
Reader():创建一个新的Reader对象(需要子类实现具体功能)。
-
读取字符:
int read():读取单个字符并返回,返回-1表示流的末尾。int read(char[] cbuf):将字符读入数组中,返回实际读取的字符数量,返回-1表示流的末尾。int read(char[] cbuf, int off, int len):从字符输入流中读取字符并将其存储到字符数组的一个部分中,返回实际读取的字符数量。
-
跳过字符:
long skip(long n):跳过字符流中的n个字符并返回实际跳过的字符数量。
-
查找方法:
boolean ready():判断是否可以读取更多字符,如果可以,返回true。
-
关闭流:
void close():关闭流并释放相关资源。
-
获取字符流信息:
String toString():返回此Reader的字符串表示(由具体实现决定)。
-
读取文本行(通常用于
BufferedReader):String readLine():读取一行字符,返回字符串,返回null表示流的末尾。
这些方法提供了字符流的读取功能,适用于处理文本数据。如果需要处理特定类型的输入或文件,通常会选择相应的子类,例如使用FileReader读取文件,使用BufferedReader提高读取效率等。
Writer 类常见API
在Java中,Writer类是一个抽象类,用于写入字符流。常用的Writer子类包括FileWriter、BufferedWriter、PrintWriter等。以下是一些常见的Writer类的方法:
-
构造方法:
Writer():创建一个新的Writer对象(需要子类实现具体功能)。
-
写入字符:
void write(int c):写入单个字符。void write(char[] cbuf):将字符数组的内容写入流中。void write(String str):将字符串的内容写入流中。void write(String str, int off, int len):写入字符串的一部分,从指定的偏移量开始,最多写入指定的字符数。
-
缓冲:
void flush():刷新该流,确保所有缓存的字符都被写入目标流中。
-
关闭流:
void close():关闭流并释放与之关联的所有资源。
-
写入字符数组:
void write(char[] cbuf, int off, int len):将数组中指定范围内的字符写入流中。
-
换行方法(通常用于
BufferedWriter):void newLine():写入一个行分隔符,通常用于文本文件的换行。
-
格式化输出(通常用于
PrintWriter):void printf(String format, Object... args):按照给定的格式输出。void println():写入一个行分隔符(换行)。
这些方法提供了字符流的写入功能,非常适合处理文本文件和输出。不同的Writer实现提供了不同的功能,例如BufferedWriter提供缓存功能以提高效率,而PrintWriter则提供方便的格式化输出功能。根据具体需求,可以选择适当的Writer实现。
经典面试题
将一个文件中的内容完整复制到另一个文件中
题目描述: 请编写一个Java程序,使用Reader和Writer类,将一个文本文件中的内容复制到另一个文本文件中。请考虑使用合适的子类以提高程序的效率,并确保在读取和写入时处理异常。程序需具备以下功能:
- 从源文件中读取内容。
- 将读取的内容写入目标文件。
- 需要在控制台提示用户输入源文件路径和目标文件路径。
- 在文件操作完成后,提示用户操作结果(如复制成功、失败等)。
示例代码:
下面是一个简单的实现示例:
import java.io.*;public class FileCopyExample {public static void main(String[] args) {// 使用Scanner获取用户输入的文件路径try (Scanner scanner = new Scanner(System.in)) {System.out.println("请输入源文件路径:");String sourcePath = scanner.nextLine(); // 读取源文件路径System.out.println("请输入目标文件路径:");String destPath = scanner.nextLine(); // 读取目标文件路径// 创建文件Reader和Writer对象try (Reader reader = new FileReader(sourcePath);Writer writer = new FileWriter(destPath)) {char[] buffer = new char[1024]; // 创建缓冲区int length;// 循环读取源文件内容,并写入目标文件while ((length = reader.read(buffer)) != -1) {writer.write(buffer, 0, length); // 写入缓冲区中的内容}System.out.println("文件复制成功!"); // 提示成功消息} catch (IOException e) {System.out.println("文件操作失败:" + e.getMessage()); // 提示错误消息}}}
}
注意事项
- 确保输入的文件路径是有效的,并且有权限读取源文件和写入目标文件。
- 处理可能出现的异常,如文件未找到或无法读取/写入的情况。
- 在实际应用中,可以使用
BufferedReader和BufferedWriter进行更高效的读取和写入操作。
扩展
- 可以考虑添加更多的功能,例如在复制前检查目标文件是否存在,是否覆盖等。
- 可以扩展为一个方法,接收源文件和目标文件的路径作为参数,以便复用。
OutputStream 类的常见API
在Java中,OutputStream类是一个抽象类,主要用于输出字节流。常用的OutputStream子类包括FileOutputStream、BufferedOutputStream、DataOutputStream等。以下是一些常见的OutputStream类的方法:
-
构造方法:
OutputStream():创建一个新的OutputStream对象(需要子类实现具体功能)。
-
写入字节:
void write(int b):将指定的字节写入输出流。参数b可以是一个字节的值(0-255)。void write(byte[] b):将字节数组中的所有字节写入输出流。void write(byte[] b, int off, int len):将字节数组中从off(偏移量)开始的len(长度)个字节写入输出流。
-
刷新:
void flush():刷新输出流,确保所有缓冲的输出字节被写入目标流。
-
关闭流:
void close():关闭输出流并释放与之关联的所有资源。
-
使用辅助功能(如在
BufferedOutputStream中):void write(byte[] b, int off, int len):也可以用于写入指定的字节数组部分。
示例代码
以下是一个简单示例,演示如何使用FileOutputStream写入字节到文件中:
import java.io.FileOutputStream;
import java.io.IOException;public class OutputStreamExample {public static void main(String[] args) {// 使用FileOutputStream写入文件try (FileOutputStream fos = new FileOutputStream("output.txt")) {String content = "Hello, World!";fos.write(content.getBytes()); // 将字符串转换为字节并写入文件fos.flush(); // 刷新流,确保所有数据都被写入System.out.println("写入成功!"); // 提示消息} catch (IOException e) {System.out.println("写入失败:" + e.getMessage()); // 错误处理}}
}
通过使用OutputStream及其子类,可以方便地进行字节数据的输出操作,主要用于文件、网络等数据流的处理。
InputStream 类的常见API
在Java中,InputStream类是一个抽象类,主要用于输入字节流。常用的InputStream子类包括FileInputStream、BufferedInputStream、ByteArrayInputStream等。以下是一些常见的InputStream类的方法:
-
构造方法:
InputStream():创建一个新的InputStream对象(需要子类实现具体功能)。
-
读取字节:
int read():从输入流中读取下一个字节的数据,并返回(0-255)。如果到达流末尾,则返回-1。int read(byte[] b):从输入流中读取数量最多为b.length字节的数据到一个字节数组中,返回实际读取的字节数,返回-1表示到达流末尾。int read(byte[] b, int off, int len):从输入流中读取最多len字节的数据到字节数组b的指定偏移量off中,返回实际读取的字节数,返回-1表示到达流末尾。
-
跳过字节:
long skip(long n):跳过并丢弃n个字节,从输入流中返回实际跳过的字节数。
-
可用字节:
int available():返回可以从输入流中读取的字节数,而不需要阻塞。
-
关闭流:
void close():关闭输入流并释放与之关联的所有资源。
-
标记和重置:
void mark(int readlimit):标记当前输入流的位置,以便在读取数据后可以调用reset()方法返回到这个位置。void reset():重置输入流到最后标记的位置。boolean markSupported():检查该输入流是否支持标记和重置功能。
示例代码
以下是一个简单示例,演示如何使用FileInputStream读取文件内容:
import java.io.FileInputStream;
import java.io.IOException;public class InputStreamExample {public static void main(String[] args) {// 使用FileInputStream读取文件try (FileInputStream fis = new FileInputStream("input.txt")) {int byteData;// 逐个字节读取文件内容while ((byteData = fis.read()) != -1) {System.out.print((char) byteData); // 将字节转换为字符并输出}} catch (IOException e) {System.out.println("读取失败:" + e.getMessage()); // 错误处理}}
}
通过使用InputStream及其子类,可以方便地进行字节数据的输入操作,主要用于文件、网络等数据流的处理。
InputStream & OutputStream 的格式化使用
InputStream
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class InputStreamExample {public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("./test.txt")) {Scanner scanner = new Scanner(inputStream);String s = scanner.next();System.out.println(s);} catch (IOException e) {e.printStackTrace();}}
}
OutputStream
import java.io.*;public class OutputStreamExample {public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("./test.txt")) {PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(2);printWriter.flush();} catch (IOException e) {e.printStackTrace();}}
}
相关文章:
【Java文件操作】文件系统操作文件内容操作
文件系统操作 常见API 在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法: 构造方法: File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径…...
关于若依flowable的安装
有个项目要使用工作流功能,在网上看了flowable的各种资料,最后选择用若依RuoYi-Vue-Flowable这个项目来迁移整合。 一、下载项目代码: 官方项目地址:https://gitee.com/shenzhanwang/Ruoyi-flowable/ 二、新建数据库ÿ…...
猜数字困难版(1-10000)
小游戏,通过提示每次猜高或猜低以及每次猜中的位数,10次内猜中1-10000的一个数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…...
ASPICE术语表
术语来源描述活动Automotive SPICE V4.0由利益相关方或参与方执行的任务用参数Automotive SPICE V4.0应用参数是包含了在系统或软件层级可被更改的数据的软件变量,他们影响系统或软件的行为和属性。应用参数的概念有两种表达方式:规范(分别包括变量名称、值域范围、…...
Knife4j:打造优雅的SpringBoot API文档
1. 为什么需要API文档? 在现代软件开发中,API文档的重要性不言而喻。一份清晰、准确、易于理解的API文档不仅能够提高开发效率,还能降低前后端沟通成本。今天,我们要介绍的Knife4j正是这样一款强大的API文档生成工具,它专为Spring Boot项目量身打造,让API文档的生成…...
数学建模笔记—— 多目标规划
数学建模笔记—— 多目标规划 多目标规划1. 模型原理1.1 多目标规划的一般形式1.2 多目标规划的解1.3 多目标规划的求解 2. 典型例题3. matlab代码实现 多目标规划 多目标规划是数学规划的一个分支。研究多于一个的目标函数在给定区域上的最优化。又称多目标最优化。通常记为 …...
【鸿蒙HarmonyOS NEXT】页面之间相互传递参数
【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、页面之间相互传参 说明: 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页…...
SonicWall SSL VPN曝出高危漏洞,可能导致防火墙崩溃
近日,有黑客利用 SonicWall SonicOS 防火墙设备中的一个关键安全漏洞入侵受害者的网络。 这个不当访问控制漏洞被追踪为 CVE-2024-40766,影响到第 5 代、第 6 代和第 7 代防火墙。SonicWall于8月22日对其进行了修补,并警告称其只影响防火墙的…...
关于SAP标准委外(带料外协)采购订单信息
业务背景: 业务部门提出需要将售料外协方式变更为带料外协,带料外协实际业务存在一个委外订单存在多次发料,且每次发票需要进行齐套发料,不同批次的发料涉及物料替代。在半成品收货时需要进行对发料的组件进行扣料。 需求分析&a…...
SpringBoot整合WebSocket实现消息推送或聊天功能示例
最近在做一个功能,就是需要实时给用户推送消息,所以就需要用到 websocket springboot 接入 websocket 非常简单,只需要下面几个配置即可 pom 文件 <!-- spring-boot-web启动器 --><dependency><groupId>org.springframewo…...
使用 QEMU 模拟器运行 FreeRTOS 实时操作系统
文章目录 QEMU 官网QEMU 文档QEMU 简介QEMU 安装QEMU 命令启动虚拟机串口控制台监控命令行 FreeRTOS安装编译工具FreeRTOS 源码RISC-V-Qemu-virt_GCC 示例编译 RISC-V-Qemu-virt_GCC启动虚拟机运行 FreeRTOS QEMU 官网 https://www.qemu.org/ QEMU 文档 https://www.qemu.or…...
Oracle EBS中AR模块的财务流程概览
应收账款 (AR) 模块是Oracle E-Business Suite (EBS) 中另一个重要的财务管理模块,主要用于管理企业销售过程中的账款回收。下面是AR模块中的一些关键财务流程及其详细说明: 1. 销售订单管理 创建销售订单:当客户下单时,销售人员…...
Minitab 的直方图结果分析解释
Minitab 的直方图结果分析解释 步骤 1:评估关键特征 检查分布的尖峰和散布。评估样本数量对直方图外观的影响。 标识尖峰(即,条的最高聚类): 尖峰表示样本中最常见的值。评估样本的散布以了解数据的变异程度。例如…...
AgentRE:用智能体框架提升知识图谱构建效果,重点是开源!
发布时间:2024 年 09 月 13 日 Agent应用 AgentRE: An Agent-Based Framework for Navigating Complex Information Landscapes in Relation Extraction 在复杂场景中,关系抽取 (RE) 因关系类型多样和实体间关系模糊而挑战重重,影响了传统 “…...
力扣题解2390
大家好,欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述(中等): 从字符串中移除星号 给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号…...
用Python获取PDF页面的大小、方向和旋转角度
在文档管理和自动化领域,了解PDF文档的内在属性(如页面大小、方向和旋转角度)对于确保一致的文档处理和布局保真度至关重要。这些属性在内容重用、归档以及PDF无缝集成到网络环境或其他数字工作流程中起着关键作用,因为它们直接影…...
【即时通讯】轮询方式实现
技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要…...
Flock 明牌空投教程
FLock 旨在为人工智能构建一个去中心化的隐私保护解决方案。FLock提出了一项名为联合学习区块(简称 FLocks)的研究计划,该计划使用区块链作为数据持有者之间的协调平台来进行机器学习,同时数据保持本地和隐私。通过用区块链取代收…...
项目内部调用的远程接口开发
编写一个项目内部调用的远程接口通常是为了在分布式系统或者微服务架构中,实现各个服务之间的通信和数据交换。这样的远程接口专门用于服务之间的调用,而不是直接暴露给外部用户或前端。 项目内部的远程接口统一放在api工程 首先进入api编写接口&#x…...
影响IP代理池稳定性的因素有哪些?
IP代理池在提供网络服务时,稳定性是一项决定性指标。多个外部和内部因素可能会影响这个稳定性,因此深入理解这些影响因素,可以帮助优化IP代理池的性能与服务质量。 1. IP来源质量 纯净度与使用频次:优质的IP来源常常被描述为纯净…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
