【javaEE】文件

news2025/1/16 11:01:04

目录

文件概念

文件路径

绝对路径

相对路径

文件类型

文本文件

二进制文件

Java中对文件的操作

对文件系统的操作

get相关方法

文件类型判断和创建

文件删除

文件目录的创建

文件重命名

对文件内容的操作

字符流(操作字符数据)

代码例子

删除文件

复制文件


文件概念

本文的文件只是侠义上的文件,就是文件夹和里面的文件。

多说情况下,文件更多的意思是一种软硬件资源的意思,比如网卡。


文件路径

文件路径要注意的是目录级别之间的分割符在Windows系统下既可以是  /  也可以是  \

建议使用  /  因为 \搭配其他字符有可能是转义字符的意思。

文件路径描述了文件的具体位置。 

绝对路径

绝对路径是针对于整个文件系统来说的,描述的路径是从头到尾一个不落。

从D这个盘符开始,把保存这个haha.txt文件的文件夹全部指出来。

相对路径

以当前路径文基准,或者用  .  或者 .. 开头,找到的路径就是相对路径。

当前的路径就是工作路径。假设ATest就是一个工作路径 d:/ATest

想要找到工作路径下面的hello文件夹,就直接可以用  ./hello   表示  (./  表示当前路径)

想要找到工作路径的上面的文件夹,../ATest  可以表示    (../  表示当前路径的上一级)


文件类型

文件类型可以分成两类,一种是二进制文件,一种是文本文件。

文本文件

存的是二进制数据,记事本打开看不懂。

二进制文件

存的是字符串,用记事本打开可以看懂。


Java中对文件的操作

Java对于文件的操作可以分为两大类,对文件系统的操作和文件内容的操作。其中Java标准库提供了File这个类,用来操作文件。

对文件系统的操作

静态成员

 构造方法

构造方法仅仅只是表示文件的路径,至于有没有这个文件它是不管的,也不会创建出一个文件

常用的实例方法

方法说明
String getParent()
判断用户是否对文件有可写权限
String getName()
判断用户是否对文件有可写权限
String getPath()
判断用户是否对文件有可写权限
String getAbsolutePath()
返回 File 对象的绝对路径
String getCanonicalPath()
返回 File 对象的修饰过的绝对路径
boolean exists()
判断 File 对象描述的文件是否真实存在
boolean isDirectory()
判断 File 对象代表的文件是否是一个目录
boolean isFile()
判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile()
根据 File 对象,自动创建一个空文件。成功创建后返回 true
boolean delete()
根据 File 对象,删除该文件。成功删除后返回 true
void deleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[] list()
返回 File 对象代表的目录下的所有文件名
File[] listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象表示
boolean mkdir()
创建 File 对象代表的目录
boolean mkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
boolean canRead()
判断用户是否对文件有可读权限
boolean canWrite()

判断用户是否对文件有可写权限

代码演示。

get相关方法

import java.io.File;
import java.io.IOException;

public class IODemo1 {

    public static void main(String[] args) throws IOException {
        File file = new File("D:/ATest/hello/haha.txt");
        System.out.println("该文件的上级路径" + file.getParent());
        System.out.println("该文件的名字" +file.getName());
        System.out.println("该文件的路径" +file.getPath());
        System.out.println("该文件的绝对路径" +file.getAbsolutePath());
        System.out.println("该文件修饰过的绝对路径" +file.getCanonicalPath());
    }

}

文件类型判断和创建

import java.io.File;
import java.io.IOException;

public class IODemo2 {

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

        // 这个文件是存在的
        File file = new File("D:/ATest/hello/haha.txt");
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是文件夹吗:" + file.isDirectory());
        System.out.println("是文件吗:" + file.isFile());
        System.out.println("能创建出来吗:" + file.createNewFile());
    }

}

文件删除

import java.io.File;
import java.io.IOException;

public class IODemo3 {

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

        // 该文件不存在
        File file = new File("D:/ATest/hello/xixi.txt");
        System.out.println("删除了吗:" + file.delete());
        System.out.println("创建出来了吗:" + file.createNewFile());
        System.out.println("删除了吗:" + file.delete());
        System.out.println("创建出来了吗:" + file.createNewFile());
        file.deleteOnExit();
    }

}

文件目录的创建

import java.io.File;

public class IODemo4 {

