Java 文件操作

文章目录

  • Java 文件操作
    • 构造方法
    • 文件属性操作
    • 文件内容操作
      • InputStream
      • Reader
      • OutputStream
      • Writer
    • 更多案例
      • 文件查找
      • 普通文件的复制

Java 文件操作

Java 中通过 java.io.File 类来对文件进行描述。

构造方法

构造方法说明
File(String pathname)通过路径名字符串来创建 File 实例
File(String parent, String child)从父路径名字符串和子路径名字符串创建 File 实例
File(File parent, String child)从父抽象路径名和子路径名字符串创建 File 实例

注意:创建 File 实例不等于创建文件

文件属性操作

方法说明
String getParent()返回父路径名字符串
String getName()返回该抽象路径名表示的文件或目录的名称
String getPath()将此抽象路径名转换为路径名字符串
String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
String getCanonicalPath()返回此抽象路径名的规范路径名字符串
boolean exists()测试此抽象路径名表示的文件或目录是否存在
boolean isDirectory()测试此抽象路径名表示的文件是否为目录
boolean isFile()测试此抽象路径名表示的文件是否为普通文件
boolean createNewFile()当且仅当具有此名称的文件还不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
boolean delete()删除由该抽象路径名表示的文件或目录
void deleteOnExit()请求在虚拟机终止时删除由该抽象路径名表示的文件或目录
String[] list()返回该抽象路径名下的文件名
File[] listFiles()返回一个抽象路径名数组,表示该抽象路径名所表示的目录中的文件
boolean mkdir()创建以此抽象路径名命名的目录
boolean mkdirs()创建以此抽象路径名命名的目录,如果必要,会创建中间目录
boolean renameTo(File dest)重命名由该抽象路径名表示的文件
boolean canRead()测试应用程序是否可以读取由该抽象路径名表示的文件
boolean canWrite()测试应用程序是否可以修改由该抽象路径名表示的文件

示例:

public static void main(String[] args) throws IOException {File file = new File("d:/test.txt");System.out.println(file.getParent()); // d:\System.out.println(file.getName()); // test.txtSystem.out.println(file.getPath()); // d:\test.txtSystem.out.println(file.getAbsolutePath()); // d:\test.txtSystem.out.println(file.getCanonicalPath()); // D:\test.txt
}
public static void main(String[] args) throws IOException {File file = new File("helloworld.txt");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println(file.isFile()); // falseSystem.out.println("=============================");// 创建文件file.createNewFile();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // falseSystem.out.println(file.isFile()); // true
}
public static void main(String[] args) {File file = new File("helloworld.txt");// 删除文件file.delete();System.out.println(file.exists()); // false
}
public static void main(String[] args) throws IOException, InterruptedException {File file = new File("helloworld.txt");// 把文件创建回来file.createNewFile();// 在程序退出前删除file.deleteOnExit();Thread.sleep(5000);System.out.println(file.exists()); // true
}
public static void main(String[] args) {// 创建目录File file = new File("test");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println("========================");file.mkdir();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // true
}
public static void main(String[] args) {// 创建多级目录File file = new File("test/a/b/c");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println("========================");file.mkdirs();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // true
}
public static void main(String[] args) throws IOException {// 文件重命名File file1 = new File("test1.txt");File file2 = new File("test2.txt");file1.createNewFile(); // 创建 test1.txtfile1.renameTo(file2); // 重命名成 test2.txt
}

文件内容操作

相关的类:

  • 字节流:InputStream OutputStream,用于操作二进制文件
  • 字符流:Reader Writer,用于操作文本文件

InputStream

