[文件操作] File 类的用法和 InputStream, OutputStream 的用法
能吃是不是件幸福的事呢
文章目录
- 前言
- 1. 文件的相关定义
- 2. 文件类型
- 3. Java对文件系统的操作
- 3.1 对文件的基础操作
- 3.2 读文件
- 3.3 写文件
前言
从这章开始,我们就开始学文件操作相关的知识了~
1. 文件的相关定义
1.文件的定义可以从狭义和广义两个方面解释.
狭义: 指硬盘上的文件和目录(目录指文件夹)
广义: 在操作系统中,把很多的硬件设备和软件资源都抽象成文件,按文件的方式统一管理.
2.盘符
如D盘,C盘,用d: c: 表示,不区分大小写.
3.路径
绝对路径,就是电脑中文件的位置.如下图,双击箭头处,能获取到文件的绝对路径.
F:\Java初阶练习\LinkedList

相对路径: 以当下目录为基准,以" . “或者” … “开头,例如当下目录为F: ,则可以用”./Java初阶练习"代表Java初阶练习.
2. 文件类型
文件类型分为文本文件和二进制文件.
文本文件存的是文本,以字符串的方式存储.
二进制文件可以存任何类型的数据.
如何判断一个文件是文本文件还是二进制文件呢?
一个文件右键,以记事本方式打开,如果显示是乱码,则是二进制文件.
3. Java对文件系统的操作
3.1 对文件的基础操作
1.文件对象的创建
我们使用File类的构造方法,给要创建的文件指定一个路径.如下代码,f0就是在相应路径下的文件。
File f0 = new File("d:/file1.txt");
获取文件名 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.isFile());
执行结果如下(file不存在)

2.创建目录
//创建目录
File dir = new File("./test");dir.mkdir();
//创建多级目录
File dir2 = new File("./test/aaa");dir2.mkdirs();
3.文件重命名
如下代码,给f1重命名,将dest的名字付给f1.
File f1 = new File("./test/aaa");File dest = new File("./test/AAA");f1.renameTo(dest);

