【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.mfbz.cn/a/617115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

栈和队列的相互实现

1. 两个队列实现栈. - 力扣&#xff08;LeetCode&#xff09; 队列的特点是先进先出&#xff0c;而栈的特点是后进先出&#xff08;先进后出&#xff09;&#xff0c;也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟

原文链接&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取&#xff0c;使用命令行操作Google Chrome都能…

LVS的三种工作模式---(DR/TUN/NAT)

目录 一、NAT模式&#xff08;LVS-NAT&#xff09; 二、IP隧道模式&#xff08;LVS-TUN&#xff09; 三、DR模型--直接路由模式&#xff08;LVS-DR&#xff09; LVS/DR模式ARP抑制 原因&#xff1a; LVS的DR工作模式及配置&#xff1a; LVS的NAT工作模式及配置&#xff1…

Python游戏制作大师,Pygame库的深度探索与实践

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#x…

ppt图片居中对齐

今天简单尝试了一下ppt图片怎么居中对齐&#xff0c;记录如下 准备一张图片 可以把位置该成居中 就可以让图形居中了

完全背包问题(c++)

完全背包问题 当前有 N 种物品&#xff0c;第 i 种物品的体积是 ci​&#xff0c;价值是 wi​。 每种物品的数量都是无限的&#xff0c;可以选择任意数量放入背包。 现有容量为 V 的背包&#xff0c;请你放入若干物品&#xff0c;使总体积不超过 V&#xff0c;并且总价值尽可…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的&#xff0c;包括二次贝塞尔曲线&#xff08;Q&#xff09;和三次贝塞尔曲线&#xff08;C&#xff09;。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中&#xff0c;Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作&#xff0c;以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系&#xff1a;用户在View上进行操作&…

数据结构复习指导之树、森林

文章目录 树、森林 考纲内容 复习提示 1.树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2.树、森林、与二叉树的转换 2.1树转换为二叉树 2.2森林转换为二叉树 2.3二叉树转换为森林 3.树和森林的遍历 3.1树的遍历 3.2森林的遍历 树、森林 考纲内容…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具&#xff0c;其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息&#xff0c;还能有效提高工作效率。然而&#xff0c;市场上很多便签应用仅限于单一平台使用&#xff0c;对于需要在手机和电脑间频繁切换…

FPGA第1篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)

简介&#xff1a;FPGA全称Field-Programmable Gate Array&#xff0c;是一种可编程逻辑器件&#xff0c;它通过可编程的逻辑单元和可编程的连接网络实现了灵活的硬件实现。与固定功能的集成电路&#xff08;ASIC&#xff09;相比&#xff0c;FPGA具有更高的灵活性和可重新配置性…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…

day10-Map集合

Map 1.Map 1.1 Map简介 1.为什么使用Map集合 购物车提供的四个商品和购买的数量在后台需要容器存储。 每个商品对象都一一对应一个购买数量。 把商品对象看成是Map集合的键&#xff0c;购买数量看成Map集合的值。 例如: {商品12 , 商品23 &#xff0c; 商品3 2 , 商品4…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发&#xff0c;在这个开发过程中会用到较多的接口、类、抽象类&#xff0c;它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器&#xff0c;而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

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…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

c语言题库之多个数组从两边移动向中间汇聚

文章目录 题目分析代码实现代码分析 题目 c语言题库之多个数组从两边移动向中间汇聚 呈现效果&#xff1a;输入想要输入的字符数组呈现数组从两边向中间逐渐打开的样子 分析 首先我们需要一组我们想要输入的字符数组用来展示打开的字符其次我们需要进行对数组的替换&#x…

基于STM32单片机的环境监测系统设计与实现

基于STM32单片机的环境监测系统设计与实现 摘要 随着环境污染和室内空气质量问题的日益严重&#xff0c;环境监测系统的应用变得尤为重要。本文设计并实现了一种基于STM32单片机的环境监测系统&#xff0c;该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓…

怎么把学浪课程视频下载到相册

在这个快节奏的学习时代&#xff0c;每一刻的知识获取都显得至关重要。想象一下&#xff0c;在浩瀚如海的学浪app中&#xff0c;你已经找到了那些能够点亮智慧的课程视频&#xff0c;它们不仅充满了启发&#xff0c;还是你求学旅途中的宝贵资源。但是&#xff0c;在网络不稳定或…