Java中的文件操作

news2024/11/24 23:11:58

Java中通过java.io.File类对一个文件(包含目录)进行抽象的描述。注意有File对象,并不代表真实存在该文件。

1.File概述

我们先看看File类中的常见属性、构造方法和方法

1.1属性

修饰符及类型属性说明
static StringpathSeparator依赖系统的路径分隔符,String类型的表示
static charpathSeparator依赖系统的路径分隔符,char类型的表示

1.2构造方法

签名说明
File(File parent, String child)根据父目录+孩子文件路径,创建一个新的File示例
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径
File(String parent, String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录使用路径表示

1.3方法

修饰符及返回类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径                
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对的路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件。成功后返回true
booleandelete()根据File对象,删除该文件。
String[]list()返回File对象代表的目录下所有的文件名
File[]listFiles()返回File对象代表的目录下的所有文件
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果有必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以十位我们平时的剪切、粘贴操作
booleancanRean()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

1.4代码示例

示例一get系列的特点和差异

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

/**
 * Describe:获取文件的相关属性
 * User:lenovo
 * Date:2023-04-09
 * Time:16:51
 */
public class TestDemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("..\\hello-world.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 TestDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("hello-world.txt");//这里要求文件不存在
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile());
        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;

/**
 * Describe:普通文件的删除
 * User:lenovo
 * Date:2023-04-09
 * Time:17:12
 */
public class TestDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("some-file.txt");//要求文件不存在
        System.out.println(file.exists());
        System.out.println(file.createNewFile());
        System.out.println(file.exists());
        System.out.println(file.delete());
        System.out.println(file.exists());
    }
}

示例四观察目录的创建

public class TestDemo4 {
    public static void main(String[] args) {
        File dir = new File("some-dir");//要求目录不存在
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdir());
        System.out.println(dir.isDirectory());
    }
}

 

 【示例五创建多层目录

public class TestDemo5 {
    public static void main(String[] args) {
        File dir = new File("some-parent\\some-dir");//两个文件夹都必须不存在
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdirs());
        System.out.println(dir.isDirectory());
    }
}

示例六观察文件重命名

public class TestDemo6 {
    public static void main(String[] args) {
        File file = new File("some-parent.txt");//要求文件存在
        File dest = new File("dest.txt");//要求文件不存在
        System.out.println(file.exists());
        System.out.println(dest.exists());
        System.out.println(file.renameTo(dest));
        System.out.println(file.exists());
        System.out.println(dest.exists());
    }
}

2.文件内容的读写——数据流

2.1InputStream概述

【方法】

修饰符及返回类型方法签名说明
intread()读取一个字节的数据,返回-1代表已经完全读完了
intread(byte[] b)最多读取b.length字节的数据到b中,返回实际读到的数量;-1代表以及读完了
intread(byte[] b, int off, int len)最多读取len-off字节的数据到b中,放在从off开始,返回实际读到的数量;-1代表以及读完了
voidclose()关闭字节流

【说明】

InputStream只是一个抽象类,要使用还需要具体的实现类。关于InputStream的实现类有很多。基本可以认为不同的输入设备对应一个InputSteam类,我们现在只关心从文件中读取,所以使用FileInputStream

2.2FileInputStream概述

构造方法

签名说明
FileInputStream(File file)利用File构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

代码示例

示例一:文件的读取

将文件完全读取的两种方式。相比而言,后一种的IO次数更少,性能更好。

public class TestDemo7 {
    public static void main(String[] args) throws IOException {
        try(InputStream is = new FileInputStream("hello.txt")) {
            while (true) {
                int b = is.read();
                if (b == -1) {
                    break;//表示文件结束
                }
                System.out.printf("%c", b);
            }
        }
        System.out.println();
    }
}
public static void main(String[] args) throws IOException {
        try(InputStream is = new FileInputStream("hello.txt")) {
            byte[] buf = new byte[1024];
            int len;
            while(true) {
                len = is.read(buf);
                if(len == -1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", buf[i]);
                }
            }
        }
        System.out.println();
    }

示例二:读取文件中的中文

注意:写文件的时候使用的是UTF-8编码后长度刚好为3个字节和长度不超过1024字节的现状,但是这种方式并不是通用的

public class TestDemo8 {
    public static void main(String[] args) throws IOException {
        try(InputStream is = new FileInputStream("hello.txt")) {
            byte[] buf = new byte[1024];
            int len;
            while(true) {
                len = is.read(buf);
                if(len == -1) {
                    break;
                }
                for (int i = 0; i < len; i += 3) {
                    String s = new String(buf, i, 3, "UTF-8");
                    System.out.printf("%s", s);
                }
            }
            System.out.println();
        }
    }
}