3.2 读文件
读出来的字节用b接收,如果b为-1,则说明文件读取完毕.
用read()方法进行读取,这个方法有三种形式,无参,传数组,传数组的固定部分.
下面的代码是无参的形式
InputStream in0 = new FileInputStream("d:/file1.txt");while(true){int b = in0.read();if(b == -1){ //b == -1,代表文件读取完毕break;}System.out.printf("%x\n",(byte)b);}in0.close();
执行结果如下,因为以字节形式显示,所以对应ASCII码表,这四个代表字符a,b,c,d.


以数组形式读取,把文件读到数组里.
注意,循环里的len显示的是数组真实被填写的长度.
InputStream in1 = new FileInputStream("d:/file1.txt");int len = 0;while(true){//一次读取1024个字节byte[] b = new byte[1024];len = in1.read(b);if(len == -1){break;}for(int i = 0; i < len; i++){System.out.printf("%x\n", b[i]);}}in1.close();
//读取部分元素,0表示从数组0下标开始读,1表示读取1个元素.
InputStream in1 = new FileInputStream("d:/file1.txt");int len = 0;//一次读取1024个字节byte[] b = new byte[1024];len = in1.read(b, 0, 1);for (int i = 0; i < len; i++) {System.out.printf("%x\n", b[i]);}in1.close();
3.3 写文件
写文件用write方法写,同样有三种形式,直接写,以数组形式写,把数组的部分元素写进文件.
1.直接把元素写进去,可以直接用字符表示,也可以用ASCII码表示.
注意flush()方法,我们写文件时,电脑不会写一个存一个,是先把元素存到缓冲区,直到缓冲区满了或者到了指定时刻,才会真正把缓冲区里的数据一次性转到硬盘上,提高效率.
注意,我们这里不用写close(),自己关闭文件了,把代码放进try()里,文件写完会自动关闭.
try (OutputStream o = new FileOutputStream("d:/file1.txt")) {o.write('h');o.write(98);o.write(99);o.write(100);o.flush();}
以数组形式写入
try(OutputStream o1 = new FileOutputStream("F:/Write.txt")) {//直接把全部数组元素写入byte[] b = new byte[]{(byte) 'h', (byte) 'a', (byte) 'b'};o1.write(b);//从0开始写,写1个元素o1.write(b,0,1);//把字符串转成byte数组写入String s = "i am warm";byte[] b1 = s.getBytes();o1.write(b1);String s1 = "我是坏人";byte[] b2 = s1.getBytes("utf-8");o1.write(b2);o1.flush();}
2.用printWriter写入.
用printWriter可以用print之类的方法写文件.
try( OutputStream o2 = new FileOutputStream("f:/PrintWrite.txt")) {OutputStreamWriter osw = new OutputStreamWriter(o2, "utf-8");PrintWriter pw = new PrintWriter(osw);pw.print("mind");pw.println("bb");pw.printf("%d %s", 1, "hh");pw.flush();}
执行结果如下

本文完
相关文章:
[文件操作] File 类的用法和 InputStream, OutputStream 的用法
能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…...
索莫菲模型的一些理解 Smomerfeld Model
如何解释传统热容算出来的数值与量子模型下的区别? 因为只有费米能附近的电子才能够进行移动,这个是问题的差别所在 我们下面就来介绍如何求费米能(费米能的计算) 既然费米能附近的电子很重要,那么附近的电子有多少很…...
SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查
在SAP/ERP项目的实施中采购管理模块(MM)的创建和修改采购申请一般都会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,这方面需求部分是可以通过配置实现,比如一些字段是否必输,是否显示等&…...
STM32C0介绍(1)----概述
概述 STM32C0系列微控制器是意法半导体公司推出的一款低功耗、高性能的微控制器产品。它们被设计用于需要小型、低功耗和高度可集成的应用程序,如传感器、消费品、电池供电设备、家庭自动化和安全等应用。该系列的微控制器采用ARM Cortex-M0内核,具有丰…...
windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之一
by fanxiushu 2023-03-01 转载或引用请注明原始作者。这个话题可能有点老,UEFI BIOS 已经大量存在,而Legacy BIOS最终会被取代。但是也是作为无盘启动技术里不可或缺的,毕竟还有许多老型号的电脑存在,而且为了兼容性,有…...
mysql实现if语句判断功能的六种使用形式
文章目录 前言一、ifnull函数二、nullif函数三、if函数四、if语句(多用于存储过程)五、if-else语句(多用于存储过程)六、if-elseif-else语句(多用于存储过程)总结前言 在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,函数的好处是可以作为sql的一…...
在Vue3这样子写页面更快更高效
前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1ÿ…...
做软件测试,如何才能实现月入20K?
听我的,测试想要月入20k。 首先你要去大厂,不在大厂起码也得在一线城市,北上广深。 二线城市的话成都、杭州最好。 不然的话想都不要想。 像我之前整理过成都的公司,除了字节跳动、蚂蚁金服、滴滴、美团、京东、平安、字节跳动…...
mysql last lesson
1:创建用户 create user zhang identified by 12345678;2:给用户授权,撤销授权, grant.......to revoke ....... 3:将数据库中的数据导出 C:\Windows\system32>mysqldump bjpowernode>C:\bjpowernode.sql -uroot -p12345678 4&#…...
一、Redis入门概述(是什么,能干嘛,去哪下,怎么玩)
一. redis是什么? Redis:REmote Dictionary Server(远程字典服务器)官方解释: Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构ÿ…...
(六十二)当我们在SQL里进行分组的时候,如何才能使用索引?
今天我们接着上次的内容来谈谈在SQL语句里假设你要是用到了group by分组语句的话是否可以用上索引,因为大家都知道,有时候我们会想要做一个group by把数据分组接着用count sum之类的聚合函数做一个聚合统计。 那假设你要是走一个类似select count(*) fr…...
python字符串练习
python字符串练习 1.去掉字符串中所有的空格 s This is a demo print(s.replace( , )) 2.获取字符串中数字的个数 data input("请输入一些字符串:") a 0 for i in data:if i.isdigit():a a 1 print("数字个数:", a)3.将字母全部转换为…...
Java-封装、继承、多态
封装 访问控制权限又成为“封装”,是面向对象三大特征中的一种。核心是,只对需要的类可见。 继承 继承是所有OOP(Object Oriented Programming)语言和Java语言都不可或缺的一部分。 只要创建一个类,就隐式继承自Obje…...
问题三十二:离散二维傅立叶变换(Discrete Fourier Transformation)
为了将灰度图像表示为频谱图,我们需要进行以下步骤: 加载图像并将其转换为灰度图像。对图像进行二维离散傅里叶变换。将变换结果表示为幅度谱和相位谱。可以对幅度谱和相位谱进行可视化,以查看频率分布。对幅度谱和相位谱进行逆变换…...
恢复谷歌翻译的究极方法
谷歌翻译为什么会失效,我想各位在去年11月的时候就知道了。可是要怎么解决失效的问题呢?之前我们是通过手动Ping可以连接的ip各位可能觉得麻烦,心里觉得什么档次还要我手动ping就没有可以自动扫描的吗?还别说真的有我最近发现一个…...
string函数以及string常用接口
本文介绍的是C关键字string中一些重要用法,以及各种字符串序列的处理操作 ——飘飘何所似,天地一沙鸥 文章目录前言一、string(字符串类)二、string类对象的容量操作2.1 size/length2.2 capacity2.3 empty/clear2.4 resize/reser…...
分享一篇由C语言实现《数据结构》无头无循环单链表
三月,你好,各位csdn uu们好 文章目录前言一、何为单链表二、单链表基本操作(增,删,查,改,销毁,遍历)1.查找与修改、销毁与遍历2.链表插入与删除操作三、单链表 VS 顺序表…...
C盘爆满?两个超简单的解决办法
我们在使用电脑的过程中,经常容易出现C盘爆红,反而其他盘还有大量可用空间的情况。为什么会这样呢?其实主要就两种原因:一是电脑使用习惯不好,不管什么软件都默认安装在C盘,大文件又喜欢放在桌面࿰…...
ThreadLocal
ThreadLocalThreadLocalMapgetsetremove内存泄漏key用强/弱引用entry继承了弱引用ThreadLocal 一个对象的所有线程会共享其全局变量——>线程不安全 解决方式: 方式一:同步机制,加锁(时间换空间) 方式二:…...
Java基础:JDK7-时间Date
JDK7以前时间相关类 1.Date Date date new Date(); , sout(date)得到的是现在所处位置的时间 Date date new Date(0L); , sout(date)得到的是时间原点也就是1970年1月1日08:00(东八区). date.setTime(1000L); sout(date)得到的是时间原点后一秒钟的时间 long time date.g…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
