Java基础入门·对存储文件File的相关操作

news2024/11/25 10:43:59

前言

File类获取的方法

getName() | getPath()

 File getAbsoluteFile() | File getParentFile()

long length()

File类遍历方法

 IO流对象的分类

1.按照操作的文件类型分类

2.按照数据的流向分类

IO流对象的分类归纳

 OutputStream

字节输出流写入文件的步骤

 追加写入

FileInputStream


前言

我们之前进行Java基础入门学习时,都或多或少得遇到与get有关的方法,看它的名字就知道,带有此字样的方法,一般都是进行“获取”的操作

而今天我们就从File类获取开始,一步步学习

IO对象  字节输出流  字节输入流  字节缓冲流  转换流  打印流


File类获取的方法

File getAbsoluteFile()                 获取绝对路径,返回值是File类型

File getParentFile()                    获取父路径,返回值是File类型

String getName()                       获取名字,File构造方法中的路径名字

String getPath()                         获取File构造方法中的路径,完整的路径转成String返回

long length()                              获取文件的字节数

getName() | getPath()

 这里边 getName()和getPath()比较简单,代码格式与上一篇Java基础入门·File类的使用类似,感兴趣的小伙伴可以点击链接或者进入我的博客主页查看

public static void fileMethod1(){
        File file = new File("D:\\code\\Java");
        String name = file.getName();
        System.out.println("name = " + name);
        String path = file.getPath();
        System.out.println("path = " + path);
    }

 这里的返回值是路径的最后一个字符串,即“Java”,后面是文件,就返回文件名,是文件夹,就返回文件夹名

 getPath则是直接把构造参数D:\\code\\Java转成字符串(没有太大意义)

我们使用file.toString效果也是一样的


 File getAbsoluteFile() | File getParentFile()

File getAbsoluteFile()是获取绝对路径,我们一开始使用的就是绝对路径,所以输出结果没有发生任何变化

public static void fileMethod2(){
        File file = new File("D:\\code\\Java.exe");
        File absoluteFile = file.getAbsoluteFile();
        System.out.println("absoluteFile = " + absoluteFile);

    }

但当我们直接写一个文件名时,会默认在此目录下寻找该文件,若指定前面的父路径,,则结果可能又会不一样

File file = new File("Java.exe");

File file = new File("day8.8/Java.exe");
第一句的输出结果
第二句的输出结果

 getParentFile()用于获取父路径,返回的是一个file对象,所以我们仍可以对其进行多次 getParentFile()的操作

public static void fileMethod2(){
        File file = new File("D:\\code\\Java\\day18\\Java.exe");
        File absoluteFile = file.getAbsoluteFile();
        System.out.println("absoluteFile = " + absoluteFile);
        File parentFile = file.getParentFile();
        System.out.println("parentFile = " + parentFile);
    }

多次操作后,可见返回的是文件的父路径的父路径的父路径······

但一定不能超过盘符找父路径,否则会返回null

File parentFile = file.getParentFile().getParentFile().getParentFile();


long length()

获取文件的字节数

long length = file.length();
System.out.println("length = " + length);

File类遍历方法

listFiles()遍历目录,把该路径下的文件全部存入File数组里,我们对其进行遍历,就可以看到它把所以子路径都进行了存储

public static void fileMethod(){
        File file = new File("D:\\code\\Java\\day18");
        File[] files = file.listFiles();

        for(File f:files){
            System.out.println(f);
        }
    }

 我们知道,文件夹里还有可能会有其他文件夹,当我们需要用到里面的文件路径时,还可以进行更深入的递归遍历,把目录下的所有文件的全路径都存储起来

实现这个方法也很容易,首先把方法改为传参,以便传入子文件夹才能进行下一步遍历,for循环里加一个文件夹判断,然后递归即可

public static void main(String[] args) {
        //直接在此处new对象
        fileMethod(new File("D:\\code\\Java\\day18"));
    }

    //此处传参,便于递归遍历子文件夹再次调用
    public static void fileMethod(File dir){
        File[] files = dir.listFiles();
        for(File f:files){
            if(f.isDirectory())
                fileMethod(f);
            else
            System.out.println(f);
        }
    }

此处代码修改:

当代码运行后,我们可以看到控制台输出全部都是文件的路径,那如果要输出文件夹的路径,该怎么实现,我们只需要在遍历开始前,输出一遍就好 ,在这句代码前

File[] files = dir.listFiles();

加一句输出语句,大功告成

System.out.println(dir);


IO流对象

IO:Input Output IO的作用是将数据从一个设备中流入到另一个设备

数据文件,从磁盘中流向内存中,从磁盘中流向移动存储设备,从一台计算机流向另一台计算机

一切都是字节:任何数据文件都是字节组成,字节是计算机中最小存储单元(例如音乐、游戏、电影)

我们入门先了解什么输入输出

从Java程序里把数据存进文件中为:  输出

从文件中读取数据加载内存中为:      输入


 IO流对象的分类

