File类知识梳理(包含输入输出流的使用)

news2024/11/15 21:43:20

前言 

学习的思维导图

 

目录

1. File类是什么?

2. 关于文件系统的操作

3. 关于文件内容的操作

3.1 文本文件

3.2 二进制文件

4. 案例实现练习

5.拓展:try with resources 操作


1. File类是什么?

      ● 概念

         它的实例化对象是对硬盘上文件或目录的抽象表示.文件存储在硬盘上,我们如果直接去操作会很不方便,所以我们可以在内存中创建对应对象,然后通过操作该对象去间接影响硬盘上的文件.在java语言中,我们可以通过如下方式抽象化表示某个路径下的某个文件.它的父类和实现接口如下:

      ● 示例代码

        System.out.println("请输入要扫描的指定目录:>");
        Scanner s = new Scanner(System.in); //可以是当前项目下的相对路径,也可以是绝对路径
        String dir = s.nextLine();
        File file = new File(dir);

2. 关于文件系统的操作

       这里不介绍所有操作,只介绍常用操作,大家先看这个图:

① 这是我本地用于测试的目录:

②  具体练习代码:

public class FileTest2 {
    public static void main(String[] args) throws IOException {
        File f = new File("E:\\比特就业课\\Java\\io测试目录");
        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(f.exists());
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
        //原地创建一个由该抽象路径名命名的新的空文件
        //如果命名文件已经存在返回false,不存在创建新文件并返回true
        System.out.println(f.createNewFile());
        File f2 = new File("E:\\比特就业课\\Java\\io测试目录\\test222.txt");
        System.out.println(f2.delete());
        File testF = new File("E:\\测试单个目录创建");
        System.out.println(testF.mkdir());
        File testF2 = new File("E:\\测试多个目录创建\\direct1\\direct2");
        System.out.println(testF2.mkdirs());
        String[] content = f.list();
        assert content != null;
        for (String item:content) {
            System.out.print(item + " ");
        }
        System.out.println();
        File[] content2 = f.listFiles();
        assert content2 != null;
        for (File item:content2) {
            System.out.print(item.getName() + " ");
        }
        System.out.println();
        System.out.println(f.renameTo(testF));
    }
}

③ 执行结果:

 注:当前测试目录并不在项目路径底下.


3. 关于文件内容的操作

3.1 文本文件

         文本文件是基于字符编码的文件,常见的编码有ASCII编码,Unicode编码等等.这里先给大家引入一个"流"的概念,可以将它想象成水管,流中流动的不是水,而是字节序列.从流中读取一个字节序列的对象称为输入流,向流中写入一个字节序列的对象称为输出流.而流又可以分为两类,一个是字节流(处理基本单位是字节),另一个是字符流(处理基本单位是字符).

         我们通常使用字符流来处理文本数据,Java中对应的字符流基本抽象类为Reader和Writer,它们的直接子类是InputStreamReader,OutputStreamWriter.但是一般我们实例化的是它们的间接子类:

FileReader和FileWriter.下面我们来练习一下文本文件的读取和写入吧~测试文本文件内容如下:

         ● 示例代码

        File f = new File("E:\\某个目录\\Java\\io测试目录\\test222.txt");
        //读数据
        try (Reader reader = new FileReader(f)){
            StringBuilder stringBuilder = new StringBuilder();
            while (true) {
                int ret = reader.read();
                if (ret == -1) break; //文件读取到末尾
                stringBuilder.append((char) ret);
            }
            System.out.println(stringBuilder.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //写数据
        try (Writer writer = new FileWriter(f)){
            StringBuilder stringBuilder = new StringBuilder("早安,全世界");
            writer.write(stringBuilder.toString()); //也可以一个字符一个字符的写
        } catch (IOException e) {
            e.printStackTrace();
        }

         ● 执行结果

   

 

注:不同的编码格式,一个字符所占的字节大小不一样.

3.2 二进制文件

         二进制文件是基于值编码的文件,没有字符集限制,什么都能存.

         我们通常使用字节流来处理二进制数据,Java中对应的字符流基本抽象类为InputStream和OutputStream,它们的直接子类是FileInputStream,FileOutputStream.因为二进制文件我们是难以看懂的,为了方便我们看懂,下面我们使用字节流来处理一下文本文件内容分析一下,测试文本文件内容如下:

         ● 示例代码

        File f = new File("E:\\比特就业课\\Java\\io测试目录\\test222.txt");
        //读数据(二进制)
        try (InputStream inputStream = new FileInputStream(f)){
            while (true) {
                int ret = inputStream.read();
                if (ret == -1) break;
                System.out.print((char)ret + " "); //得到的字符集十进制值转换成字符
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //写数据(二进制)
        try (OutputStream outputStream = new FileOutputStream(f)){
            byte[] data = new byte[1024];
            byte b = 65;
            for (int i = 0; i < 26; i++) {
                data[i] = b;
                b++;
            }
            outputStream.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }

         ● 执行结果

         大家可能就有疑问了,我的文本内容明明是HELLO WORLD为什么读出来是这些数字,认真看这些数字,大家会发现这些是对应字符的ASCII码值,因为字节流处理的基本单位是字节.如果文本内容是中文,那么就会根据对应的字符集编码,得到一个汉字多少个字节,假设一个汉字是2个字节,那么输出的就是对应字符编码的十进制数值.

        我们将得到的结果转成字符型,那么得到的就是我们想要的效果了(写也是类似):

        此时文本文件中显示的对应ASCII的字符.

注:文件的打开,使用完毕后,一定要进行关闭,不然会导致文件资源一直被占用.


4. 案例实现练习

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

● 具体思路:

   ① 得到给定的目录及所需查找的内容.

   ② 递归遍历给定目录的子目录.

   ③ 得到子目录下的所有内容,如果是文件就获取它的内容,目录就继续递归遍历.其它类型的内容我们暂时不做考虑.

● 实现代码:

public class FileTest {
    public static void main(String[] args) {
        //扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
        System.out.println("请输入要扫描的指定目录:>");
        Scanner s = new Scanner(System.in);
        String dir = s.nextLine();
        File file = new File(dir);
        if(!file.isDirectory()) {
            System.out.println("目录不存在");
            return;
        }

        //要查找的内容
        System.out.println("请输入要查找的内容>");
        String search = s.nextLine();
        //递归遍历子目录
        recurFile(file,search);
    }

    private static void recurFile(File file, String search) {
        File[] files = file.listFiles();
        if(files == null) {
            return;
        }
        for (File item : files) {
//            System.out.println(file.getAbsoluteFile());
            if(item.isFile()) {
                //获得文件的内容
                String ret = getContent(item);
                if(ret.contains(search)) {
                    System.out.println(item.getAbsoluteFile() + " " + ret);
                }
            } else if(item.isDirectory()) {
                recurFile(item,search);
            } else {
                continue;
            }
        }
    }

    private static String getContent(File file) {
        StringBuilder str = new StringBuilder();
        try (Reader inputStream = new FileReader(file)){
            int ret;
            while (true) {
                ret = inputStream.read();
                if(ret == -1) break;
                str.append((char) ret);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str.toString();
    }
}

注:这里采用递归扫描方式并不高效,目的只是单纯熟悉文件操作.


5.拓展:try with resources 操作

     try with resources操作是带有资源释放的try操作,不过一定是要实现了Closeable接口的类.因为Reader,Writer,InputStream,OutputStream类都实现了Closeable接口,所以才可以通过try with resources操作进行资源的自动释放.


分享完毕~

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

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

相关文章

【Java实战篇】Day15.在线教育网课平台--持续集成

文章目录 一、Devops1、什么是Devops2、什么是CI/CD3、Devops方案参考 二、人工部署1、项目打jar包2、生成镜像、创建容器 三、自动化部署1、代码提交到git2、修改pom.xml文件3、前端部署 一、Devops 1、什么是Devops 一个软件的生命周期包括&#xff1a;需求分析阶、设计、开…

如何利用AI技术提升拍卖小程序开发的用户体验

作为一名拍卖小程序开发者&#xff0c;提供一个优质的用户体验&#xff0c;以吸引更多的用户是我们的目标。然而&#xff0c;如何实现这一目标呢&#xff1f;在本文中&#xff0c;我们将介绍如何利用AI技术来提升拍卖小程序开发的用户体验。 了解用户需求 在开始开发拍卖小程…

centos测试主机网络极限速度

在CentOS主机上测试极限带宽&#xff0c;可以使用iperf工具进行测试,需要两台同一网络的主机 1.安装iperf工具 yum -y install iperf 2.启动iperf服务器 iperf -s 3.启动iperf客户端 iperf -c 10.1.60.118 通过以上输出可以看到 TCP window size&#xff1a;表示TCP窗口大…

Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)

一、前言 本功能最初也是有一些人提过类似的需求&#xff0c;就是能不能将本地的音视频文件&#xff0c;通过纯Qt程序推流出去&#xff0c;然后用户可以直接在网页上播放&#xff0c;也可以用各种播放器播放&#xff0c;然后还可以任意切换播放进度&#xff0c;其实说白了就是…

炼石参编《2022网信自主创新调研报告》正式发布|附下载

2023年4月19日&#xff0c;“第六届关键信息基础设施自主安全创新论坛-暨纪念‘419’讲话发表七周年活动”隆重召开&#xff0c;网信自主创新调研报告编委会在论坛上正式发布《2022网信自主创新调研报告》&#xff08;以下简称《报告》&#xff09;。《报告》秉持脚踏实地、实事…

APQP开发流程术语及定义

APQP流程 : 概念批准->项目批准->A样设计->B样设计开发->C样设计开发->小批生产及过程验证->量产 A 样件 是指产品的基本概念体现&#xff0c;虚拟产品设计开发&#xff0c; 主要为了得到主机厂的初步确认。处于手工件阶段的产品定义为A样件。 B 样件 是指具…

如何查看OpenAI的api-key?

如何查看OpenAI的api-key&#xff1f; 记录一下如何查看 OpenAI的 api-key 文章目录 如何查看OpenAI的api-key&#xff1f;前提具体操作 前提 作为ChatGPT的开发商&#xff0c;OpenAI为开发者提供了API&#xff0c;使得开发者能在自己的应用程序中调用OpenAI的相关服务。本文…

外网域名访问tomcat服务器上项目并且通过域名路径访问图片接口

今天给大家阐述如何在工作中&#xff0c;利用外网进行访问服务器的项目以及文件图片。 通过域名的形式进行公网访问&#xff1a;如&#xff1a;www.xxxxxx.com访问网站&#xff0c;www.xxxxxx.com/image/upload.png 访问服务器上的网络图片 一&#xff1a;主要就是部署修改服…

将gitbub下载的docker-compose项目运行在docker

目录 一.从github上下载代码到本地 1.通过github指令获取 2.通过zip的方式直接把包下载到本地 3.区别 二.在代码包找到docker-compose.yml文件 1.如果官网有提示路径可以直接在文件夹找到这个文件 2.使用开发软件打开项目查看(可用软件搜索yml) 3.知识补充&#xff08;yml文件编…

GRACE mascon数据下载链接汇总

一直有粉丝询问我数据下载的问题&#xff0c;这里我将汇总三大GRACE Mascon数据的下载链接&#xff0c;以及基础的数据处理方法。 首先&#xff0c;GRACE Mascon数据包含有三大机构&#xff0c;分别是CSR、JPL和GSFC&#xff08;注意不是GFZ&#xff09;。 1.CSR mascon 下载…

使用FFMPEG库封装264视频和acc音频数据到MP4文件中

准备 ffmepeg 4.4 一段H264的视频文件 一段acc格式的音频文件 封装流程 1.使用avformat_open_input分别打开视频和音频文件&#xff0c;初始化其AVFormatContext&#xff0c;使用avformat_find_stream_info获取编码器基本信息 2.使用avformat_alloc_output_context2初始化…

前端04-CSS三大特性

三大特性&#xff1a;层叠性、继承性、优先级 层叠性 相同选择器设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式&#xff0c;层叠性主要解决样式冲突的问题。 —>哪个样式离结构近&#xff0c;就执行哪个样式 继承性 子标…

面试(一)

String、StringBuffer、StringBuilder区别 string 类中使用 final关键字字符数组保存字符串&#xff0c;所以 String 对象是不可变的。而StringBuilder 与 StringBufer 也是使用字符数组保存字符 char[]value 但是没有用 final 关键字修饰&#xff0c;所以这两种对象都是可变…

2023性价比高的台灯测评哪些好一点?性价比高的台灯推荐

我们知道现代社会近视的人非常多&#xff0c;而且呈低龄化发展&#xff0c;如果不能在近视之后保证科学的用眼&#xff0c;那视力也会变得越来越差。选择好台灯也是保护视力的一个方面&#xff0c;有很多台灯实际上含有蓝光&#xff0c;它对视网膜有一定伤害性&#xff0c;护眼…

gRPC---TLS实现

文章目录 1.首先通过openssl生成证书和私钥2.配置环境变量3.命令行测试 openssl4. 生成证书5. 更改openssl.cfg6.7.服务端代码8.客户端代码 1.首先通过openssl生成证书和私钥 https://slproweb.com/products/Win32OpenSSL.html 2.配置环境变量 3.命令行测试 openssl 4. 生成…

UEStudio v2023 Crack应用程序脚本更新

UEStudio v2023 Crack应用程序脚本更新 添加了现代JavaScript支持和完整的浏览器功能。 默认情况下添加了传统的JavaScript支持&#xff0c;以实现完全的向后兼容性。 可对接的Microsoft PowerShell终端 添加了可停靠窗口&#xff0c;可以作为浮动窗口放置在任何位置&#…

java学习之枚举

目录 一、枚举引出 二、分析问题 三、 解决方案-枚举 四、枚举的二种实现方式 五、应用案例 六、小结 一、枚举引出 package enum_;public class Enumeration01 {public static void main(String[] args) {Season spring new Season("春天", "温暖")…

工具链和其他-Web服务器和实例caddy

目录 web服务器介绍 web服务器需要哪些能力&#xff1f;以caddy为例 web server&#xff08;用户发请求它返回网页&#xff09; 代理&#xff08;proxy&#xff09; 缓存&#xff08;cache&#xff09; 日志&#xff08;logging&#xff09; API网关&#xff08;api gatewa…

机器视觉实用工具集NO.18——使用YOLO8实时检测物体,性能爆棚

目录 前言安装YOLO8安装YOLO8的模型程序源代码总结 前言 安装了pytorch框架以后&#xff0c;就可以玩一些开源的深度学习框架了&#xff0c;比如YOLO8&#xff0c;是基于pytorch框架的&#xff0c;关于如何安装pytorch框架&#xff0c;可以参考上篇文章链接《pytorch深度学习框…

我看看哪个靓仔还没把Github Copilot用起来?

本人经常分享有价值的生产力工具、技术、好物与书籍&#xff0c;可关注同名公众&#x1f42d;并设为&#x1f31f;星标&#xff0c;第一时间获得更新 Github Copilot 是一个AI编程助手&#xff0c;其使用 OpenAI CodeX 在你的编辑器中实时建议代码或给你实现整个功能。 视频版介…