    public static void main(String[] args) {

        // 该目录不存在
        // 创建单个文件夹(绝对路径下)
        File file = new File("D:/ATest/lala");
        System.out.println("文件夹存在吗:" + file.exists());
        System.out.println("创建成功了吗:" + file.mkdir());
        System.out.println("文件夹存在吗:" + file.exists());

        // 该目录不存在
        // 创建多个文件夹(在相对路径下)
        File file2 = new File("./Test/lulu");
        System.out.println("文件夹存在吗:" + file2.exists());
        System.out.println("创建成功了吗:" + file2.mkdirs());
        System.out.println("文件夹存在吗:" + file2.exists());
    }

}

文件重命名

// 文件重命名 文件和文件夹都可以
// 这里只测试文件夹

import java.io.File;

public class IODemo5 {

    public static void main(String[] args) {

        // 把刚才Test/lulu文件名改成 heihei
        File file = new File("./Test/lulu");
        File dest = new File("./Test/heihei");
        System.out.println("被修改文件是否存在:" + file.exists());
        System.out.println("不会重名吧::" + dest.exists());
        System.out.println("修改成功了吗:" + file.renameTo(dest));

    }

}

   


对文件内容的操作

对文件内容的操作有两大类,它们都是一种类似于水流的操作。文件内容就像水龙头里的水流,文件里的就是数据流。这两大类分别是字节流和字符流,操作也都是非常相像的。都是打开,关闭,读文件和写文件。此外,对于读和写通常会搞不清楚,通过这个图就能够更好的理解了。


字节流(操作二进制数据) 

通过InputStream、FileInputStream来操作。

字节流读的过程:

打开

使用构造方法打开。 

读+关闭

此时文件内容为

import java.io.*;

// 读文件
// 测试字节流
// InputStream
public class IODemo6 {

    public static void main(String[] args) throws IOException {
        // 创建FileInputStream时,使用相对路径和绝对路径都可以,也可以直接放File对象
        // InputStream 只是一个抽象类,要使用还需要具体的实现类。
        // 关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream类
        // 我们现在只关心从文件中读取,所以使用FileInputStream
        InputStream inputStream = new FileInputStream("D:/ATest/hello/haha.txt");
        InputStream inputStream2 = new FileInputStream("D:/ATest/hello/haha.txt");
        InputStream inputStream3 = new FileInputStream("D:/ATest/hello/haha.txt");


        while(true) {
            // 无参数版本的read()
            // 这里的read()每次只会读一个字节
            int b = inputStream.read();
            if (b == -1) {
                // 当读到文件末尾的时候返回-1
                // 这也就是为什么返回值时int类型
                // 如果是byte的话,无法有多的部分表示 -1
                break;
            }
            System.out.printf("%x ", (byte)b);
        }
        System.out.println();
        System.out.println();

        while (true) {
            // 带有一个参数的read()
            // 这个数组目的是为了返回数据
            byte[] arr1 = new byte[20];
            // 这里的read()读取的数据会尽可能的填满整个数组

            // 如果文件内容不足以填满整个数组,此时返回的是实际长度
            // 然后继续接着读(已到末尾),返回-1  (就是代码这里的情况 4<20)

            // 如果读取完文件还有剩余(意味着数组被填满了, 就先返回实际长度)
            // 然后继续读,并且会覆盖之前数组的值
            // 直到文件读完了,就返回 -1

            int len = inputStream2.read(arr1);
            System.out.println("len : " + len);
            if (len == -1) {
                break;
            }
            // 读出来的放到arr1数组中
            for (int i = 0; i < len; i++) {
                System.out.printf("%x ", arr1[i]);
            }
            System.out.println();
        }
        System.out.println();

        while (true) {
            // 带有三个参数的read()
            byte[] arr2 = new byte[20];
            int off = 0;
            // 存到数组下标为off的位置,每次存 4 个
            int len = inputStream3.read(arr2, 0, 4);
            System.out.println("len : " + len);
            if (len ==  -1) {
                break;
            }
            for (int i = off; i < len; i++) {
                System.out.printf("%x ", arr2[i]);
            }
            System.out.println();
        }

        // 最后要关闭资源。否则会一直保存在pcb的文件资源描述符里
        // 另外close方法还可以把缓冲区里的数据冲刷到内存中,与flush方法效果一样
        inputStream.close();
        inputStream2.close();
        inputStream3.close();
    }
}


字节流写的过程

打开

使用构造方法打开

写+关闭

 此时文件的内容为

