File类和IO流

我是南城余!阿里云开发者平台专家博士证书获得者!

欢迎关注我的博客!一同成长!

一名从事运维开发的worker,记录分享学习。

专注于AI,运维开发,windows Linux 系统领域的分享!

本章节对应知识库

File类和IO流 (yuque.com) 


尚硅谷_宋红康_IO流.pptx

小tips(科普):

为什么创建文件对象时,文件即使不存在物理磁盘,也不会报错

因为仅在Java层面创建了一个Java对象,并未对此进行读写操作,不然则会进行报错

在Java中,当使用File类来代表一个文件时,如果该文件在文件系统中不存在,创建File对象并不会立即触发文件系统的访问,因此不会引发任何异常。

File类代表了文件系统中的路径名,它可以作为文件或目录的抽象表示。当你创建一个File对象时,它只是在Java程序中创建了一个对象,并没有要求这个文件一定要存在。

只有当你在对文件进行读取、写入或者执行其他与文件系统相关的操作时,才会真正触发对文件的访问。比如调用File对象的`exists()`方法或者创建文件输入输出流进行读写操作,才会触发文件系统的访问。

当你调用File对象的某些方法时,如`delete()`、`createNewFile()`等,才会导致对文件系统的操作,如果文件确实不存在或者无法创建,则会抛出相应的异常。

因此,创建File对象并不会立即检查文件是否存在,所以不会在创建File对象时就报错。而是在进行实际的文件操作时,才会根据文件系统的状态来决定是否出现异常。

为啥Windows的文件层次关系用\表示,而Linux用/

这涉及到历史和设计上的考虑。