2.3利用Scanner进行字符读取

在上述的例子中,我们发现对字符类型直接使用InputStream进行读取是非常麻烦且困难

。所以我们使用熟悉的类来完成该工作,就是Scanner类。

构造方法说明
Scanner(InputStream is, String charset)使用charset字符集进行is的扫描

示例一使用Scanner来读取文件

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

/**
 * Describe:使用Scanner来读取文件
 * User:lenovo
 * Date:2023-04-11
 * Time:10:27
 */
public class TestDemo9 {
    public static void main(String[] args) throws IOException{
        try(InputStream is = new FileInputStream("hello.txt")) {
            try(Scanner scanner = new Scanner(is, "UTF-8")) {
                while(scanner.hasNext()) {
                    String s = scanner.next();
                    System.out.print(s);
                }
            }
        }
        System.out.println();
    }
}

 2.4OutputStream概述

方法

返回类型方法签名说明
voidwrite(int b)写入要给的字节的数据
voidwrite(byte[] b)将b这个字符数组中的数据全部写入os中
intwrite(byte[] b, int off, int len)将b这个字符数组中从off开始的数据写到os中,一共len个
voidclose()关闭字节流
voidflush()重要:我们要知道I/O的速度是很慢的,所以,大多数的OutputStream为了减少操作的次数,在写数据的时候会将数据暂时的写到内存的指定区域里,直到该区域满了或者其他指定条件时才真正将数据写到设备中,这个区域一般称为缓冲区。但是这样造成了一个结果,就是我们写数据,很有可能遗留一部分在缓冲区中,需要在最后或者合适的位置,调用flush(刷新)操作,将数据刷新到设备中。

说明

OutputStream同样只是一个抽象类,要使用需要具体的实现类。我们现在还是只是关心写入文件中,所以使用FileOutputStream

2.5利用OutputStreamWriter进行字符写入

示例一使用write(int b)进行写入

public class TestDemo10 {
    public static void main(String[] args) throws IOException {
        try(OutputStream os = new FileOutputStream("output.txt")) {
            os.write('h');
            os.write('e');
            os.write('l');
            os.write('l');
            os.write('o');
            //一定要刷新缓冲区
            os.flush();
        }
    }
}

 【示例二】使用Write(byte[] b)进行写入

public static void main(String[] args) throws IOException{
        try(OutputStream os = new FileOutputStream("output.txt")) {
            byte[] b= new byte[] {'a', 'b', 'c', 'd', 'e'};
            os.write(b);
            os.flush();
        }
    }

 【示例三】使用write(byte b, int off, int len)进行写入

 public static void main(String[] args) throws IOException{
        try(OutputStream os = new FileOutputStream("output.txt")) {
            byte[] b = new byte[]{'*', 'n', 'i', ',', 'h', 'a', 'o'};
            os.write(b, 1, 6);
            os.flush();
        }
    }

2.6使用PrintWriter来写入

上述我们已经完成了输出工作,但是总是有所不方便,接下来我们将使用OutputStream处理一下,使用PrintWriter类完成输出。

PrintWriter类中提供了我们熟悉的print/println/printf方法

public class TestDemo11 {
    public static void main(String[] args) throws IOException{
        try(OutputStream os = new FileOutputStream("output.txt")) {
            try(OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {
                try(PrintWriter writer = new PrintWriter(osWriter)) {
                    writer.println("你好!");
                    writer.println("hello world!");
                    writer.flush();
                }
            }
        }
    }
}

 3.练习

3.1示例一

扫描指定目录,并找到名称中包含指定字符的所有文件(不包含目录),并且后序询问用户是否要删除该文件


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

/**
 * Describe:扫描指定目录,并找到名称中包含指定字符的所有文件(不包含目录),并且后序询问用户是否要删除该文件
 * User:lenovo
 * Date:2023-04-11
 * Time:13:53
 */
public class TestDemo12 {
    public static void main(String[] args) throws IOException{
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要扫描的根目录(绝对途径或相对路径):");
        String rootDirPath = scan.next();
        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()) {
            System.out.println("您输入的根目录不存在或者不是目录,退出");
            return;
        }
        System.out.println("请输入要找出的文件名中的字符:");
        String token = scan.next();
        List<File> result = new ArrayList<>();
        //因为文件系统是树型结构,所以我们使用深度优先遍历(递归)完成
        scanDir(rootDir, token, result);
        System.out.println("共找到了符合条件的文件" + result.size() + "个,它们分别是");
        for(File file : result) {
            System.out.println(file.getCanonicalPath() + "是否删除文件?y/n");
            String in = scan.next();
            if(in.toLowerCase().equals("y")) {
                file.delete();
            }
        }
    }
    private static void scanDir(File rootDir, String token, List<File> result) {
        File[] files = rootDir.listFiles();
        if(files == null || files.length == 0) {
            return;
        }

        for(File file : files){
            if(file.isDirectory()) {
                scanDir(file, token, result);
            }else {
                if(file.getName().contains(token)) {
                    result.add(file.getAbsoluteFile());
                }
            }
        }
    }
}

