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

news/2023/12/10 15:42:54

前言

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


https://dhexx.cn/news/show-5071621.html

相关文章

Linux系统编程6(线程互斥,锁,同步,生产消费模型)

上篇文章介绍完线程的概念后,我们将在这篇文章中初步探讨线程编程以及线程应用中的问题,这篇文章将以抢票系统为例,贯穿整篇文章。笔者将介绍在多线程编程中会出现的问题,什么是同步?什么是互斥?为什么多线…

虚拟化技术:深入浅出

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

react-route的路由

React-Router是一个基于React的强大路由库,它可以帮助我们在React应用中实现页面之间的跳转和路由管理。本文将详细介绍React-Router的路由功能、常用功能模块、路由传参和路由嵌套,并提供相关代码和解释。 路由功能 React-Router通过管理URL和组件的映…

Vue3 ~

变动 实例 const app new Vue({}) Vue.use() Vue.mixin() Vue.component() Vue.directive()const app Vue.createApp({}) app.use() app.mixin() app.component() app.directive()createApp 代替 new Vue 允许多个根标签 createStore 代替 Vue.use(Vuex) createRouter 代替…

以数据为中心的安全市场快速增长

根据Adroit Market Research的数据,2021年全球以数据为中心的安全市场规模估计为27.6亿美元,预计到2030年将增长至393.48亿美元,2021年至2030年的复合年增长率为30.9%。 研究人员表示,以数据为中心的安全强调保护数据本身&#x…

DMNet复现(一)之数据准备篇:Density map guided object detection in aerial image

一、生成密度图 密度图标签生成 采用以下代码,生成训练集密度图gt: import cv2 import glob import h5py import scipy import pickle import numpy as np from PIL import Image from itertools import islice from tqdm import tqdm from matplotli…

【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小-基础样例】

【QT5-解决不同分辨率屏幕-进行匹配大小-适应屏幕大小】 1、前言2、实验环境3-1、问题说明-屏幕视频3-2、解决方式-个人总结解决思路:我们在软件启动的时候,先获取屏幕大小,然后根据长宽,按照一定比例,重新设置大小。并…

如何下载安装 WampServer 并结合 cpolar 内网穿透,轻松实现对本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…

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

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

数字虚拟人制作简明指南

如何在线创建虚拟人? 虚拟人,也称为数字化身、虚拟助理或虚拟代理,是一种可以通过各种在线平台与用户进行逼真交互的人工智能人。 在线创建虚拟人变得越来越流行,因为它为个人和企业带来了许多好处。 推荐:用 NSDT编辑…