起初,这种区别是源于不同操作系统的发展历史。在早期的操作系统中,这种文件层次结构的表示方式并不统一。后来,Unix系统引入了正斜杠(`/`)作为目录分隔符,这在当时可以被看作是一项创新。而在DOS和Windows中,则使用了反斜杠(`\`)来表示目录分隔符。

这种差异在很大程度上也反映了不同系统设计者的个人喜好和初衷。虽然在很多方面这两种表示方式都能够很好地满足文件系统的需要,但是由于历史原因,这种区别就一直延续至今。

此外,正斜杠和反斜杠在计算机中都有特殊的含义,正斜杠在Unix/Linux系统中用于表示命令行参数的选项,因此在路径表示时避免了歧义;而反斜杠在Windows中被用来表示转义序列,如`\n`表示换行等。

总的来说,这种区别在很大程度上是由操作系统设计者和历史发展决定的,尽管在一些跨平台的软件中会进行统一处理,但是在文件系统层面,这种差异基本上已经深入人心,难以改变。


File类

》File类位于java.io包下,本章涉及的相关流也都声明在此包下

》File类的一个对象,对应与操作系统下的一个文件或文件目录下

》File类声明了新建、删除、获取名称、重命名等方法,并没有涉及到文件内容的读写操作。要想实现文件内容的读写,需要使用io流

》File类的对象,通常是作为io流操作的端点出现的

》代码层面,将File类的对象作为参数传递到IO流相关类的构造器中。

IO流

IO流的分类

》流向的不同:输入流、输出流

》处理单位的不同:字节流、字符流

》流的角色不同:节点流、处理流

基础IO流的框架

抽象基类 4个节点流(也称文件流) 4个缓冲流

InputStream FileInputStream BufferedInputStream

OutputStream FileOutputStream BufferOutStream

Reader FileReader BufferReader

Writer FileWriter BufferWriter

FileWriter\FileReader的使用

执行步骤

》创建读取或写出的File类的对象

》创建输入输出流

》具体的读入或写出的过程

读入:read(char[] cbuffer)

写入:write(String str) / write(char[] cbuffer,0,len)

》关闭流资源,避免内存泄漏

注意点

》因为涉及流资源的关闭操作,所以出现异常的话,需要try-catch-finally的方式来处理异常

》对于输入流来讲,要求File类的对象对应的物理磁盘的文件必须存在。否则,会报FileNotFoundException

对于输出流来讲,File类的对象对应的物理磁盘文件可以不存在

》如果此文件不存在,则在输出的过程中,会自动创建此对象,并写出数据到此文件中

》如果此文件存在,使用FileWriter(File file)或FileWriter(File file,false):

输出数据过程中,会新建同名的文件对现有文件进行覆盖

FileWriter(File file,true):输出数据过程中,会在现有文件的末尾追加 写出内容

public class FWWrite {//注意:应该使用try-catch-finally处理异常。这里出于方便阅读代码,使用了throws的方式@Testpublic void test01()throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter(new File("fw.txt"));// 写出数据fw.write(97); // 写出第1个字符fw.write('b'); // 写出第2个字符fw.write('C'); // 写出第3个字符fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。//关闭资源fw.close();}//注意:应该使用try-catch-finally处理异常。这里出于方便阅读代码,使用了throws的方式@Testpublic void test02()throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter(new File("fw.txt"));// 字符串转换为字节数组char[] chars = "尚硅谷".toCharArray();// 写出字符数组fw.write(chars); // 尚硅谷// 写出从索引1开始,2个字符。fw.write(chars,1,2); // 硅谷// 关闭资源fw.close();}//注意:应该使用try-catch-finally处理异常。这里出于方便阅读代码,使用了throws的方式@Testpublic void test03()throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter("fw.txt");// 字符串String msg = "尚硅谷";// 写出字符数组fw.write(msg); //尚硅谷// 写出从索引1开始,2个字符。fw.write(msg,1,2);	// 硅谷// 关闭资源fw.close();}@Testpublic void test04(){FileWriter fw = null;try {//1. 创建File的对象File file = new File("personinfo.txt");//2. 创建FileWriter的对象,将File对象作为参数传递到FileWriter的构造器中//如果输出的文件已存在,则会对现有的文件进行覆盖fw = new FileWriter(file);
//            fw = new FileWriter(file,false);//如果输出的文件已存在,则会在现有的文件末尾写入数据
//            fw = new FileWriter(file,true);//3. 调用相关的方法,实现数据的写出操作//write(String str) / write(char[] cbuf)fw.write("I love you,");fw.write("you love him.");fw.write("so sad".toCharArray());} catch (IOException e) {e.printStackTrace();} finally {//4. 关闭资源,避免内存泄漏try {if (fw != null)fw.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}
FileInputStream\FileOutStream的使用

执行步骤

》创建读取或写出的File类的对象

》创建输入输出流

》具体的读入或写出的过程

读入:read(byte[] buffer)

写入:write(byte[] buffer,0,len)

》关闭流资源,避免内存泄漏

注意点

》对于字符流,只能用来操作文本文件,不能用来处理非文本文件

》对于字节流,通常用来处理非文本文件。但是,如果涉及到文本的复制,也可以使用字节流

说明:

文本文件:.txt、.java、.c、.ccp等

非文本文件:.doc、.xls、.jpg、mp3等

缓冲流

作用:文件比较大时,提升文件读写效率。

转换流

字符编码:字符、字符串、字符数组——》字节、字节数组(看的懂——》看不懂)

字符解码:字节、字节数组——》字符、字符串、字符数组(看不懂——》看的懂)

程序在读取文本文件时,不希望乱码,需要考虑

解码时使用的字符集必须与当初编码使用的字符集相同

作用:实现字节与字符间的转换

API:

InputStreamReader:将一个输入型的字节流转换为输入型的字符流

OutputStreamWriter: 将一个输出型的字符流转换为输出型的字节流

常见字符集

在存储文件中的字符集

在内存中的字符集

一个字符(char)占用2个字节。在内存中使用的字符集称为Unicode字符集。

数据流(已废弃)

已废弃,已被对象流覆盖

DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写出到具体的文件中

DataInputStream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量

对象流

API

ObjectInputStream

ObjectOutputStream

作用

可以读写基本数据类型的变量,引用数据类型的变量

对象的序列化机制

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而把这种二进制流持久地保存在磁盘上。

或通过网络将这种二进制流传输到另一个网络节点。

//当其它程序获取了这种二进制流,就可以恢复成原来地Java对象

如下两个流的使用:

序列化过程:使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去

反序列化过程:使用ObjectInputstream流实现,将文件中的数据或网络还原为内存中的Java对象

自定义类实现序列化机制

》自定义类需要实现接口,Serializable

》要求自定义类声明一个全局变量:static final long serizalVersionUID = 4223422L

用来唯一的标识当前类

》要求自定义类的各个属性也必须是可序列化的

对于基本数据类型的属性,默认就是为可序列化的

》对于引用数据类型的属性,要实现Serilalizable接口

注意点:

》如果不声明全局变量serivalVersionUID,系统会自动针对当前类分配一个UID

但是如果修改此类中的变量,方法,构造器等,或导致UID变化,进而导致反序列化时,出现 InvalidClassException异常

》类中的属性如果声明为transient或static,则不会实现序列化。

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

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

相关文章

设置chunk自动扩展到多大

1. 设置chunk自动扩展 execute function task(modify chunk extendable on,8); 2. 设置dbs扩展到多大合适 execute function task(modify space sp sizes,testdb1024,1024,10240) testdb 初始1MB 下次扩1MB 最大10MB

appium+python自动化测试

获取APP的包名 1、aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity 2、在android-sdk里面双击SDK-manager,下载buidl-tools 3、勾选build-tools,随便选一个版本,我这里选的是24的版…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源:宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三) 教程背景 通过之前的教程,我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装,并创建了一个计数器项目。在本期教…

数据分析 - 分散性与变异的量度

全距 - 极差 处理变异性 方差度量 数值与均值的距离,也就是数据的差异性 标准差描述:典型值 和 均值的距离的方法,数据与均值的分散情况

出行类app如何提升广告变现收益?

出行类APP已经成为越来越多人们出行的首选,出行类app在变现方式上存在以下痛点:APP功能单一、使用场景单一;用户使用时间集中,粘性低...这些痛点使得开发者获取收益的提升面临极大的挑战。 https://www.shenshiads.com 如何让出…

【ARL灯塔搭建详细教程】

文章目录 前言一、前期准备二、安装docker及docker-compose三、安装ARL灯塔四、登录ARL灯塔 前言 ARL(Asset Reconnaissance Lighthouse)资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库,无需登录凭证或特殊访问即可主动…

Python ... takes 0 positional arguments but 1 was given

最近,博主在学习python时遇到这么个报错, 系统:windows10 开发环境:VS Code Python版本:3.12 错误重现: class Dog:def __init__(self):passdef eatSomething(self):self.eatBone()def eatBone():prin…

Ubuntu18.04安装Loam保姆级教程

系统环境:Ubuntu18.04.6 LTS 1.Loam的安装前要求: 1.1 ROS安装:参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话,有时候加了这行也不好使,我是疯狂试了20次&#xf…

quartz笔记

Quartz-CSDN博客 上面是Quartz的一些基本知识,如果对quartz的基本API不是很了解的话,建议先看下上面的 和Linux Crontab对比 1.执行粒度: Linux Crontab是进程级 quart是线程级 2.跨平台性: Crontab只能在Linxu运行 quart是java实现,可以跨平台 3.调度集上 Crontab的…

VUE指令、computed计算属性和watch 侦听器(附带详细案例)

文章目录 前言一、指令补充1. 指令修饰符2. v-bind对于样式操作的增强 - class3. 案例 - 京东秒杀 tab 导航高亮4. v-bind对于样式操作的增强 - style5. v-model应用于其他表单元素 二、computed计算属性1. 基础语法2. 计算属性 vS method 方法3. 完整写法4. 成绩案例 三、watc…

Java读取本地文件

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException;public class Main {public static void main(String[] args) {String filePath "C:/Users/admin/Desktop/知识点记录.md";// 创建一个文件对象File f…

关于苏州立讯公司国产替代案例(使用我公司H82409S网络变压器和E1152E01A-YG网口连接器产品)

关于苏州立讯公司国产替代案例(使用我们公司的H82409S网络变压器和E1152E01A-YG网口连接器产品) 苏州立讯公司是一家专注于通信设备制造的企业,他们在其产品中选择了我们公司的H82409S网络变压器和E1152E01A-YG网口连接器,以实现…

你是想被ChatGPT改变,还是改变软件开发的未来?丨IDCF

人工智能技术的发展,正在深刻地改变着我们的生活和工作方式。在软件工程领域,ChatGPT作为一种新兴的人工智能技术,正在逐渐地被应用到软件开发的各个环节中。那么,ChatGPT对每个人的影响是什么呢? 一、对软件开发人员…

数据结构 链表

单链表&#xff1a;单链表用来写邻接表&#xff0c;邻接表用来存储图和树 双链表&#xff1a;用来优化某些问题 单链表 链式存储 #include<stdio.h> #include<stdlib.h> int cont 0; //结构体 typedef struct List { int data; //数据域 struct List* next; //…

Azure的AI使用-(语言检测、图像分析、图像文本识别)

1.语言检测 安装包&#xff1a; # 语言检测 %pip install azure-ai-textanalytics5.2.0 需要用到密钥和资源的终结点&#xff0c;所以去Azure上创建资源&#xff0c;我这个是创建好的了然后点击密钥和终结者去拿到key和终结点 两个密钥选择哪个都行 语言检测代码示例&#…

使用CXF调用WSDL(二)

简介 本篇文章主要解决了上篇文章中遗留的对象嵌套问题&#xff0c;要想全面解析无限极的对象嵌套需要使用递归去解决 上文链接&#xff1a; 使用CXF调用WSDL&#xff08;一&#xff09; 上文回顾 上文使用了单方法“ call() ”解决了List和基本类型&#xff08;含String&…

【Linux】Linux进程间通信(二)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

2023年09月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 以下选项中,不是tkinter变量类型的是?( ) A: IntVar() B: StringVar() C: DoubleVar() D: FloatVar() 答案:D tkinter 无 FloatVar()变量类型。 第2题 关于tkinter,以下说…

JVM-HotSpot虚拟机对象探秘

目录 一、对象的实例化 &#xff08;一&#xff09;创建对象的方式 &#xff08;二&#xff09;创建对象的步骤 二、对象的内存布局 &#xff08;一&#xff09;对象头 &#xff08;二&#xff09;实例数据 &#xff08;三&#xff09;对齐填充 三、 对象的访问定位 &…

【go】报错整理与解决

文章目录 依赖下载失败checksum mismatch启动报错missing go.sum 依赖下载失败checksum mismatch > go get github.com/hibiken/asynqmon go: downloading github.com/hibiken/asynqmon v0.7.2 go: github.com/hibiken/asynqmonv0.7.2: verifying module: checksum mismatc…