【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.hqwc.cn/news/691681.html

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

相关文章

HackMyVM-Minimal

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 gobuster 文件包含漏洞 提权 web信息收集 main方法 question_1 question_2 question_3 prize.txt 软连接 信息收集 arp ┌──(root?0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: E…

免费SSL证书怎么签发

大家都知道SSL证书好&#xff0c;作用大&#xff0c;安全性高&#xff0c;能加权重&#xff0c;等保必须的参考值。但是如何选择合适且正确的证书也是至关重要的&#xff0c;网站更适合单域名证书、多域名证书、泛域名证书、还是多域名通配符证书。 首先大家要清楚&#xff0c…

10分钟了解Golang泛型

泛型是Golang在1.18版本引入的强大工具&#xff0c;能够帮助我们在合适的场合实现简洁、可读、可维护的代码。原文: Go Generics: Everything You Need To Know 导言 可能有人会觉得Go泛型很难&#xff0c;因此想要借鉴其他语言&#xff08;比如Java、NodeJS&#xff09;的泛型…

英语复习之英语形近词总结(三)

英语形近词总结复习第三部分: 单词释义例句 adorn 英 /əˈdɔːn/ 美 /əˈdɔːrn/ vt.装饰&#xff1b;使生色&#xff1a;n.(Adorn)人名&#xff1b;&#xff08;泰&#xff09;阿隆 1.They wash and wax the cars, go on and on about them—some even adorn them with …

事件高级部分

一&#xff0c;注册事件 即给元素添加事件 1.传统注册方式 2.方法监听注册方式 事件类型&#xff1a;字符串形式&#xff0c;不用带on 可以给一个元素添加多个程序 二.删除事件 1.方式 参数见上文 三.DOM事件流 事件的传播过程叫做事件流 js代码只能获取一个阶段&#xf…

Hive UDTF之explode函数、Lateral View侧视图

Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行&#xff0c;每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用&#xff0c;例如处理 JSON 格式的数据。 …

Loongnix系统替换内核操作

Loongnix系统替换内核操作 一、终端下执行命令 sudo apt search linux-image* 返回结果中格式如: linux-image-4.19.0-19-loongson-3 为最新的内核源码。 二、下载内核源码包 sudo apt source linux-image-4.19.0-19-loongson-3 如提示&#xff1a;E: 您必须在 sources.li…

【35分钟掌握金融风控策略23】定额策略

目录 定额策略 定额策略的开发、部署、监控和调优 定额策略开发 定额策略部署 定额策略监控 定额策略调优 定额策略 定额是对授信审批通过的客户给予合适授信额度的过程。如何定额、定多少额度是由定额策略来决定的。定额的多少与客户未来的动支情况、逾期情况和最终的收…

【AI源码】音频和图片生成你的数字人口播

带表情、带头部运动。适合做一些名人短视频鸡汤口播 类似此前微软和阿里emo那个方案 1、介绍: 能够通过单张静态肖像和输入音频生成具有自然流动运动的谈话视频,它采用了一种普遍的运动表示方法,能够捕捉广泛的面部动态,包括细微的表情和头部运动。 2、框架概述 (1)该…

【Linux】基础命令,文件处理,用户,vim编辑器,文件压缩

常用命令及参数&#xff1a;dir表示文件夹&#xff0c;file表示文件&#xff08;file可表示其他目录下的文件&#xff09; pwd命令&#xff1b;查看当前所属文件夹&#xff08;print working directory&#xff09; ls [选项] dir&#xff1b;查看当前、指定文件夹目录内容&am…

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率&#xff08;线程处理请求的时间占比&#xff09;。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下&#xff0c;查看…

iOS 提交项目到github(本地没有该项目)

流程简介 申请github账号&#xff08;如果有请跳过&#xff09; add repository创建项目开心的提交就好 具体过程 1. 申请账号&#xff08;本部分不做介绍&#xff0c;请自行研究&#xff09; 2. 如果有账号&#xff0c;按照下面图片依次操作就好 点击该图中的New reposito…