【JavaEE 初阶(五)】文件操作和IO

❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多文件操作

在这里插入图片描述

目录

  • 1.前言
  • 2.认识文件
  • 3.文件操作
    • 3.1File 属性
    • 3.2构造方法
    • 3.3File类方法
  • 4.文件内容操作
    • 4.1Reader
    • 4.2writer
    • 4.3inputStream
    • 4.4OutputStream
    • 4.5字符流与字节流转换
  • 5.应用
  • 6.总结

1.前言

2.认识文件

操作系统中,会把硬盘设备和软件资源抽象为文件,但大多数情况下谈到文件就是指硬盘中的文件。
文件是以树型结构组织的:以此电脑为根节点的n叉树
在这里插入图片描述
文件路径:
如何在文件系统中描述一个文件的位置,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。
在这里插入图片描述
除了使用绝路径来描述以外,还可以用
相对路径
来表示一个文件的位置

. 表示当前目录
. . 表示当前目录的上一级目录

文件类型:
二进制文件:文件是以二进制形式存储数据,不要求保存的内容是合法的字符
文本文件:文件是以纯文本形式存储数据,保存的内容都是合法的字符
判断一个文件是哪种类型,最简单的方式就是以文本的方式打开一个文件,观察是否出现乱码,如果乱码就是二进制文件否则为文本文件。
例如我打开一个图片:
在这里插入图片描述

3.文件操作

我们主要涉及文件的元信息、路径的操作,暂时不涉及关于文件中内容的读写操作。
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。

3.1File 属性

在这里插入图片描述
路径中用来分割的符号,在Windows中’/‘或者’’

3.2构造方法

在这里插入图片描述

3.3File类方法

在这里插入图片描述

