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

news2024/11/15 9:55:10

❣博主主页: 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.coloradmin.cn/o/1666372.html

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

相关文章

python内置类memoryview()详解

memoryview() Python 的一个内置class&#xff0c;可直接使用。它返回给定参数的“内存视图”对象。内存视图对象是一个对支持缓冲区协议&#xff08;如 bytes 或 bytearray&#xff09;的数据的“窗口”或“视图”&#xff0c;它允许你在不复制数据的情况下操作内存中的数据。…

【机器学习】 技术栈和开发环境搭建

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 博客目录 技术栈编程语言库框架编辑器项目IDE …

数据分析需要注意哪些法律法规

数据分析 前言一、数据处理过程二、数据收集阶段的法律规则数据收集应具备合法、正当、透明原则数据收集应坚持最小必要原则数据收集应遵守知情-同意规则数据收集应遵守目的明确性要求 三、数据储存的法律规则四、数据使用与处理的阶段的法律规则数据安全保护义务按照数据分级分…

Linux:文件IO

Linux&#xff1a;文件IO C语言 文件IOfopen Linux 文件IOopen接口close接口write接口read接口 内存文件管理struct filestruct files_struct文件描述符 fd 缓冲区 C语言 文件IO 在正式讲解Linux中是如何对文件进行IO前&#xff0c;我们先简单回顾以下C语言中&#xff0c;是如…

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下&#xff1a; 有一个薪水表salaries简况如下&#xff1a; 获取每个部门中当前员工薪水最高的相关信息&#xff0c;给出dept_no, emp_no以及其对应的salary&#xff0c;按照部门编号dept_no升序排列&#xff0c;以上例子输出如下: 2、题目…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

第一部分&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;************ 【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT…

【Linux】AlmaLinux 9.4版本发布

AlmaLinux 9.4 正式版发布&#xff0c;该版本基于 Redhat Enterprise 9.4&#xff0c;内核版本号&#xff1a; 5.14.0-427.13.1.el9_4.x86_64 相对于Rocky Linux&#xff0c; AlmaLinux更加的稳定&#xff0c;生产环境建议使用AlmaLinux来替代CentOS 7.x AlmaLinux 9.4版本系统…

MIPI DPHY HS传输模式SoT和EoT的传输值

目录 1. 高速传输模式的传输序列 2. SoT传输序列 3. EoT传输序列 1. 高速传输模式的传输序列 Mipi DPHY的高速数据传输&#xff08;HST&#xff1a;High Speed Transmission&#xff09;以突发&#xff08;Burst&#xff09;方式发生。 为了帮助接收机同步&#xff1a; (1) …

Python-VBA函数之旅-str函数

目录 一、str函数的常见应用场景 二、str函数使用注意事项 三、如何用好str函数&#xff1f; 1、str函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、str函数的常…

Redis-配置文件详解

Redis配置文件详解 units单位 配置大小单位&#xff0c;开头定义基本度量单位&#xff0c;只支持bytes&#xff0c;大小写不敏感。 INCLUDES Redis只有一个配置文件&#xff0c;如果多个人进行开发维护&#xff0c;那么就需要多个这样的配置文件&#xff0c;这时候多个配置 文…

指针(5)加油吧

指针&#xff08;5&#xff09; 拿冒泡排序来举例&#xff1a; 1 .qsort void qsort (void* base,//base指向待排序数组的首元素的指针size_t num,//base指向数组中元素的个数size_t size,//base指向的数组中的一个元素的大小&#xff0c;单位是字节int(*cmp)(const void*,co…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …

LeetCode 138. 随机链表的复制

目录 1.原题链接&#xff1a; 2.结点拆分&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 138. 随机链表的复制 2.结点拆分&#xff1a; ①.拷贝各个结点&#xff0c;连接在原结点后面&#xff1b; ②.处…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录&#xff0c;这次打算开始学习模仿学习的相关原理&#xff0c;参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

【源头开发】运营级竞拍商城源码/抢拍转拍/竞拍源码/转卖寄售/拆分/溢价商城转拍溢价php源码uniapp源码

大家好啊&#xff0c;欢迎来到web测评&#xff0c;我是年哥&#xff0c;我们有个小伙伴又开发了一款竞拍商城的源码&#xff0c;是此系统的源头开发者&#xff0c;本系统是前后端分离的架构&#xff0c;前端php&#xff0c;后端uniapp&#xff0c;系统现在是持续的在更新中&…

libcity笔记: HSTLSTMEncoder

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

React 第三十一章 前端框架的分类

现代前端框架&#xff0c;有一个非常重要的特点&#xff0c;那就是基于状态的声明式渲染。如果要概括的话&#xff0c;可以使用一个公式&#xff1a; UI f&#xff08;state&#xff09; state&#xff1a;当前视图的一个状态f&#xff1a;框架内部的一个运行机制UI&#xff1…

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

从头理解transformer,注意力机制(下)

交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考&#xff0c;然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…