// 写文件
// 测试字节流
// OutPutStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class IODemo7 {

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

        // 打开方法于InPutStream一样     // OutputStream打开一个文件,默认会清空原先文件内容
        OutputStream outputStream = new FileOutputStream("D:/ATest/hello/haha.txt");

        // 从头写 ->  a
        outputStream.write(97);
        // a  -> abcd
        byte[] arr1 = {98, 99, 100};
        outputStream.write(arr1);
        // abcd -> abcdgh
        //              e    f    g    h    i
        byte[] arr2 = {101, 102, 103, 104, 105};
        // 从数组下标的2位置开始,写2个数据进去
        outputStream.write(arr2, 2, 2);
        
        // 最后记得关闭
        outputStream.close();

    }


}

若是不想清空原文件的内容,在构造方法上改一下即可。

// 写文件
// 测试字节流
// OutPutStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class IODemo8 {

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

        // true 表示在该文件内容后面追加写                      原内容:abcdgh
        OutputStream outputStream = new FileOutputStream("D:/ATest/hello/haha.txt", true);
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);

        outputStream.close();
    }

}


字符流(操作字符数据)

通过Reader和Writer来操作。(操作和InPutStream、OutPutStream基本完全一致);

// 读文件
// 测试字符流
// Reader

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

public class IODemo9 {

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

        // 和InPutStream一样                        内容:abcdghabc
        // 因为 关闭资源在某些情况下有可能执行不到,所以可以放到try里面,多个对象之间用 ; 隔开
        // try最后会自动关闭资源  比finally更方便一些
        // 之前写的代码也可以优化成这种写法
        try (Reader reader = new FileReader("D:/ATest/hello/haha.txt");
             Reader reader2 = new FileReader("D:/ATest/hello/haha.txt");
             Reader reader3 = new FileReader("D:/ATest/hello/haha.txt")){

            while (true) {
                int len = reader.read();
                if (len == -1) {
                    break;
                }
                System.out.printf("%c " ,(char)len);
            }
            System.out.println();
            System.out.println();

            while (true) {
                char[] arr1 = new char[20];
                int len = reader2.read(arr1);
                if (len == -1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c ", arr1[i]);
                }
                System.out.println();
            }
            System.out.println();

            while (true) {
                char[] arr2 = new char[20];
                int off = 3;
                int len = reader3.read(arr2, off, 9);
                System.out.println(len);
                if (len == -1) {
                    break;
                }
                for (int i = off; i < len; i++) {
                    System.out.printf("%c ", arr2[i]);
                }
            }
        }

    }

}

这里的写比字节流多了一些方法,可以追加写

// 写文件
// 测试字符流
// Writer

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class IODemo10 {

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

        // writer 会清空文件原内容写
        // writer2 会保留文件内容写
        try (Writer writer = new FileWriter("D:/ATest/hello/haha.txt");
             Writer writer2 = new FileWriter("D:/ATest/hello/haha.txt", true)){
            writer.write("writer写的");
            writer.append(" 用writer追加写的");
            writer2.write(" writer2写的");
            writer2.append(" 用writer2追加写的");
            // 写完要冲刷进去,防止留在缓冲区
            writer.flush();
            writer2.flush();
        }

    }

}


代码例子

删除文件

目标删除haha.docx

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class IODemo11 {

    public static void main(String[] args) {

        System.out.println("请输入根目录:");
        Scanner scanner = new Scanner(System.in);
        String rootName = scanner.next();
        File root = new File(rootName);
        if (!root.exists()) {
            System.out.println("没有此目录!");
            return;
        }

        System.out.println("请输入文件名字:");
        String name = scanner.next();
        // 把查到的文件放到list里
        // 有可能会有相同的文件名在不同的文件夹下面,或者名字相同属性不同
        List<File> files = new ArrayList<>();
        descFiles(root, name, files);
        for (File file: files) {
            System.out.println("确定要删除" + file.getPath() + " ?");
            String choice = scanner.next();
            if (choice.equals("Y") || choice.equals("y")) {
                file.delete();
                System.out.println("删除成功!");
            } else {
                System.out.println("取消删除!");
            }
        }
    }

    // root:根目录   name:要删除的文件名字   files:存储要删除文件的容器
    private static void descFiles(File root, String name, List<File> files) {
        // 文件是树的方式存储的,用递归查文件

        // 先列出root下所有的文件
        File[] file = root.listFiles();

        // 如果目录是空的,就返回
        if (file == null) {
            return;
        }

        // 不是空的就依次查
        for (File x : file) {
            // 如果是目录,就递归继续查
            if (x.isDirectory()) {
                descFiles(x, name, files);
            } else {
                // 不是目录就判断是否为要删除的文件
                if (x.getName().contains(name)) {
                    // 是就存到files
                    files.add(x);
                }
            }
        }
    }

}