1.按照操作的文件类型分类

文本类型文件     ——选择流对象字符流

什么是文本文件:使用文本工具:记事本,notepad++等等,打开文件后人类可以直接阅读的文件

非文本类型文件  ——选择流对象字节流

word文件是非文本文件

2.按照数据的流向分类

输入流:Java程序从其他地方读取数据

输出流:Java程序中的数据,写入到其他地方


IO流对象的分类归纳

四大抽象类 

字节输出流:OutputStream 抽象类(最高父类)

字节输入流:InputStream 抽象类(最高父类)

字符输出流:Writer 抽象类 (最高父类)

字符输入流:Reader抽象类 (最高父类)


 OutputStream

Java.io.OutputStream是所有字节输出流的超类:可以写入任何类型的文件

写入字节的方法write

void write(int b)                                                写入单个字节

void write(byte[] b)                                           写入字节数组

void write(byte[] b,int off,int len)                       写入数组的一部分,开始索引,写入的个数

FileOutputStream

构造方法:FileOutputStream(File file)

构造方法:FileOutputStream(String file)

创建字节输出流对象,绑定参数就是要写入的数据目的

IO流对象使用完毕后要释放资源


字节输出流写入文件的步骤

创建字节输出流对象,构造方法中,绑定文件路径,写入目的

调用流对象的方法write写入数据

释放资源

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

    public static void writeByte() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt");
        fileOutputStream.write(100);
        fileOutputStream.close();
    }

绑定的文件路径为1.txt,如果没有该文件,则自己创建,有,则覆盖里面的数据

下面的代码是写入字符串数组

public static void writeArray() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt");
        byte[] bytes = {97,98,99,100};
        fileOutputStream.write(bytes);
        fileOutputStream.write("good,well,nice".getBytes());
        fileOutputStream.close();
    }

 追加写入

 敲代码时可能已经想到了,存储文件数据,不能永远覆盖重来,每一次都是新的数据,旧数据丢失就没意义了,那想续接在后面怎么办:FileOutputStream第二个参数写true

 还有换行写入:Windows换行符号  \r  \n 

public static void writeAppend() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\1.txt",true);
        fileOutputStream.write("\r\n".getBytes());
        fileOutputStream.write("99,100,101".getBytes());
        fileOutputStream.close();
    }

Java.io.InputStream是所有字节输入流的超类:可以读取任何类型的文件

FileInputStream

构造方法:FileInputStream(File file)

构造方法:FileInputStream(String file)

创建字节输入流对象,绑定数据源文件

读取字节的方法read 

void read(int b)                                                读取单个字节

void read(byte[] b)                                           读取字节数组

 读取单个字节

public static void ReadByte() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        int r = fileInputStream.read();
        System.out.println("r = " + r);
    }

read方法可以多次调用,每多调用一次就往后多读一个字节,读取到末尾时返回-1

这里出现了重复的代码,所以我们可以使用循环来遍历文件中所有字节

public static void ReadByte() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        int r = 0;
        while ((r = fileInputStream.read())!=-1){
            System.out.print((char)r);
        }

    }

读取字节数组,可以一次读取多个字节,但也和上面一样,每多一次调用,就会往后读取直到末尾返回-1

public static void ReadArray() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        byte[] bytes = new byte[5];
        //定义变量保存read方法的返回值
        int r = 0;
        r = fileInputStream.read(bytes);
        System.out.println("r = " + r);
        //数组转字符串
        System.out.println(new String(bytes));
    }

 增加了循环,修改String参数后的代码,读取多少个r,就转换r个,保证后面不出现上一次循环遗留的字符

public static void ReadArray() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        byte[] bytes = new byte[2];
        //定义变量保存read方法的返回值
        int r = 0;
        while ((r = fileInputStream.read(bytes))!=-1){
            //此处增加String开始索引、转换的个数r
            System.out.print(new String(bytes,0,r));
        }
    }

tips:数组大小一般推荐设置1024的整数倍  byte[] bytes = new byte[1024];


今天的Java文章分享就到此结束了, 喜欢的小伙伴记得一键三连,点赞收藏评论,如果想了解更多内容,可以用未来百万富豪的手指,点点小小的关注!你们的支持就是我最大的动力!

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

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

相关文章

迅为iTOP-RK3568开发板Sobel 算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\32”目录下,如下图所示: Sobel (索贝尔)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检…

计算机专业毕业设计项目推荐07-科研成果管理系统(JavaSpringBoot+Vue+Mysql)

科研成果管理系统(JavaSpringBootVueMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…

寄存器与内存详解

目录 CPU、寄存器、内存之间的关系 寄存器 通用寄存器 EAX寄存器 EBX寄存器 ECX寄存器 EDX寄存器 EBP寄存器 ESP寄存器 ESI寄存器 EDI寄存器 总结 段寄存器 分段内存管理机制 段与段寄存器 指令指针寄存器EIP 标志寄存器 内存 虚拟内存 大端存储与小端存储…

大数据Flink(八十三):SQL语法的DML:With、SELECT WHERE、SELECT DISTINCT 子句

文章目录 SQL语法的DML:With、SELECT & WHERE、SELECT DISTINCT 子句 一、DML:With 子句

使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)

