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

前言

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);elseSystem.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开始索引、转换的个数rSystem.out.print(new String(bytes,0,r));}}

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


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

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

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

相关文章

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测

目录 前言 国内外研究现状 CAN 总线异常检测存在的问题 车载网络信息安全问题分析

电路中VCC VDD VSS VEE GND的含义

在电路中,芯片引脚经常会出现VCC,VDD,VSS,VEE和GND这些标示。 其中VCC一般表示通用芯片的电源引脚,比如一些模拟运放的正电源引脚,74系列数字芯片的电源引脚,VCC一般接相应的正电源电压。 VDD一…

php7.4编译安装,及重要的拓展库

1、下载tar文件 wget https://www.php.net/distributions/php-7.4.16.tar.gz2、解压php7.4 并进入php7.4文件夹 3、重点编译安装,编译完整的配置并安装 ./configure --prefix/usr/local/php --enable-fpm \ --disable-debug \ --disable-iconv \ --disable-rpa…

若依注解学习(一)@Log

Log 涉及到: Log,LogAspect,SecurityUtils,SysUser,SysOperLog,BusinessStatus,StringUtils,ServletUtils AsyncManager,AsyncFactory&#xff…

Mock数据:单元测试中的心灵鸡汤

在当今的软件开发领域,质量控制已经成为了一个不可或缺的环节。为了确保软件的稳定性和可靠性,开发者们投入了大量的时间和精力进行各种测试。其中,单元测试作为最基础的测试方法,其重要性不言而喻。然而,单元测试中的…

用于视觉检测的线扫远心镜头VS-LTC系列

VS-LTC 系列线扫远心镜头,近期已经新增 3.5倍及5倍型号 ,支持大靶面芯片相机;适用于半导体,基板以及 Mini LED等行业的视觉检测。 在机器视觉产品资料查询平台,了解更多VS-LTC工业镜头的信息。 大靶面线扫远心镜头 …

ArrayBlockingQueue 带有三个参数的构造函数为何需要加锁?

哪一个构造函数 public ArrayBlockingQueue(int capacity, boolean fair,Collection<? extends E> c) {this(capacity, fair);final ReentrantLock lock = this.lock;lock.lock(); // Lock only for visibility, not mutual exclusiontry {final Object[] items = this…

swift 页面跳转

segue 故事板的屏幕之间导航 设置全局变量 退回操作 Optionals ??

vue项目打包_以生产环境prod模式打包_vue-cli-service 不是内部或外部命令,也不是可运行的程序---vue工作笔记0025

打开命令行: 首先执行npm install 不执行会报错: npm run build:prod --scripts-prepend-node-pathauto 然后再这样执行就是以生产环境模式打包了.

【React + Ant Design】表单如何在前置项未填写时禁止后置项交互并提示

在 react antd 中&#xff0c;对表单做在前置项未填写时禁用后置项交互并提示的效果。 情景 最近有这么个需求&#xff0c;某个业务中&#xff0c;要填写一张表单&#xff0c;其中有这样两项&#xff1a;选择数据连接和选择数据表&#xff0c;数据表是数据连接下所拥有的表。…

lv5 嵌入式开发-2 exec函数族

目录 1 进程 – exec函数族 1.1 exec函数族特点 1.2 进程 – execl / execlp使用方法 1.3 进程 – execv / execvp 2 进程 – system 3 exec族要点演示 掌握&#xff1a;exec函数族、system 1 进程 – exec函数族 执行程序&#xff0c;通孔ps -elf发现&#xff0c;父进…

【数据结构】二叉树链式结构的实现(三)

目录 一&#xff0c;二叉树的链式结构 二&#xff0c;二叉链的接口实现 1&#xff0c;二叉链的创建 2&#xff0c;接口函数 3&#xff0c;动态创立新结点 4&#xff0c;创建二叉树 5&#xff0c;前序遍历 6&#xff0c;中序遍历 7&#xff0c;后序遍历 三&#xff0c;结点个…

【Python】自动化办公之路:word自动化实战宝典!

文章目录 前言一、环境安装二、使用步骤1.引入库2.读入数据 Python-docx 编辑已存在文档win32com 将 doc 转为 docxwin32com 操作 word总结 前言 使用Python操作word大部分情况都是写操作&#xff0c;也有少许情况会用到读操作&#xff0c;在本次教程中都会进行讲解&#xff0…

Git(6)——GitHub

目录 一、简介 二、概要 三、注册 ​四、创建仓库 五、推送本地代码 六、拉取远端代码 一、简介 在Git&#xff08;5&#xff09;中&#xff0c;我们已经对Git分支的概念和用法有了一定了解&#xff0c;对于在本地进行代码版本管理&#xff0c;其实当前所学的东西基本已经…

C语言生成随机数、C++11按分布生成随机数学习

C语言生成随机数 如果只要产生随机数而不需要设定范围的话&#xff0c;只要用rand()就可以&#xff1b;rand()会返回一随机数值, 范围在0至RAND_MAX 间&#xff1b;RAND_MAX定义在stdlib.h, 其值为2147483647&#xff1b; 如果想要获取在一定范围内的数的话&#xff0c;直接做…

关于header in Cpp

ctype.h是一个header in Cpp, 什么是header&#xff1f; 在C中&#xff0c;头文件&#xff08;header file&#xff09;是一种用于包含预定义函数、变量和声明的文件。头文件通常具有.h扩展名&#xff0c;并包含了用于在C程序中使用的函数原型、常量定义、类声明等信息。头文…

Golang笔试题:编写一个函数,接收一个整数参数n,输出n的阶乘结果

今天&#xff0c;我们开发的AI笔试题工具&#xff0c;ai扁食——AI程序员笔试系统给我出了中级Golang题目&#xff0c;就是这道题&#xff1a;《请编写一个函数&#xff0c;接收一个整数参数n&#xff0c;输出n的阶乘结果》&#xff0c;希望我写一个函数&#xff0c;输出n的阶乘…

华为云HECS安装docker并安装mysql

1、运行安装指令 yum install docker都选择y&#xff0c;直到安装成功 2、查看是否安装成功 运行版本查看指令&#xff0c;显示docker版本&#xff0c;证明安装成功 docker --version 3、启用并运行docker 3.1启用docker指令 systemctl enable docker 3.2 运行docker指令…

AI绘图提示词Stable Diffusion Prompt 笔记

基础 提示词分为正向提示词&#xff08;positive prompt&#xff09;和反向提示词&#xff08;negative prompt&#xff09;&#xff0c;用来告诉AI哪些需要&#xff0c;哪些不需要词缀的权重默认值都是1&#xff0c;从左到右依次减弱&#xff0c;权重会影响画面生成结果。AI …

gRPC之gRPC流

1、gRPC流 从其名称可以理解&#xff0c;流就是持续不断的传输。有一些业务场景请求或者响应的数据量比较大&#xff0c;不适合使用普通的 RPC 调用通过一次请求-响应处理&#xff0c;一方面是考虑数据量大对请求响应时间的影响&#xff0c;另一方面业务场景的设计不一 定需…