复制文件

 

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

// 文件的复制
// 使用字节流复制
public class IODemo12 {

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

        // 源文件 + 源路径 --> 目标文件 + 目标路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入被复制的文件名字:");
        String srcName = scanner.next();
        System.out.println("请输入被复制文件的路径:");
        String srcPath = scanner.next();
        System.out.println("请输入复制目标路径:");
        String descPath = scanner.next();

        // 同一个文件不能复制到相同文件夹下(除非改名字)
        File descFile = new File(descPath, srcName);
        if (descFile.exists()) {
            System.out.println("要复制的文件已存在!无法复制!");
            return;
        }
        File srcFile = new File(srcPath, srcName);
        if (!srcFile.exists()) {
            System.out.println("被复制文件不存在!");
            return;
        }

        // 开始复制
        // 源文件读进来  写给目标文件
        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(descFile)) {
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    System.out.println("复制成功!");
                    break;
                }
                outputStream.write(b);
            }
        }

    }

}


有什么错误评论区指出。希望可以帮到你。 

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

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

相关文章

算法刷题-求素数、数据流的中位数、不同的二叉搜索树

求素数、数据流的中位数、不同的二叉搜索树求素数数据流的中位数不同的二叉搜索树求素数 求1-100内的素数&#xff1a; public static void main(String[] args){for(int i0;i<100;i) {checkPrime(i);}}private static void checkPrime(int x){boolean isPrime true;if(x…

nodejs+vue大学生提问论坛系统vscode

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面…

Linux-时间和日期、磁盘信息和进程信息

为了方便通过远程终端维护服务器时&#xff0c;查看服务器上当前系统日期和时间 /磁盘空间占用情况/程序执行情况&#xff0c;本节基本都是查询命令时间和日期datecal磁盘和目录空间dfdu进程信息pstopkill1.时间和日期序号命令作用01cal查看一个月日历&#xff0c; -y选项可以查…

consul集群解决单注册弊端

consul集群前面我们用consul注册发现服务&#xff0c;这里的弊端显而易见&#xff0c;单机版如果挂掉&#xff0c;就无法正常使用。consul的集群是复制模式&#xff0c;每个节点的信息一致。当其中一个挂掉&#xff0c;其他正常运行。consul官网建议最好是3个节点&#xff0c;其…

MyEclipse安装及需要进行的配置

安装&#xff1a;https://blog.csdn.net/qq_30764991/article/details/82531415?spm1001.2101.3001.6650.9&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-82531415-blog-126523828.pc_relevant_aa2&depth_1-utm_sou…

网络游戏与未来生存——谈一下不要因为认知不到位让孩子失去未来的机会

这个话题要从几个月前的一个事件谈起&#xff0c;先看看下面的截图&#xff1a;于是&#xff0c;那一天&#xff0c;各种阴谋论甚嚣尘上&#xff0c;大多数的话题都是直指腾讯&#xff0c;说腾讯的活动能力太强了。随后几天网上也是各种关于网络游戏毁掉孩子未来的说法和观点&a…

2022区块链投融资鸟瞰:总额超千亿元,数字货币坚挺,Web3叙事强劲

文/尹宁出品/陀螺研究院从整个区块链行业来看&#xff0c;2022年&#xff0c;在全球通胀与投资受限的环境下&#xff0c;资本圈与区块链之间可谓一波三折。在TMT、新消费、生物医药等赛道的各种消极表现下&#xff0c;年初Web3与元宇宙的横空出世正中资本下怀&#xff0c;a16z、…

c++ 快排思想

文章目录讲下思想时间复杂度优化代码实现讲下思想 我这边主要是分左右两边的指针寻找 left指针从左边寻找大于p的数 right 从右寻找小于p的数 然后找到进行交换&#xff0c;直到相遇在一起 说明这个位置是分隔的位置 而p的数就是分隔的数&#xff0c;所以对p和l进行一个…

什么都不会的应届生怎么找工作?