Elasticsearchkibana下载安装 docker pull elasticsearch:7.16.2docker run --name es -d -e ES_JAVA_OPTS“-Xms512m -Xmx512m” -e “discovery.typesingle-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.16.2docker pull kibana:7.16.2docker run --name kibana -e EL…

IntelliJ IDEA使用——常用快捷键(Windows版)

文章目录 版本说明搜索操作层级关系查看光标选择代码定位代码操作Git操作编辑器操作 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2(下载IntelliJ IDEA) ps:不同版本一些图标和设置位置可能会存在差异,但应该大部分都差不多。…

【LLM工程篇】deepspeed | Megatron-LM | fasttransformer

note 当前比较主流的一些分布式计算框架 DeepSpeed、Megatron 等,都在降低显存方面做了很多优化工作,比如:量化、模型切分、混合精度计算、Memory Offload 等 文章目录 note大模型参数计算1. 模型参数单位2. 训练显存计算3. 推理显存计算 大…

nodejs中的错误类型及捕获处理

nodejs中的错误类型及捕获处理 在 node 中,提供了 error 模块,并且内置了标准的 JavaScript 错误,本文将介绍在node中错误类型以及如何捕获。 错误类型 js错误 标准的js错误,跟在浏览器中运行js时提示的错误类型一样 RangeEr…

Linux 遍历目录(cd 命令)

Linux 遍历目录(cd 命令) 文章目录 Linux 遍历目录(cd 命令)一、cd 命令二、绝对文件路径三、相对文件路径 一、cd 命令 在 Linux 文件系统上,可以使用 cd 命令将 shell 会话切换到另一个目录。cd 命令的格式也很简单…

C++---多态

多态 前言多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变(基类与派生类虚函数返回值类型不同)析构函数的重写 override和final 虚函数的默认参数 抽象基类 前言 在买火车票的时候,如果你是学生,是买半价票&#…

8年经验之谈 —— App测试常用的两种工具

一、监控工具 DDMS的全称是Dalvik Debug Monitor Service ,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。 启动DDMS Eclipse中启…

某上市企业RFID资产管理设计解决方案

背景简介 该客户是一家集金融业务、房地产开发、商业地产等多元业务于一体的大型企业集团,作为一个拥有大量固定资产的企业,该客户一直以来面临着资产管理的难题,为了提高资产管理效率,降低管理成本,选择了广东航连科…

Python运算符、函数与模块和程序控制结构

给我家憨憨写的python教程 ——雁丘 Python运算符、函数与模块和程序控制结构 关于本专栏一 运算符1.1 位运算符1.1.1 按位取反1.1.2 按位与1.1.3 按位或1.1.4 按位异或1.1.5 左移位 1.2 关系运算符1.3 运算顺序1.4 运算方向 二 函数与模块2.1 内建函数2.2 库函数2.2.1 标准库…

elk日志某个时间节点突然搜索不到了

elk日志某个时间节点突然搜索不到了,检查filebeat正常 Kibana手动上传数据: 响应: Error: Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [2000]/[2000] maximum shards open 原因:ElasticSearch总分片数量导致的异常,ES…

语言建模的发展阶段以及大规模语言模型的背景介绍

语言本质上是一个由语法规则控制的复杂、精密的人类表达系统,开发能够理解和掌握语言的AI 算法是一个重大挑战。作为一种主要方法,语言建模在过去两十年中已被广泛研究,从统计语言模型发展到神经语言模型,用于语言理解和生成。从技…

服务网格和性能优化:介绍如何通过服务网格提高微服务架构的性能和可扩展性

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

竹云董事长董宁受邀出席香港第三届湾区元宇宙大会暨AIGC、RWA发展高峰论坛并作主题演讲

“一元初分,宇宙万仪”。9月16日,第三届湾区元宇宙大会暨AIGC、RWA发展高峰论坛在香港圆满落幕。全球权威机构、顶级专家学者、杰出企业家代表齐聚一堂,畅所欲言,全面总结分析元宇宙现状,综合研判元宇宙未来发展趋势。…

DJYOS开源往事二:DJYOS开源工作室时期

2010年,罗侍田、王建忠等人在南山科技园创建都江堰操作系统工作室。通过自有资金、网友赞助资源等各种形式,从2010年开始建立了一支全职的民间组织的国产操作系统开发者团队。

vite构建的本地开发环境请求第三方接口时如何解决跨域问题

前言 在vite构建的本地开发环境中,请求第三方接口时如何解决跨域问题呢? 本地开发环境,只要请求接口,如果没有做代理配置,都会存在同源策略,跨域的问题,要么在本地做代理,要么在服务器做代理,要么在请求头中设置允许跨域,下面我们来介绍下如何解决vite构…