JavaEE初阶学习:文件操作

news2024/12/28 22:12:14

1.文件

1.认识文件

平时说的文件一般都是指存储再硬盘上的普通文件,形如txt,jpg,MP4,rar等这些文件都可以认为是普通文件,它们都是再硬盘上存储的。

在计算机中,文件可能是一个广义的概念,就不只是包含普通文件,还可以包含目录(把目录称为目录文件)文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以JPEG格式保存并且文件扩展名为.jpg)。

普通文件是保存在硬盘上的。

机械硬盘的基本构造:

  1. 盘片,存储数据的介质
  2. 磁头

针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,
往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。

在这里插入图片描述
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。

在这里插入图片描述
文件的分类(站在程序员的角度)

主要把文件分为两类

  1. 文本文件,里面存储的是字符,文本文件本质上也是存字节的,但是文本文件中相邻的字节在一起正好构成一个个字符。
  2. 二进制文件,里面存储的是字节

在这里插入图片描述

2.树型结构组织和目录

计算机里,保存管理文件,是通过操作系统中“文件系统”这样的模块来负责的。

随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。

在这里插入图片描述

在这里插入图片描述

3. 文件路径

如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

在这里插入图片描述

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。

在这里插入图片描述
在这里插入图片描述

即使是定位到同一个文件,如果基准目录不同,此时相对路径也不同。

2.Java中的操作文件

1.文件系统相关的操作

文件系统相关的操作指的是通过”文件资源管理器“能够完成的一些功能。

功能:

  • 列出目录中有哪些文件
  • 创建文件
  • 创建目录
  • 删除文件
  • 重命名文件

在Java中提供了一个File类,通过这个类来完成上述操作
首先File类就描述一个文件/目录

File的构造方法,能够传入一个路径,来指定一个文件,这个路径可以是绝对路径也可以是相对路径

属性:
在这里插入图片描述

构造方法:
在这里插入图片描述

方法:
在这里插入图片描述

文件操作,也是一种输入输出,File这个东西也就在IO中

在这里插入图片描述
在这里插入图片描述

这样就可以定位到具体的文件,是以绝对路径的方式。
在这里插入图片描述

  1. 如果是通过命令行的方式(java.Demo),此时执行命令所在的目录,就是基准路径
  2. 如果是通过IDEA的方式来运行程序,此时基准路径就是当前Java项目所在的路径
  3. 把一个java代码打残war包,放到tomcat上运行
    这种情况下基准路径就是tomcat的bin目录
    一旦路径指定错了,很容易出现找不到的情况~
import java.io.File;


import java.io.IOException;

@SuppressWarnings({"all"})

public class Demo {

    public static void main(String[] args) throws IOException {

        File f = new File("E:/text.txt");
        // 获取到文件的父目录
        System.out.println(f.getParent());
        // 获取到文件名
        System.out.println(f.getName());
        // 获取到文件路径
        System.out.println(f.getPath());
        // 获取到绝对路径
        System.out.println(f.getAbsolutePath());
        // 获取到绝对路径
        System.out.println(f.getCanonicalPath());
        System.out.println("===================");
        File f2 = new File("./test.txt");

        // 获取到文件的父目录
        System.out.println(f2.getParent());
        // 获取到文件名
        System.out.println(f2.getName());
        // 获取到文件路径
        System.out.println(f2.getPath());
        // 获取到绝对路径
        System.out.println(f2.getAbsolutePath());
        // 获取到绝对路径
        System.out.println(f2.getCanonicalPath());

    }
}

在这里插入图片描述

2.文件内容的相关操作

  • 打开文件
  • 读文件
  • 写文件
  • 关闭文件

针对文件内容的读写,java标准库提供了一组类~
首先按照文件的内容,分为两个系列

字节流对象,针对二进制文件,是以字节为单位进行读写的,读:InputStream,写:OutputStream。
字符流对象,针对文本文件,是以字符为单位进行读写的,读:Reader,写:Writer。