public static void main(String[] args) {File file=new File("d:/test");System.out.println(file.getName());//获取父目录纯文件名称System.out.println(file.getParent());//获取父目录路径System.out.println(file.getPath());//获取file的路径System.out.println(file.getAbsolutePath());//获取file的绝对路径}

在这里插入图片描述

public static void main(String[] args) throws IOException {File file=new File("d:/test/test.txt");System.out.println(file.exists());//判断file是否存在System.out.println(file.isDirectory());//判断file是否为目录System.out.println(file.isFile());//判断file是否为文件System.out.println("创建是否成功: "+file.createNewFile());//创建file对象System.out.println("删除是否成功: "+file.delete());//删除file}

在这里插入图片描述

public static void main(String[] args) {File file=new File("d:/test");String[] files=file.list();for (int i=0;i<files.length;i++){System.out.println(files[i]);}}

在这里插入图片描述

  public static void main(String[] args) {File file=new File("d:/test/DDD/ddd");//file.mkdir();//创建一个目录file.mkdirs();//可以创建中间目录}

在这里插入图片描述

4.文件内容操作

流对象:
字节流(二进制文件):InputStream、OutStream
字符流(文本文件):Reader、Writer

4.1Reader

public static void main(String[] args) throws IOException {//打开一个文件Reader reader=new FileReader("d:/test/test.txt");while (true){//一次read读取一个字符,返回当前字符的编码//int n=reader.read();//一次读取多个字符,返回读取的字符数char[] cbuf=new char[3];int n=reader.read(cbuf);//n=-1表示读取完毕if(n==-1){break;}System.out.println(n);System.out.print(Arrays.toString(cbuf));System.out.println();}//一个文件写完需要加close要记得,关闭资源reader.close();}

注意
在之前讲进程的时候,我们讲过进程的4大属性,其中一个就是文件描述符表(顺序表)。一个进程每次打开一个文件时,就需要在这个表中分配一个元素,但这个表的长度是有上限的。如果每次打开一个文件之后不去关闭文件,那么这个表就会被占满,后续如果继续打开文件,那么就会失败。我们就称这样的情况为文件泄露。
但如果一段代码在关闭文件之前就出现了异常就中断了。那么就不会执行到关闭文件操作,那么我们有什么方法改进呢?

 public static void main(String[] args) throws IOException {//打开一个文件Reader reader=new FileReader("d:/test/test.txt");try {while (true){//一次read读取一个字符,返回当前字符的编码//int n=reader.read();//一次读取多个字符,返回读取的字符数char[] cbuf=new char[3];int n=reader.read(cbuf);if(n==-1){break;}System.out.println(n);System.out.print(Arrays.toString(cbuf));System.out.println();}}finally {//一个文件写完需要加close要记得reader.close();}}

无论try中的代码是否能正常执行,都能保证finally执行完毕。这样写虽然能够解决问题,可是不够优雅,我们在进一步改进:

public static void main(String[] args) throws IOException {//打开一个文件try (Reader reader=new FileReader("d:/test/test.txt")) {while (true) {//一次read读取一个字符,返回当前字符的编码//int n=reader.read();//一次读取多个字符,返回读取的字符数char[] cbuf = new char[3];int n = reader.read(cbuf);if (n == -1) {break;}System.out.println(n);System.out.print(Arrays.toString(cbuf));System.out.println();}} }

try with resour这个语法的目的就是()定义的变量会在try代码块结束的时候,自动调用close方法。但()定义的对象必须要实现closeable接口。
只要我们会使用reader其他=都是类似的使用规则

4.2writer

这里的写操作有多种:
write(int c):一次写一个字符
write(String str):一次写一个字符串
write(char[ ] cubf):一次写多个字符
write(String str,int off ,int len):从字符串的第off个而为之开始写
在这里插入图片描述

public static void main(String[] args) throws IOException {try (Writer writer=new FileWriter("d:/test/test.txt",true)){            //直接写会覆盖之前的内容,但加上append就不会覆盖writer.write("我在学习IO");}}

4.3inputStream

public static void main(String[] args) throws FileNotFoundException {try (InputStream inputStream=new FileInputStream("d:/test/AAA/test.txt")){while (true){byte[] bytes=new byte[1024];int n=inputStream.read(bytes);for (int i=0;i<n;i++){System.out.println(bytes[i]);}if(n==-1)break;}//字节流转换为字符流Scanner scanner=new Scanner(inputStream);String s=scanner.next();System.out.println(s);} catch (IOException e) {e.printStackTrace();}}

4.4OutputStream

public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/test/AAA/test.txt",true)) {String s="你好世界";outputStream.write(s.getBytes());outputStream.write(97);} catch (IOException e) {e.printStackTrace();}}

4.5字符流与字节流转换

输出转换:

 public static void main(String[] args) {try (InputStream inputStream=new FileInputStream("d:/test/AAA/test.txt")) {Scanner scanner=new Scanner(inputStream);String s=scanner.nextLine();System.out.println(s);} catch (IOException e) {e.printStackTrace();}}

输入转换:

 public static void main(String[] args) {try(OutputStream outputStream=new FileOutputStream("d:/test/AAA/test.txt")) {PrintWriter writer=new PrintWriter(outputStream);//先写入缓冲区writer.write("hello word");writer.flush();//记得要冲刷一下} catch (IOException e) {e.printStackTrace();}}

5.应用

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

import java.io.File;
import java.util.Scanner;//扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
public class Demo5 {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入路径");String path=scanner.nextLine();File file=new File(path);if (!file.isDirectory()){System.out.println("输入有误");return;}System.out.println("请输入文件名");String words=scanner.nextLine();find(file,words);}private static void find(File file,String words) {File[] files= file.listFiles();if (files==null){return;}for (File f:files){System.out.println("当前正在扫描"+f.getAbsolutePath());if(f.isFile()){check(f,words);}else {find(f,words);}}}private static void check(File file, String words) {if (file.getName().contains(words)){System.out.println("确认是否要删除文件(y/n)"+file.getAbsolutePath());Scanner scanner=new Scanner(System.in);String x=scanner.nextLine();if (x.equals("y")){file.delete();System.out.println("删除成功");}else {return;}}else {return;}}
}

6.总结

本篇文章主要介绍了,文件操作,File 属性。构造方法,File类方法,文件内容操作,Reader,writer,inputStream,OutputStream,字符流与字节流转换等,同学们赶快练习起来吧!!

下期预告:网络编程

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

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

相关文章

「JavaEE」多线程案例1:单例模式阻塞队列

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 多线程案例分析 &#x1f349;单例模式&#x1f34c;饿汉模式&#x1f34c;懒汉模式&#x1f34c;指令重排序 &#x1f349;阻塞队列&a…

Matlab|考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型

1主要内容 程序主要参考《考虑极端天气线路脆弱性的配电网分布式电源配置优化模型-马宇帆》&#xff0c;针对极端天气严重威胁配电网安全稳定运行的问题。基于微气象、微地形对配电网的线路脆弱性进行分析&#xff0c;然后进行分布式电源接入位置与极端天气的关联性分析&#…

易图讯三维电子沙盘-大数据处理服务

易图讯科技10名高级大数据工程师&#xff0c;高效、快速进行POI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 免费专业提供POI、AOI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 1年更新2次POI、高清卫星影像。

Electron学习笔记(四)

文章目录 相关笔记笔记说明 六、数据1、使用本地文件持久化数据(1) 用户数据目录(2) 读写本地文件(3) 第三方库 2、读写受限访问的 Cookie3、清空浏览器缓存 相关笔记 Electron学习笔记&#xff08;一&#xff09;Electron学习笔记&#xff08;二&#xff09;Electron学习笔记…

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

springcloud整合网关(springcloud-gateway) 跨域处理

pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册 --><dependency><groupId>com.alibaba.cloud</groupId&…

Python 将Excel转换为多种图片格式(PNG, JPG, BMP, SVG)

目录 安装Python Excel库 使用Python将Excel工作表转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel特定单元格区域转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel工作表转换为SVG图片 有时&#xff0c;你可能希望以图片形式分享Excel数据&#xff0c;以防止他…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

美股市场恒生指数冲刺19000点关口 地产股大涨

查查配5月10日电(中新财经记者 谢艺观)5月10日,港股现强势行情,恒生指数盘中一度冲至18993.28点,距离19000点关口仅一步之遥。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

.net core WebApi 部署 IIS

安装 IIS 下载需要的 net 版本安装 前往 .net core WebApi 项目打包 Program.cs var builder WebApplication.CreateBuilder(args);// 输出 builder.Services.AddControllers().AddJsonOptions(options > {options.JsonSerializerOptions.PropertyNamingPolicy null;…

怎么做自己的网站

现如今&#xff0c;拥有自己的网站已经成为现代生活中的一种标志。无论是个人博客、在线商店还是企业官网&#xff0c;都可以通过拥有一个网站来展示自己的个性、产品或服务。在这篇文章中&#xff0c;我将分享如何创建和管理自己的网站。 首先&#xff0c;你需要选择一个合适的…

unreal engine5.3.2 Quixel bridge无法登陆

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题定位二、解决方法 前言 这几天unreal engine5.3.2 Quixel bridge无法登陆&#xff0c;输入epic 账号和密码&#xff0c;然后在输入epic发送的验证码&#xff0c;总是提示登录失败。就算是使用科学上网依然无法登录。而且…

解决 Content type ‘application/json;charset=UTF-8‘ not supported

文章目录 问题描述原因分析解决方案参考资料 问题描述 我项目前端采用vue-elementUi-admin框架进行开发&#xff0c;后端使用SpringBoot&#xff0c;但在前后端登录接口交互时&#xff0c;前端报了如下错误 完整报错信息如下 前端登录接口JS代码如下 export function login(…

出现Duplicate key

解决&#xff1a; 第一种情况&#xff1a; 添加一个字段prjId &#xff0c;和数据库表映射时&#xff0c;映射的字段存在映射关系了。 将第二个 TableField中的prj_num改成prj_id 即可。 第二种情况&#xff1a; 转成map的形式时&#xff1a;key重复了&#xff0c;不知道把值赋…

KAN神经网络简短介绍

KANs简介 Kolmogorov-Arnold Networks (KANs) 是一种创新的神经网络模型&#xff0c;它挑战了传统多层感知器(MLPs)的设计&#xff0c;通过将激活函数从节点转移到边上来提升模型的性能和可解释性。KAN的核心在于&#xff0c;其所有权重参数均被单变量的样条函数代替&#xff…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

vue中使用element的i18n语言转换(保姆式教程-保证能用)

话不多说&#xff0c;先看效果:预览地址: https://sandm00.github.io/i18n-switch/#/ 1、项目中需要使用的插件&#xff0c;vue2或vue3、element、vue-i18n、js-cookie、vuex我是在vue2中使用 npm i element-ui -S npm i js-cookie -S npm i vue-i18n8.28.2 //因为我项目使用…

TeXlive TeXstudio安装指南

TeXlive & TeXstudio安装指南 记上次安装Visual Studio Code (Vscode)配置LaTeX后&#xff0c;由于Overleaf页数太多&#xff0c;项目超过了免费计划的编译时限&#xff08;这两天突然出现这个问题&#xff09;。加上毕设和PPT都是在Overleaf上编译&#xff0c;这两天突然…

数列排序C++

题目&#xff1a; 思路&#xff1a; 创建一个数组a&#xff0c;循环遍历输入&#xff0c;然后使用函数sort进行上升排序&#xff0c;最后循环遍历输出a[i]. #include <bits/stdc.h> using namespace std; int main(){int a[201];int n;cin>>n;//输入for(int i0;i&l…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么&#xff1f; Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫&#xff0c;非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…