3.2示例二

进行普通文件的复制

import java.util.Scanner;
import java.io.*;
/**
 * Describe:普通文件的复制
 * User:lenovo
 * Date:2023-04-11
 * Time:14:12
 */
public class TestDemo13 {
    public static void main(String[] args) throws IOException{
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要复制的文件(绝对路径或相对路径):");
        String sourcePath = scan.nextLine();
        File sourceFile =new File(sourcePath);
        if(!sourceFile.exists()) {
            System.out.println("文件不存在,退出");
            return;
        }
        if(!sourceFile.isFile()) {
            System.out.println("文件不是普通文件,退出");
            return;
        }
        System.out.println("请输入要复制到的目标路径(绝对路径或相对路径):");
        String destPath = scan.nextLine();
        File destFile = new File(destPath);
        if(destFile.exists()) {
            if(destFile.isDirectory()) {
                System.out.println("目标路径已经存在,并且是一个目录,退出");
                return;
            }
        }
        try(InputStream is = new FileInputStream(sourceFile)) {
            try(OutputStream os = new FileOutputStream(destFile)) {
                byte[] buf = new byte[1024];
                int len;
                while(true) {
                    len = is.read(buf);
                    if(len == -1) {
                        break;
                    }
                    os.write(buf, 0, len);
                }
                os.flush();
            }
        }
        System.out.println("复制完成");
    }
}

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

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

相关文章

利用ffmpeg源码安装+vscode开发环境搭建详解

前言&#xff1a; 大家好&#xff0c;今天给大家分享一篇ffmpeg开发环境的搭建&#xff0c;我在很早之前也给搭建过ffmpeg源码的安装&#xff0c;但是并没有给大家去搭建开发环境&#xff0c;而且当时的版本也比较老&#xff0c;很多细节问题没有给大家展示如何解决&#xff01…

win11破解以开启多用户同时登陆

1、简述 背景就是有一台电脑&#xff0c;windows11的专业版&#xff0c;上面有一套软件&#xff0c;但是这台电脑还有人需要用。电脑配置还不错&#xff0c;所以就想在创建一个账户&#xff0c;让需要用那套软件的人远程登陆使用。 步骤还不少&#xff0c;有一丢丢啰嗦。 2、首…

IP-GUARD如何通过设备管控策略单独禁用或启用笔记本插SD卡?

sd卡可以通过外置读卡器或者笔记本自带的sd卡槽进行插入使用,我们可以通过设备控制策略禁止sd插入的设备来实现控制; 在控制台-策略-设备控制: 动作:禁止/允许 设备描述:读卡器的设备描述(查看方法参考问题 2 ) 读卡器的描述信息可以在控制面板-设备管理中,usb相关的设…

springcloud-openFeign简单梳理

OpenFeign openFeign是springcloud中&#xff0c;服务间进行调用的常用方式。了解它&#xff0c;可以更好的处理服务间调用问题。 EnableFeignClients Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Documented Import(FeignClientsRegistrar.class) public …

LTC6268-10 4GHz 超低偏置电流 FET 输入运算放大器

LTC6268-10是一个运算放大器 具有低输入偏置电流和低输入电容。它还具有低输入参考电流噪声和电压噪声。这使得它成为高速跨组放大器和高阻抗传感器放大电路的理想选择。其为去补偿型运放&#xff0c;具有数值为 10 的稳定增益。 该器件工作在 3.1V 至 5.25V 电源&#xff0c;每…

Android View的坐标获取详解以及动画坐标分析

1、介绍 在平面图形中&#xff0c;图形都是由点坐标确定的。同样&#xff0c;Android的设备屏幕也是一个&#xff0c;如果非3D图形&#xff0c;正常的view就是一个二维坐标 参考View屏幕的左上角的坐标A(0,0),如果屏幕的宽为:width,高&#xff1a;height 那么右下角的坐标是D(…

【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小

目录 一&#xff0c;函数清单 1.Direct3DCreate9 函数 2.IDirect3D9::CreateDevice 方法 3.IDirect3DDevice9::GetDisplayMode 方法 4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法 5.IDirect3DDevice9::GetFrontBufferData 方法 6.IDirect3DDevice9::D3DXLoadS…