方法说明
int read()从输入流中读取下一个字节的数据。值字节以 int 形式返回,其范围为 0 到 255。如果由于到达流的末尾而没有可用的字节,则返回值 -1。此方法会阻塞,直到输入数据可用、检测到流的末尾或引发异常为止。
int read(byte b[])从输入流中读取一定数量的字节,并将其存储到数组 b 中,并且尽可能把 b 填满。实际读取的字节数以整数形式返回。此方法会阻塞,直到输入数据可用、检测到文件结尾或引发异常为止。
int read(byte b[], int off, int len)也是把读到的字节往 b 里塞,从 off 的位置开始塞,最多塞 len 个字节

InputStream 是一个抽象类,通过 new 它的子类 FileInputStream 来实例化

// 文件内容:hello
public static void main(String[] args) throws IOException {// 打开文件InputStream inputStream = new FileInputStream("test2.txt");// 读取文件while (true) {int b = inputStream.read();if (b == -1) {break;}System.out.println(b);}// 关闭文件inputStream.close();
}
/*输出:
104
101
108
108
111
*/

这正是 hello 的 ASCII 码

要想把字节流还原成原来的文本,需要手动处理:

public static void main(String[] args) throws IOException {// 打开文件InputStream inputStream = new FileInputStream("test2.txt");// 读取文件byte[] b = new byte[1024];int len = inputStream.read(b);// 还原成文本String s = new String(b, 0, len, StandardCharsets.UTF_8);System.out.println(s);// 关闭文件inputStream.close();
}

Reader

方法说明
int read(java.nio.CharBuffer target)尝试将字符读取到指定的字符缓冲区中
int read()读取单个字符。此方法将阻塞,直到字符可用、发生I/O错误或到达流的末尾
int read(char cbuf[])将字符读取到数组中。此方法将一直阻塞,直到某个输入可用、出现I/O错误或到达流的末尾
int read(char cbuf[], int off, int len)将字符读入数组的一部分。此方法将一直阻塞,直到某个输入可用、出现I/O错误或到达流的末尾

使用 FileReader 实例化

例:Reader 直接读取到文本

public static void main(String[] args) throws IOException {Reader reader = new FileReader("test2.txt");char[] buffer = new char[1024];int len = reader.read(buffer);for (int i = 0; i < len; ++i) {System.out.println(buffer[i]);}reader.close();
}

其实读文件最方便的写法,是使用 Scanner

这个我们在标准输入的时候用过,只要把 System.in 换成其他 InputStream

public static void main(String[] args) throws IOException {InputStream inputStream = new FileInputStream("test2.txt");Scanner scanner = new Scanner(inputStream);String s = scanner.next();System.out.println(s);inputStream.close();
}

技巧:使用 try with resources 关闭文件

try (InputStream inputStream = new FileInputStream("test2.txt")){// ......
} catch (IOException e) {e.printStackTrace();
}

OutputStream

方法说明
void write(int b)将指定的字节写入此输出流
void write(byte b[])将指定字节数组中的 b.length 个字节写入此输出流
void write(byte b[], int off, int len)从偏移量为 off 的指定字节数组中写入 len 个字节到此输出流
public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {outputStream.write('a');outputStream.write('b');outputStream.write('c');}
}

如果要输出一个字符串,那么需要转为字节数组:

public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {String s = "你好";outputStream.write(s.getBytes());}
}

注意:打开文件会清空文件内容,写的时候并不会

Writer

方法说明
void write(int c)写入单个字符
void write(char cbuf[])写入一个字符数组
void write(char cbuf[], int off, int len)写入字符数组的一部分
void write(String str)写入字符串
void write(String str, int off, int len)写入字符串的一部分
public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("test2.txt")) {writer.write("hello world");}
}

使用 PrintWriter 包装一下

public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {PrintWriter printWriter = new PrintWriter(outputStream);// 此处 printWriter 的用法就和 System.out 类似了printWriter.println("aaa");printWriter.flush();}
}

注意PrintWriter 自带缓冲区,如果你写的内容太短,可能需要 flush 一下

更多案例

文件查找

递归查找目录下的所有文件,将文件名包含指定字符串的文件删除

