File类和IO流

news2024/11/27 18:23:22

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

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

一名从事运维开发的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的方式
    @Test
    public 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的方式
    @Test
    public 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的方式
    @Test
    public void test03()throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");
        // 字符串
        String msg = "尚硅谷";

        // 写出字符数组
        fw.write(msg); //尚硅谷

        // 写出从索引1开始,2个字符。
        fw.write(msg,1,2);	// 硅谷

        // 关闭资源
        fw.close();
    }
    
    @Test
    public 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.coloradmin.cn/o/1218850.html

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

相关文章

2024苹果笔记本清理内存清理优化工具CleanMyMac X

在使用苹果笔记本电脑的过程中,清理内存是保持电脑运行流畅的重要步骤之一。当我们使用大量的应用程序和文件时,电脑的内存可能会被占满,导致系统变慢甚至出现崩溃的情况。因此,了解如何清理苹果笔记本的内存是非常必要的。本文将…

代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离

LeetCode T583 两个字符串的删除操作 题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode) 题目思路: 本题有两个思路 1.使用两个字符串的长度之和-2*最长公共子串(换汤不换药) 代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交…

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件(无论是个人照片还是重要业务文档)的任何人来说,数据丢失都可能是一场噩梦。 值得庆幸的是,有多种数据恢复工具专门用于Mac用户,可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

Rust图形界面:eGUI的Panel布局

文章目录 Panel布局尺寸调节源码 Panel布局 eGUI提供面板堆叠的布局方案,即Panel布局。其布局逻辑是,根据当前面板指定的方向,尽可能地填充空间。 CentralPanel 占据屏幕剩余部分的空间SidePanel 占据屏幕两侧的空间,在具体调用…

【网络】TCP协议的相关实验

TCP协议的相关实验 一、理解listen的第二个参数1、实验现象2、TCP 半连接队列和全连接队列3、关于listen的第二个参数的一些问题4、SYN洪水Ⅰ、什么是SYN洪水攻击Ⅱ、如何解决SYN洪水攻击? 二、使用Wireshark分析TCP通信流程 一、理解listen的第二个参数 在编写TCP…

【23真题】无耻!“官方”假真题!害人!

这套华侨23真题是学弟给我从考场抄出来的版本,我刚刚做完解析!后台就收到了另外一份“官方华侨23真题”的投稿。我本想对对回忆版,补充下题干。结果一对吓一跳!竟然一道题都不一样!给大家看下,真的好逼真&a…

《向量数据库指南》——TruLens + Milvus Cloud 构建RAG案例

具体案例 如前所述,RAG 配置选择可能对消除幻觉产生重大影响。下文中将基于城市百科文章构建问答 RAG 应用并展示不同的配置选择是如何影响应用性能的。在搭建过程中,我们使用 LlamaIndex 作为该应用的框架。大家可以在 Google Colab( https://colab.research.google.com/git…

Theory behind GAN

假如要生成一些人脸图,实际上就是想要找到一个分布,从这个分布内sample出来的图片像是人脸,分布之外生成的就不像人脸。而GAN要做的就是找到这个distribution。 在GAN之前用的是Maximum Likelihood Estimation。 Maximum Likelihood Estimat…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏2(附项目源码)

文章目录 先看本次实现的最终效果前言敌人生命值扣血测试,敌人死亡控制敌人动画敌人死亡动画敌人转向问题源码完结 先看本次实现的最终效果 前言 本期紧接着上一篇,本期主要内容是实现敌人血条、动画和行为逻辑。 敌人生命值 绘制血条UI 新建 publ…

快速入门:构建您的第一个 .NET Aspire 应用程序

##前言 云原生应用程序通常需要连接到各种服务,例如数据库、存储和缓存解决方案、消息传递提供商或其他 Web 服务。.NET Aspire 旨在简化这些类型服务之间的连接和配置。在本快速入门中,您将了解如何创建 .NET Aspire Starter 应用程序模板解决方案。 …

unity 烘焙的时候出现模型没有光影的情况

unity 烘焙的时候出现模型没有光影的情况 1.模型没有设置生成光照贴图 需要勾选模型的生成光照贴图UVs,然后应用 2.游戏对象没有勾选静态选项 点开静态下拉列表,选择 contribute GI

Accelerate 0.24.0文档 四:Megatron-LM

参考《Megatron-LM》 文章目录 一、Megatron-LM集成简介二、环境配置设置conda环境的步骤: 二、Accelerate Megatron-LM Plugin三、自定义训练过程四、检查点转换五、文本生成六、支持ROPE 、 ALiBi和Multi-Query Attention七、注意事项 一、Megatron-LM集成简介 在…

再谈谷歌GMS认证之Android 13

写在前面的话 2023年来到一个新的公司,传说中的做互联网金融即将上市的高大上公司。 入职后才发现就是做pos机设备的一个小厂 哎,什么命啊! 工作和手机开发的工作重合度可以达到95%以上,我不想做手机,偏偏又干上…

全网首位数字军人“穆兰”惊艳亮相,与拓世法宝共同绘就未来社会图景

古有穆桂英、花木兰挂帅出征,今有全网首位虚拟数字军人“穆兰”展巾帼风采。今年国庆节后,中国军号在全网为解放军新闻传播中心数字记者暨全军首位超写实虚拟数字军人征名,历时一个多月,经过征名提交、评委初评、公众投票、专家共…

验证码识别之OCR识别

验证码识别: 背景: ​ 决定开一个专题给大家讲一下验证码识别,不要多想,我们不搞深度学习,知识用于攻破模拟登录的时候弹出的验证码,后续会给大家讲讲滑块等等,反爬虫策略如何应对。 好了&am…

如何实现业务系统的单点退出

当前我国各领域正在加速向数字化、移动化、智能化发展,大力投入信息化建设与数字化转型已成为企业的共识,但对于很多企业而言,组织信息环境庞大复杂,业务场景变化频繁,给身份管理与信息安全管理带来很大挑战。随着信息…

Spring Bean的生命周期详细梳理

1. 理解Bean的生命周期 1.1 生命周期的各个阶段 在Spring IOC容器中&#xff0c;Bean的生命周期大致如下&#xff1a; 实例化&#xff1a;当启动Spring应用时&#xff0c;IOC容器就会为在配置文件中声明的每个<bean>创建一个实例。属性赋值&#xff1a;实例化后&#…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…

免费图像压缩工具分享:15 个最佳免费图像压缩工具

您想在将图像上传到网上之前对其进行压缩吗&#xff1f;优化摄影网站的图像将有助于您的网站加载速度更快。而且&#xff0c;更快的加载速度意味着更好的搜索引擎排名&#xff01;在本指南中&#xff0c;我们将分享用于图像压缩的最佳免费图像优化工具。 许多照片编辑程序&…