Zookeeper工作原理

一 Zookeeper是什么 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易…

【Spring】我抄袭了Spring,手写一套MySpring框架。。。

这篇博客实现了一个简单版本的Spring&#xff0c;主要包括Spring的Ioc和Aop功能 文章目录这篇博客实现了一个简单版本的Spring&#xff0c;主要包括Spring的Ioc和Aop功能&#x1f680;ComponentScan注解✈️Component注解&#x1f681;在spring中ioc容器的类是ApplicationConte…

迅为4412开发板Qt 界面切换

本节通过实验介绍通过创建窗口对象的方式实现界面切换&#xff1a; 步骤一&#xff1a; 在主界面 ui 文件添加 pushButton 按钮&#xff0c; 然后新建一个窗口&#xff0c;工程下创建新的 Qt 设计师界面类&#xff0c;如图 &#xff1a; 我们选择 Widget&#xff0c;用户可以根…

logstash+elasticsearch+Kibana(ELK)日志收集

文章目录一.安装elasticsearch二. 安装kibana三.配置logstash四.springboot整合logstash五.spring整合Elastic Search六. 定时清理不要一股脑执行以下语句,请观察修改要修改的地方 注意给logstash,elasticsearch,kibana释放端口,云服务器提供商和系统的端口 一.安装elasticsea…

为什么许多人吐槽C++11,那些语法值得我们学习呢?

致前行的人&#xff1a; 人生像攀登一座山&#xff0c;而找寻出路&#xff0c;却是一种学习的过程&#xff0c;我们应当在这过程中&#xff0c;学习稳定冷静&#xff0c;学习如何从慌乱中找到生机。 目录 1.C11简介 2.统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 …

linux-php 7.3.2安装

1.下载php wget http://am1.php.net/distributions/php-7.3.2.tar.gz 2.解压 tar -zxvf php-7.3.2.tar.gz 3.安装扩展 接下来进行参数配置&#xff0c;配置前如果没有libxml2和libxml2-devel会报错&#xff0c;所以应该更新libxml2并安装libxml2-devel&#xff0c;使用在线…

SpringBoot 项目整合 Redis 教程详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Android Init(后期还会更加完善)

代码分析基于android-12.0.0_r28 前期阶段 kernel/init/main.c&#xff1a; static int __ref kernel_init(void *unused) {// ...省略一堆代码if (execute_command) {ret run_init_process(execute_command);if (!ret)return 0;panic("Requested init %s failed (err…

八百字讲清楚——BCEWithLogitsLoss二分类损失函数

BCEWithLogitsLoss是一种用于二分类问题的损失函数&#xff0c;它将Sigmoid函数和二元交叉熵损失结合在一起。 假设我们有一个大小为NNN的二分类问题&#xff0c;其中每个样本xix_ixi​有一个二元标签yi∈0,1y_i\in {0,1}yi​∈0,1&#xff0c;并且我们希望预测每个样本的概率…

RCNN系列发展历程

1. RCNN RCNN发表于CVPR 2014。是将深度学习应用于目标检测领域的开山之作&#xff0c;凭借卷积神经网络较之传统CV方法的强大特征提取能力&#xff0c;将PASCAL VOC数据集检测率从35.1%提升到53.7%。 RCNN的算法流程如下图所示&#xff0c;其过程主要分为4步&#xff1a; 生成…

Ubuntu中隐藏Apache的版本号等信息

Ubuntu中隐藏Apache的版本号等信息 vim /etc/apache2/apache2.conf在apache主配置文件的末尾增加以下内容&#xff1a; ServerTokens Prod ServerSignature offServerTokens&#xff1a; 默认阀值为Full&#xff0c;以apache-2.0.55为例&#xff0c;阀值可以设定为以下某项&a…

【完整项目开发】Springboot+jsp宠物医院信息管理系统设计和实现--依旧很干

Springbootvue宠物医院信息管理系统设计和实现 **大家好&#xff0c;今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式&#xff0c;如需定制系统&#xff0c;需求发来&#xff0c;我为你分忧&#xff0c;搞起 一、 项目介绍 宠物医院信息管理系统是一种…

香港轻量云服务器安全性如何?

​  之前&#xff0c;对于新手外贸站长而言&#xff0c;部署网站首要青睐是香港虚拟主机。但大多人也都清楚&#xff0c;每台香港虚拟主机的资源是由一台物理机分割来的。这无疑会带来一定的安全隐患&#xff0c;比如分割出来的多台香港虚拟主机会共用传统的系统、管理面板以…