import java.io.*;
import java.util.Scanner;public class demo {public static void main(String[] args) throws IOException {System.out.println("请输入要扫描的路径:");Scanner scanner = new Scanner(System.in);String rootPath = scanner.next();File root = new File(rootPath);if (!root.exists()) {System.out.println("输入的路径不存在");return;}System.out.println("请输入要删除的文件名(或部分):");String toDelete = scanner.next();// 递归删除文件scanDir(root, toDelete);}public static void scanDir(File rootDir, String toDelete) throws IOException {File[] files = rootDir.listFiles();if (files == null) {return;}for (File f : files) {if (f.isDirectory()) {scanDir(f, toDelete);} else {tryDelete(f, toDelete);}}}public static void tryDelete(File f, String toDelete) throws IOException {if (f.getName().contains(toDelete)) {System.out.println("是否删除文件(y/n):" + f.getCanonicalPath());Scanner scanner = new Scanner(System.in);String choice = scanner.next();if (choice.equals("y")) {f.delete();}}}
}

普通文件的复制

import java.io.*;
import java.util.Scanner;public class demo {public static void main(String[] args) throws IOException {System.out.println("请输入要复制的文件路径:");Scanner scanner = new Scanner(System.in);String srcPath = scanner.next();File srcFile = new File(srcPath);if (!srcFile.exists()) {System.out.println("文件不存在");return;}if (!srcFile.isFile()) {System.out.println("不是普通文件");return;}System.out.println("请输入目标路径:");String destPath = scanner.next();File destFile = new File(destPath);if (destFile.exists()) {System.out.println("目标已经存在");return;}// 开始复制try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {byte[] buf = new byte[1024];while (true) {int len = inputStream.read(buf);if (len == -1) {// 拷贝完成break;}outputStream.write(buf, 0, len);}}System.out.println("复制完成");}
}

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

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

相关文章

JVM之jvisualvm多合一故障处理工具

jvisualvm多合一故障处理工具 1、visualvm介绍 VisualVM是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xff0c;它能为您提供强大的分析能力&#xff0c;对 Java 应 用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回…

SpringBoot:异步任务基础与源码剖析

官网文档&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了对异步执行流程的支持。 最简单的例子是&#xff1a;使用Async注解修饰一个方法&#xff0c;那么这个方法将在一个单独的线程中被执行&#xff0c;即&#xff1a;从同步执…

系列六、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解&#xff0c;即可在类中注入自己想要测试…

java反序列化漏洞详解

java反序列化漏洞 文章目录 java反序列化漏洞漏洞原理漏洞评级漏洞危害漏洞验证漏洞防御典型案例 漏洞原理 由于java开发人员在编写代码时重写了 readObject 方法&#xff0c;在重写的 readObject 方法中调用其他函数实现链式调用最终调用到了危险函数&#xff0c;从而形成反序…

【C++】泛型编程 ⑮ ( 类模板示例 - 数组类模板 | 自定义类中持有指针成员变量 )

文章目录 一、支持 数组类模板 存储的 自定义类1、可拷贝和可打印的自定义类2、改进方向3、改进方向 - 构造函数4、改进方向 - 析构函数5、改进方向 - 重载左移运算符6、改进方向 - 重载拷贝构造函数 和 等号运算符 二、代码示例1、Array.h 头文件2、Array.cpp 代码文件3、Test…

[网鼎杯 2020 朱雀组]phpweb

看一下源码 应该是输入的date 作为函数&#xff0c;value作为内部参数的值&#xff0c;将date()函数返回的结果显示在页面上 回去看的时候&#xff0c;意外发现页面有了新的跳转&#xff0c;观察一下发现&#xff0c;页面每隔五秒就会发生一次跳转 所以就抓包看看 抓包发现po…

GEE:kNN(k-最近邻)分类教程(样本制作、特征添加、训练、精度、最优参数、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行kNN(k-最近邻)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征等),运行kNN(k-最近…

Linux中,查看Tomcat版本、如何查看Tomcat版本

方法 在tomcat的bin目录下&#xff0c;执行version.sh命令即可 结果

python每日一题——3最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xf…

RpcServiceContext上下文

消费者: web 提供者: buss-service 同一服务器: 192.168.100.228 RpcServiceContext serviceContext RpcContext.getServiceContext(); //web->buss-serviceLOGGER.warn("getRequest->{}", JsonUtil.toJson(serviceContext.getRequest())); //getRequest-…

ElementUI table+dialog实现一个简单的可编辑的表格

table组件如何实现可编辑呢&#xff1f; 我的需求是把table组件那样的表格&#xff0c;实现它点击可以弹出一个框&#xff0c;然后在这个框里面输入你的东西&#xff0c;然后将他回显回去&#xff0c;当然&#xff0c;输入的有可能是时间啥的。 为什么要弹出弹层不在框上直接…

最近iphone手机的交管12123闪退,打不开的解决办法?

苹果手机系统和新版软件不配&#xff0c;终极决绝办法&#xff1a;升级IOS系统就好 可能是手机的内存不足了&#xff0c;因为在使用APP时&#xff0c;需要占用手机的内存&#xff0c;如果手机内存不足以支持软件允许&#xff0c;软件就会闪退。车主可以清理一下手机的内存&…

弹窗msvcp140_1.dll丢失的解决方法,超简单的方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是缺少某个文件的错误。最近&#xff0c;我在使用某些软件时&#xff0c;遇到了一个名为“msvcp140_1.dll”的错误提示。这个错误通常出现在运行某些程序时&#xff0c;由于缺少了msvcp140…

项目总结报告(案例模板)

软件项目总结报告模板套用&#xff1a; 项目概要项目工作分析经验与教训改进建议可纳入的项目过程资产 --------进主页获取更多资料-------

2023年【汽车驾驶员(中级)】最新解析及汽车驾驶员(中级)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年汽车驾驶员&#xff08;中级&#xff09;最新解析为正在备考汽车驾驶员&#xff08;中级&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的汽车驾驶员&#xff08;中级&#xff09;试题及解…

Doris中的物化视图-查询(十九)

物化视图创建完成后&#xff0c;用户的查询会根据规则自动匹配到最优的物化视图。 比如我们有一张销售记录明细表&#xff0c;并且在这个明细表上创建了三张物化视图。一个存储了不同时间不同销售员的售卖量&#xff0c;一个存储了不同时间不同门店的销售量&#xff0c;以及每…

C#,《小白学程序》第二课:数组,循环与排序

1 什么是数组&#xff1f; 数组 Array 是一组数值&#xff08;数 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是数组。 2 排序 排序就是按大小、名字、拼音或你指定的信息进行比较后排队。 排序是数组最基本的功能需求。 3 文本格式 /// <summa…

《数据结构、算法与应用C++语言描述》-代码实现散列表(线性探查与链式散列)

散列表 完整可编译运行代码&#xff1a;Github:Data-Structures-Algorithms-and-Applications/_22hash/ 定义 字典的另一种表示方法是散列&#xff08;hashing&#xff09;。它用一个散列函数&#xff08;也称哈希函数&#xff09;把字典的数对映射到一个散列表&#xff08…

spring-webflux的一些概念的理解

Spring5的webflux可以支持高吞吐量&#xff0c;使用相同的资源可以处理更加多的请求&#xff0c;它将会成为未来技术的趋势&#xff0c;但是相对于学习其他的框架相比&#xff0c;它的学习曲线很高&#xff0c;综合了很多现有的技术&#xff0c;即使按照教程学习能编写代码&…

requests库的学习(详细篇)

一、request库的安装 requests属于第三方库&#xff0c;Python不内置&#xff0c;因此需要我们手动安装。 pip3 install requests