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,一经查实,立即删除!

相关文章

电路中VCC VDD VSS VEE GND的含义

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

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

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

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

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

swift 页面跳转

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

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

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

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

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

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

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

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

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

Git(6)——GitHub

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

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

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

华为云HECS安装docker并安装mysql

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

AI绘图提示词Stable Diffusion Prompt 笔记

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

LLM预训练之RLHF(一):RLHF及其变种

在ChatGPT引领的大型语言模型时代,国内外的大模型呈现爆发式发展,尤其是以年初的LLaMA模型为首的开源大模型和最近百川智能的baichuan模型,但无一例外,都使用了「基于人类反馈的强化学习」(RLHF)来提升语言…

7.代理模式

1.UML 2.代码 #include <iostream> using namespace std;class Subject{ public:virtual void Request() 0; };class RealSubject:public Subject { public:virtual void Request(){cout << "RealSubject" << endl;} }; class Proxy:public Subj…

【结构型】代理模式(Proxy)

目录 代理模式(Proxy)适用场景代理模式实例代码&#xff08;Java&#xff09; 代理模式(Proxy) 为其他对象提供一种代理以控制对这个对象的访问。Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。 适用场景 远程代理 (Remote Proxy) 为一个对象在不同…

【Git】03-GitHub

文章目录 1. GitHub核心功能2. GitHub搜索项目3. GitHub搭建个人博客4. 团队项目创建5. git工作流选择5.1 需要考虑的因素5.2 主干开发5.2 Git Flow5.3 GitHub Flow5.4 GitLab Flow(带生产分支)5.4 GitLab Flow(带环境分支)5.4 GitLab Flow(带发布分支) 6. 分支集成策略7. 启用…

redis桌面连接工具Another Redis Desktop Manager使用介绍

Another Redis Desktop Manager是一种类似于navicat的数据库连接工具&#xff0c;专门用来连接redis&#xff0c;使用起来非常简单方便&#xff0c;在这里推荐给大家。 没有用过这个软件的&#xff0c;首先通过下面的网盘链接下载Another Redis Desktop Manager 百度网盘redi…

权限提升WIN篇(腾讯云,CS,MSF)

溢出漏洞 信息收集 操作系统版本ver&#xff0c;systeminfo漏洞补丁信息systeminfo操作系统位数systeminfo杀软防护tasklist /svc网络netstat -ano,ipconfig当前权限whoami 筛选EXP 根据前面的信息收集中的系统版本&#xff0c;位数和补丁情况筛选出合适的EXP 提权 根据EX…

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;这里记录一下设置的代码。 一、pubspec.yaml设置flutter_localizations 在pubspec.yaml中设置flutter_l…

程序员必须掌握的算法

引言 作为一名程序员&#xff0c;掌握一些重要的算法是必不可少的。算法是解决问题的方法和步骤&#xff0c;对于程序员来说&#xff0c;熟悉和掌握一些常见的算法可以提高编程能力&#xff0c;解决复杂的计算问题。与此同时&#xff0c;算法是计算机科学中的核心概念&#xff…