InputStream

在这里插入图片描述

在这里插入图片描述
read提供了三个版本的重载

  1. 无参版本:一次读一个字节
  2. 一个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数
  3. 三个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数,不是从数组的起始位置放置,而是从中间位置放置(off这个下标的位置)len表示最多能放多少个元素(字节)

在这里插入图片描述
IO操作失败的可能性是非常大的,另外硬盘也容易出现“坏道”

public class Demo2 {
    public static void main(String[] args) {
        // 构造方法中需要指定打开文件的路径
        try {
            // 1. 创建对象,同时也是在打开文件
            InputStream inputStream = new FileInputStream("E://test.txt");
            // 2. 尝试一个一个字节的读,把整个文件读完
            while (true) {
                int b = inputStream.read();
                if (b == -1)
                    break;
                System.out.println(b);
            }
            // 3. 读完之后要记得关闭文件,释放资源
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
更好的做法是把close放到finally里面
改进之后的代码

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@SuppressWarnings({"all"})
public class Demo3 {
    public static void main(String[] args) {
        // 构造方法中需要指定打开文件的路径
        InputStream inputStream = null;
        try {
            // 1. 创建对象,同时也是在打开文件
            inputStream = new FileInputStream("E://test.txt");
            // 2. 尝试一个一个字节的读,把整个文件读完
            while (true) {
                int b = inputStream.read();
                if (b == -1)
                    break;
                System.out.println(b);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 3. 读完之后要记得关闭文件,释放资源
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

try (InputStream inputStream = new FileInputStream("E:/test.txt")){
	// 一次读取若干个字符
    while (true) {
		byte[] buffer = new byte[1024];
        int len = inputStream.read(buffer);
        if (len == -1) {
        	// 如果返回-1 就读完了
            break;
        }
        for (int i = 0; i < len; i++) {
        	System.out.println(buffer[i]);
        }
 	}
} catch (IOException e) {
	throw new RuntimeException(e);
}

在这里插入图片描述

OutputStream
在这里插入图片描述

public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("E:/test.txt")) {
//            outputStream.write(97);
//            outputStream.write(98);
//            outputStream.write(99);
            byte[] buffer = new byte[]{97, 98, 99};
            outputStream.write(buffer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

@SuppressWarnings({"all"})
public class Demo4 {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("E/test.txt")){
            // 按照字符来读
            while (true) {
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if (len == -1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.println(buffer[i]);
                }
                String s = new String(buffer, 0, len);
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

// 按照字符来写
@SuppressWarnings({"all"})
public class Demo5 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("E:?test.txt")){
            writer.write("yjx");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3.文件操作案例

扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

import java.io.*;
import java.util.Scanner;

public class IODemo1 {
    //扫描指定目录,并找到名称或者内容包含指定字符的所有普通文件
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //1.先让用户指定一个要搜索的根目录
        System.out.println("请输入要扫描的根目录: ");
        File rootDir = new File(scanner.next());
        if(!rootDir.isDirectory()) {
            System.out.println("输入有误,您输入的目录不存在!");
            return;
        }

        //2.让用户输入一个人要查询的词
        System.out.println("请输入要查询的词: ");
        String word = scanner.next();

        //3.递归的进行目录/文件的遍历
        scanDir(rootDir,word);


    }

    private static void scanDir(File rootDir, String word) {
        //列出当前rootDir 中的内容,没有内容,直接递归结束
        File[] files = rootDir.listFiles();
        if(files == null) {
            //当前rootDir是一个空的目录,这里啥也没有
            //没必要往里面递归了
            return;
        }
        //目录里面有内容,就遍历目录中的每个元素
        for (File f : files) {
            if (f.isFile()) {
                //是普通文件
                //打开文件,读取内容,比较看是否包含上述关键词
                String content = readFile(f);
                if(content.contains(word)) {
                    System.out.println(f.getAbsolutePath() + "包含要查找的关键字!");
                }
            }else if(f.isDirectory()) {
                //是目录
                //进行递归操作
                scanDir(f,word);
            }else {
                //不是普通文件,也不是目录文件,直接跳过
                continue;
            }
        }
    }

    private static String readFile(File f) {
        //读取文件的整个内容,返回出来
        //使用字符流读取,由于匹配的是字符串,就只能按照字符流处理
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)) {
            //一次读一个字符,把读到的结果给拼装到StringBuilder中,统一转成String
            while (true) {
                int c = reader.read();
                if(c == -1) {
                    break;
                }
                stringBuilder.append((char) c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}

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

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

相关文章

【云原生|Docker】12-Docker Harbor企业级镜像管理

【云原生Docker】12-Docker Harbor企业级镜像管理 文章目录【云原生Docker】12-Docker Harbor企业级镜像管理前言Harbor简介简介架构介绍组件间说明工作原理docker logindocker pushHarbor安装版本介绍安装Http模式部署https模式部署前言 ​ 上一章节我们介绍了Docker的官方的镜…

【redis】集成到SpringBoot

集成到SpringBoot 类似于java连接mysql需要JDBC 而Java连接redis则需要 对应的 工具类 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录集成到SpringBoot前言一、Jedis加依赖写业务二、lettuce加依赖写业务Jedis和…

转换字符串的最少操作次数是否所有1都至少相隔k个元素重复至少k次且长度为M的模式移除指定数字得到的最大结果 得到k个黑块的最少涂色次数

转换字符串的最少操作次数&#xff08;回顾等级&#xff1a;不值得&#xff1b;已达最优解&#xff09; 来源&#xff1a;自己LeetCode刷题 usa int minimumMoves(char * s) {int szstrlen(s);int res0;for (int i0;i<sz;i){if (s[i]X){i2;res;}}return res; }是否所有1都…

Makefile实验

一、准备C程序 1、input.h #ifndef __INPUT_H #define __INPUT_Hvoid input_int(int *a, int *b);#endif 2、input.c #include <stdio.h> #include "input.h"void input_int(int *a, int *b) {printf("input two nums: ");scanf("%d %d&q…

8年经验的面试官分享Android工程师的面试秘诀

本人目前在一家知名企业担任Android高级工程师&#xff0c;工作八年来面试不过不少Android工程师求职者&#xff0c;前后累积有两三百人。在本文内容中&#xff0c;小编将结合本人的面试经验&#xff0c;给各位正在找Android开发工作的小伙伴提出一些面试前的准备建议。 一&am…

vue3通用后台管理项目

一、创建项目 1、使用vite创建名为my-vue的项目&#xff1a;npm init vite-app my-vue 2、进入到my-vue文件夹下&#xff1a;cd my-vue 3、安装依赖包&#xff1a;npm install 4、运行该项目&#xff1a;npm run dev 二、引入element-plus 1、element-plus地址&#xff1a;http…

Camunda整体架构

REST API REST API 允许您从远程应用程序或 JavaScript 应用程序使用流程引擎。&#xff08;注意&#xff1a;REST API 的文档被分解为自己的文档。&#xff09;REST API Reference | docs.camunda.org Camunda Tasklist用于人工工作流管理和用户任务的 Web 应用程序&#xff0…

UniverSeg:通用医学图像分割模型来了!

自从今年以来ChatGPT爆火和GPT-4的发布&#xff0c;一时间在大模型的潮流下&#xff0c;通用人工智能&#xff08;AGI&#xff09;也呼之欲出。随着本月初SAM和SegGPT等通用的CV大模型的提出&#xff0c;大模型和通用模型这把火也逐渐烧到的CV领域&#xff0c;特别是图像分割领…

Linux应用编程(文件IO进阶)

一、Linux 系统如何管理文件 1.1、静态文件与 inode 文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 每一个文件都必须对应一个 inode&#xff0c;inode 实质上是一个结构体&#xff0c;这个结构体中有很多的元素&a…

【C语言】初阶指针(指针运算、二级指针及指针数组)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 指针运算 4.1 指针-整数 1.2 指针 - 指针 1.3 指针的关系运算 2. 指针和数组 3. 二级指针 4. 指针数组 1. 指针运算 指针-整数指针-指针指针的关系运算 4.1 指针-整数 上面这个程序的作用是将数组中每个元…

【攻城狮计划】Renesas RA2E1 开发板

&#x1f6a9;WRITE IN FRONT&#x1f6a9; &#x1f50e;介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四"&#x1f50e;&#x1f3c5;荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP10…

Scalable Recognition with a Vocabulary Tree(词汇树)

视觉单词 参考 视觉词袋&#xff08;BoVW&#xff0c;Bag of Visual Words&#xff09;模型&#xff0c;是“词袋”&#xff08;BoW&#xff0c;Bag of Words&#xff09;模型从自然语言处理与分析领域向图像处理与分析领域的一次自然推广。对于任意一幅图像&#xff0c;BoVW模…

jwt生成和解密-jose4j

jwt生成和解密-jose4j jwt的概念和生成意义在这里就不描述了&#xff0c;百度能搜到很多&#xff0c;直接上代码 官网地址 https://bitbucket.org/b_c/jose4j/wiki/Home maven <dependency><groupId>org.bitbucket.b_c</groupId><artifactId>jose4j…

【微信小程序】-- 配置uni-app的开发环境(四十八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Echarts图表显示不完全(多种图表解决方案)

前言 在使用Echarts画图的时候&#xff0c;有时候图表在固定大小的盒子模型&#xff08;dom容器&#xff09;中会显示不完全&#xff0c;因此我们需要对图表进行相关的调整使得图表内容显示完全。结合最近遇到的情况&#xff0c;提出一些解决方向 &#xff08;比较片面&#x…

Linux操作系统ARM体系结构处理器机制原理与实现

ARM 的概念ARM(Advanced RISC Machine)&#xff0c;既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。ARM 公司并不生产芯片也不销售芯片&#xff0c;它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)——第二章学习笔记

第二章 PyTorch模型迁移&调优 目标 了解 Pytorch 是如何适配到昇腾平台上的了解 Davinci 硬件架构以及什么样的模型在昇腾上更亲和了解软件术语和 Ascend - Pytorch 的安装步骤了解如何将原生 Pytorch 的模型代码是如何适配到 Ascend - Pytorch 前置知识 对原生 Pytorc…

足够惊艳,使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调,效果比肩斯坦福羊驼

之前尝试了从0到1复现斯坦福羊驼&#xff08;Stanford Alpaca 7B&#xff09;&#xff0c;Stanford Alpaca 是在 LLaMA 整个模型上微调&#xff0c;即对预训练模型中的所有参数都进行微调&#xff08;full fine-tuning&#xff09;。但该方法对于硬件成本要求仍然偏高且训练低效…

Java基础——IO流+字节流使用

&#xff08;1&#xff09;IO流的概述&#xff1a; IO流也称为输入&#xff0c;输出流&#xff0c;就是用来读写数据的。I表示input&#xff0c;是数据从硬盘文件读入到内存的过程&#xff0c;称之输入&#xff0c;负责读。O表示output&#xff0c;是内存程序的数据从内存到写…

CSS:transform顺序问题(translate()+rotate())

问题&#xff1a;下面两行代码在执行效果上有区别吗&#xff1f; transform: translate(100px,100px) rotate(45deg);transform: rotate(45deg) translate(100px,100px);translate(X,Y)&#xff0c;可以使元素在x轴和y轴上平移。&#xff08;在translate中&#xff0c;x轴右为…