2023年&#xff0c;很多大学应届生都会面临到的一个问题&#xff1a;疫情三年上网课没有学到什么知识和技能&#xff0c;并且学习效果大多不理想&#xff1b;现在面临就业时对自身专业技能不自信&#xff0c;怀疑自己是否能找到工作&#xff0c;更别说是适合自己喜欢的工作。面…

Vue 3.2 源码系列:有点难的《最新 diff 算法详解》

本文首发自&#xff1a;稀土掘金、思否 博客代码已上传至github 点击这里 即可访问 另提供&#xff1a;完整代码&#xff08;tsrollup&#xff09;和视频教程 序 所谓算法指的是&#xff1a;把一种数据结构转化为另外一种数据结构的方法。 在runtime(运行时)阶段存在一个无论如…

内网渗透(四)之基础知识-搭建域环境

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以免造成看不懂的情况&#xff01;&#xff01; 搭建域环境 在…

DataX案例实操

1、DataX使用 1.1、DataX任务提交命令 DataX的使用十分简单&#xff0c;用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer&#xff0c;并将Reader和Writer的信息配置在一个json文件中&#xff0c;然后执行如下命令提交数据同步任务即可。 [songhadoop102 …

JavaScript 进阶5:WebAPI:DOM- 网页特效篇

JavaScript 进阶5&#xff1a;WebAPI&#xff1a;DOM- 网页特效篇 Date: January 28, 2023 Text: 轮播图高级版待解决 滚动事件、加载事件、元素大小和位置&#xff08;scroll、offset、client&#xff09;、轮播图案例 目标 能够制作常见的网页特效具备制作常见网页焦点图的…

WebRTC音频系统 之audio技术栈简介-1

文章目录第一章 WebRTC技术栈简介1.1 视频会议中常见的服务端架构1.2 WebRTC 网络协议栈1.3 WebRTC 源码目录结构1.4 client侧技术栈1.5 WebRTC native编译以及debug1.6 APM模块1.7 ADM模块WebRTC是Google开源的Web实时音视频通信框架&#xff0c;其提供P2P的音频、视频和一般数…

PTA---寒假温故知新作业

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;PTA学校题集 &#x1f4ac;总结&#xff1a;希望你看完之后&a…

Python Fiddler最新抓包工具教学:快速获取公众号(pc客户端)公开数据

嗨害大家好鸭~ 我是小熊猫 之前的Fiddler版本过期了&#xff0c;现在再来补上一个小案例 源码资料电子书:点击此处跳转文末名片获取 开发环境 - python 3.8 运行代码 - pycharm 2021.2 辅助敲代码 - requests第三方模块 - Fiddler 汉化版 抓包的工具 - 微信PC端 如何抓包 配置…

Python 初学者进阶的九大技能

Python是一种很棒的语言&#xff0c;语法简单&#xff0c;无需在代码中搜索分号。对于初学者来说&#xff0c;Python是入门最简单的语言之一。 Python有大量的库支持&#xff0c;你还可以安装其他库来增加自己的编程经验。 学了一阵子之后&#xff0c;你可能会觉得&#xff1…

成功解决使用yum安装的php版本过低的问题

文章目录前言一. 问题复现二. 问题分析三. 问题解决&#xff1a;四. 重要补充1. yum-config-manager介绍2. yum-uitls介绍3. remi资源库的介绍总结前言 大家好&#xff0c;我是沐风晓月。 日常学习过程经常会遇到一些奇奇怪怪的问题&#xff0c;为了把每个问题记录下来&#…

2023Facebook该如何养号?Facebook防封指南了解一下!

Facebook是大多数跨境电商卖家主攻的社交媒体平台&#xff0c;但也经常会有卖家抱怨&#xff0c;Facebook账号又无缘无故地被封了。Facebook是公认的非常容易被封&#xff0c;而新开的账号&#xff0c;不仅会导致前期的积累化为乌有&#xff0c;同时新账号被封的可能性也更高。…

python基于融合SPD-Conv改进yolov5与原生yolov5模型实践路面裂痕裂缝检测

SPD-Conv源于2022年一篇专门针对于小目标和低分辨率图像研究提出来的新技术&#xff0c;可以用于目标检测任务&#xff0c;能够一定程度提升模型的检测效果&#xff0c;今天正好有时间就想基于SPD融合yolov5s模型来开发路面裂痕裂缝检测模型&#xff0c;同时与原生的yolov5s模型…