FILE类与IO流

目录

File类的实例化与常用方法

 File类的理解

 文件路径的表示方式:

 API的使用

IO流概述与流的分类  

 I/O流中的是Input/Output的缩写

 IO流的分类(不同角度)

Java程序中的IO流涉及40多个,但实际上都是由4个抽象类衍生出来的。

FileReader和FileWriter读取、写出文本数据

 操作步骤

实例

注意点

FileInputStream和FileOutputStream的使用

使用

 步骤

 实例

 注意点

处理流之一:缓冲流的使用

作用:

使用:

案例

处理流之二:转换流的使用及各种字符集的讲解

 首先我们需要理解两个名词 

 如果希望程序在读取文件时,不出现乱码,需要注意什么?

 转换流

关于字符集

    在存储的文件中的字符

     内存中的字符

处理流之三:对象流的使用及对象的序列化机制

 数据流

 对象流

 实例

自定义类实现序列化机制

注意点:

其他流的使用(了解)

 标准输入、输出流


File类的实例化与常用方法

 File类的理解

  • File类位于java.io包下,涉及的相关流都声明在java.io包下。
  • File类的一个对象,对应操作系统下的一个文件或一个文件目录(或文件夹)
  • FILE类中声明了新建、删除、获取名称、重命名等方法,并没有涉及到文件内的读写操作。要想实现文件内容的读写,就需要使用IO流
  • FILE类的对象,通常是作为io流操作的文件的端点出现的
    • 代码层面,我们将FILE类的对象作为参数传递到IO流相关类的构造器中。

    如何辨别目录和文件:小方法:有后缀就是文件,没有就是目录

 文件路径的表示方式:

  • 绝对路径:以Windows操作系统为例,包括盘符在内的文件或文件目录的完整路径
  • 相对路径:相对于某一个文件目录来讲的相对的位置
    • 在IDEA中如果使用单元测试方法,相对路与当前的module来讲
    • 如果使用main方法,相对于当前的project来讲

 API的使用

  • 构造器
    • public File(String pathname):

    • public File(String parent,String child):
      • 参数1:一定是一个文件目录。
      • 参数2:可以是一个文件,也可以是一个文件目录(看后缀)。

    • public File(File parent,String child)

  • 方法(熟悉)
    • 获取文件和目录的基本信息

      • 文件不存在时

      • 存在时

      • 绝对路径

    • 列出目录的下一级

    • File类的重命名功能

      • file1.renameTo(file2)
      • 要求:
        • file1必须存在,file2必须不存在;且file2所在的文件目录需要存在
    • 判断功能的方法

    • 创建和删除功能

IO流概述与流的分类  

        Java程序中,对于数据的输入/输出操作以流的方式进行,可以看作是一种数据的流动

 I/O流中的是Input/Output的缩写

  • 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
  • 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

 IO流的分类(不同角度)

  • 流向的不同:输入流、输出流
  • 存储单位的不同:字节流、字符流
  • 角色的不同:节点流、处理流

Java程序中的IO流涉及40多个,但实际上都是由4个抽象类衍生出来的。

  • 4个抽象基类:InputStream,OutputStream,Reader,Writer
  • 4个节点流(也称为文件流):FileInputStream,FileOutputStream,FileReader,FileWriter
  • 分别有对应的4个缓冲流(处理流的一种):BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter

FileReader和FileWriter读取、写出文本数据

 操作步骤

  • 第1步:创建读取或写出的File类的对象
  • 第2步:创建输入流或输出流
  • 第3步:具体的读入或写出的过程。
    • 读入:read(char[]cbuffer)
    • 写出:write(string str)/write (char[]cbuffer,0,len)
  • 第4步:关闭流资源,避免内存泄漏

实例

1.

  • 实例1:读取文件中的内容,显示在控制台上
    • 1.创建File类的对象,对应着hello.txt文件。
    • 2.创建输入型的字符流,用于读取数据。
    • 3.读取数据,并显示在控制台上。
    • 4.流资源的关闭操作(必须要关闭,否则会泄露)

2.

  • 实例2:将内存的数据写出到指定的文件中
    • 1.创建File类的对象,指明要写出的文件的名称
    • 2.创建输出型的字符流。
    • 3.写出具体过程
    • 4.关闭资源
      • 输出时,文件可以不在,他会帮我们创建文件

      • 构造器的不同,会进行不同的操作

3.

  • 实例3:复制一份hello.txt文件,命名为hello_copy.txt
    • 1.创建File类的对象
    • 2.创建输出流、输入流
    • 3.数据的读入和写出的操作
    • 4.关闭流资源

注意点

  • ①因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常
    • 对于输入流来讲,要求File类的对象对应的物理磁盘上的文件必须存在,否则会报FileNotFoundException;
    • 对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在
      • 如果此文件不存在,在输出过程中,会自动创建此文件,并写出数据到此文件中
      • 如果此文件存在,使用FileWriter(File file)或FileWriter(File file,false):输出数据过程中,会新建同名的文件对现有的文件进行覆盖。
      • 如果此文件存在,使用FileWriter(File file,true):输出数据过程中,会在现有的文件的末尾追加写出内容

FileInputStream和FileOutputStream的使用

字符流不适合用来处理非文本文件,字节流能解决这个问题

使用

 步骤

  • 1.创建相关的File类对象
  • 2.创建相关的输入流或输出流
  • 3.具体的读入和写出的过程(数组大小一般1024)
    • 读入:read(byte []cbuffer)
    • 写出:write(string str)/write (byte[]cbuffer,0,len)
  • 4.关闭资源

 实例

  • 实例1:复制一份playgirl.jpg文件,命名为playgirl_copy_jpg;
    • 1.创建相关的File1类对象
    • 2.创建相关的字节流
    • 3.数据的读入和写出
    • 4.关闭资源

 注意点

        (在注意FileReader和FileWrite的基础上)对于字符流只能操作文本文件,不能用来处理非文本文件;对于字节流,通常用来处理非文本文件,但是,如果涉及到文本文件的赋值操作也可以使用字节流。

        常见文本文件:.txt 、.java 、.c 、.c++ 等

        常见非文本文件:.doc 、.excel 、.jpg 、.mp3 等

处理流之一:缓冲流的使用

作用:

        提高文件的读写效率

使用:

        

  • 处理非文本文件字节流
    • BufferedInputStream——>read(byte[]buffer)\flush();
    • BufferedOutputStream——>write(byte[]buffer,0,length)\flush( )
  • 处理文本文件的字符流
    • BufferedWriter——>read(char[]cbuffer)/String readLine( )
    • BufferReader——>write(char[]cbuffer,0,length)/write(string )、flush( )

案例

  • 案例一

  • 案例二,readline返回不包含换行符

  • 案例赋值操作

处理流之二:转换流的使用及各种字符集的讲解

 首先我们需要理解两个名词 

  • 字符编码:(从我们能看懂的转换为看不懂的)字符、字符串、字符数组——>字节、字节数组
  • 字符解码:(从我们能看不懂的转换为我们能看懂的)字节、字节数组——>)字符、字符串、字符数组

 如果希望程序在读取文件时,不出现乱码,需要注意什么?

  • 解码时使用的字符集必须与当初编码时使用的字符集必须相同。
  • 拓展:解码集必须要与编码集兼容。比如:文件编码使用的是GBK,解码时使用的是utf-8。如果文件中只有英文字符,此情况下也不会出现乱码。因为GBK与utf-8都向下兼容了ASCII

 转换流

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

  • API:
    • InputStreamReader:将一个输入型的字节流转换为输入型的字符流
    • OutputStreamWriter:将一个输出型的字符流转换为输出型的字节流
  • 实例

关于字符集

    在存储的文件中的字符

  • ascii:主要用来存储abc等英文字符、常用标点符号、数字123等。每一个字符占用一个字节
  • iso-8859-1:拉丁码(了解),每一个字符占用一个字节,向下兼容ascii
  • gbk:用来存储包括中文简体繁体、abc等英文字符、常用标点符号、数字123等。中文字符是使用两个个字节存储的。向下兼容ascii(意味着abc等英文字符、常用标点符号、数字123等仍使用一个字节)
  • utf-8:可以用来存储世界范围内主要的语言的所有的字符。使用1-4个不等的字节表示一个字符。中文字符使用3个字节存储的。向下兼容ascii(意味着abc等英文字符、常用标点符号、数字123等仍使用一个字节)

     内存中的字符

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

处理流之三:对象流的使用及对象的序列化机制

 数据流

  • DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写出到具体的文件中
  • DataInputStream:可以将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量
  • 只能处理基本数据类型和String类型

 对象流

  • 数据流能做的对象流都能做(所以了解对象流就行)
  • API:ObjectInputStream、ObjectOutputStream
  • 作用:
    • 可以读写基本数据类型的变量、引用数据类型的变量
  • 对象的序列化机制:对象的序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其他程序获取了这种二进制流,就可以恢复成原来的Java对象
  • 两个过程使用的流:
    • 序列化过程:使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去
    • 反序列化过程:使用ObjectInputStream流实现。将文件中的或网络传输过来的数据还原为内存中的Java对象。

 实例

  • 实例1(基本数据类型)
    • 序列化过程

      • 创建File类对象和流的对象
      • 写出数据即为序列化的过程
      • 关闭资源
    • 反序列化过程

      • 创建File类对象和流的对象
      • 读取文件中的对象即为序列化的过程
      • 关闭资源
  • 实例2(String类型)
    • 对象

自定义类实现序列化机制

  • ①自定义类需要实现一个接口:Serializable(属于一个标识接口)
  • ②要求自定义类声明一个全局常量:static final long seriaVersionUID = 78968889L(这个随便,不一样就行);用来唯一的标识当前的类的。
  • ③要求自定义类的属性也必须是可序列化的。
    • 对于基本数据类型的属性:默认就是可以序列化的
    • 对于引用数据类型的属性:要求实现Serializable接口

注意点:

  • 如果不声明全局常量serialVersionUID,系统会自动生成一个针对于当前类的一个serialVersionUID。如果修改此类的话,serialVersionUID会自己变化,进而导致反序列化时出现异常。
  • 类中的属性如果声明为transient或static,则不会实现序列化。

其他流的使用(了解)

 标准输入、输出流

  • System in:标准的输入流,默认从键盘输入
  • System out:标准的输出流,默认从显示器输出(理解为控制台输出)
  • 通过调用如下方法修改输入流和输出流的位置
    • setIn(InputStream is)
    • setOut(PrintStream ps)
  • 打印流PrintStream

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零代码编程:用kimichat将mp4视频批量转为mp3音频

一个文件夹里面有多个子文件夹,里面的视频需要转成为mp3音频格式。可以在kimichat中键入提示词: 你是一个Python编程专家,要完成一个Python脚本的编写任务,具体步骤如下: 打开文件夹:D:\CHATGPT For TikT…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器? 通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

HTTP协议安全传输教程

HTTP协议有多个版本,包括但不限于HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。这些版本各自具有不同的特点和改进,以适应网络技术的发展和满足不同的需求。例如,HTTP/1.0使用文本格式传输数据,简单易用且兼容性好,…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言: 最近在完成公司的项目时,为了兼容其他的版本,需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包,安装成功之后,分享如下: 安装命令: ant-design-vue: 不…

深入剖析跨境电商平台风控机制,探索测评安全与稳定的秘诀

在跨境电商测评市场鱼龙混杂的当下,测评过程中可能隐藏的陷阱保持高度警觉。多年的测评经验告诉我们,选择一个适合的测评系统对于项目的成功至关重要。近年来,测评技术如雨后春笋般涌现,市场上涌现出众多测评系统,覆盖…

Spring Boot 处理过滤器(filter )中抛出的异常

前言: 在改造老项目登录功能的时候,使用了过滤器对 token 进行有效性验证,验证通过继续进行业务请求,验证不通过则抛出校验异常。 过程: 技术方案拟定后,就着手开始改造,一切都很顺畅&#x…

Linux用户及用户组管理命令

Linux操作系统是一种基于UNIX的多用户、多任务的操作系统。在Linux系统中,用户和用户组的管理是非常重要的,因为它关系到系统安全和多用户环境下的资源共享。本文将详细介绍Linux中用户和用户组管理的相关命令,帮助用户更好地理解和管理Linux…

SpringBoot整合minio服务

这里我选用的是JDK1.8 SpringBoot2.3.12.RELEASE 一、导入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.2</version> </dependency> 二、导入工具类 注意&#xff1a;需要在…

DP4 最小花费爬楼梯

原题链接&#xff1a;最小花费爬楼梯_牛客题霸_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dp。 开一个dp数组和a数组。dp[i]表示在当前这一格所需要的费用&#xff0c;a数组其实就是题目中的cost数组。 因为最后要求到顶楼的最低费用&a…

Redis: java客户端

文章目录 一、Redis的Java客户端1、Jedis&#xff08;1&#xff09;Jedis操作Redis&#xff08;2&#xff09;Jedis连接池 2、lettuce3、Redisson4、SpringDataRedis客户端&#xff08;1&#xff09;介绍&#xff08;2&#xff09;序列化&#xff08;3&#xff09;StringRedisT…

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会&#xff08;CAIIAC&#xff09;是中国人工智能技术发展和应用的重要展示平台&#xff0c;不仅关注创新&#xff0c;还涵盖了市场和监管方面的内容&#xff0c;对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…

Python数据可视化:无向网络图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 Python数据可视化&#xff1a; 无向网络图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import networkx as nx import matplotlib.pyplot as plt a [(A, B), (B, C), (B, D)] …

基于小程序实现的4s店管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术&#xff0c;它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

MyBatisPlus自定义SQL

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:MyBatisPlus自定义SQL 📚个人知识库: Leo知识库,欢迎大家访问 目录 1.前言☕…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

WebRTC直播间搭建记录

考虑到后续增加平台直播的可能性&#xff0c;笔记记录一下WebRTC相关. 让我们分别分析两种情况下的WebRTC连接建立过程&#xff1a; 情况一&#xff1a;AB之间可以直接通信 1.信令交换&#xff1a; 设备A和设备B首先通过信令服务器交换SDP&#xff08;Session Description Pr…

科技驱动未来,提升AI算力,GPU扩展正当时

要说这两年最火的科技是什么&#xff1f;我想“AI人工智能”肯定是最有资格上榜的&#xff0c;尤其ChatGPT推出后迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万&#xff0c;2023年一月末&#xff0c;ChatGPT的月活用户更是突破1亿&#xff0c;成为…

嵌入式4-16

tftpd #include <myhead.h> #define SER_IP "192.168.125.243" //服务器IP地址 #define SER_PORT 69 //服务器端口号 #define CLI_IP "192.168.125.244" //客户端IP地址 #define CLI_PORT 8889 //客户端端…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 &#xff08;1&#xff09;资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;公共类Frm_Play.cs &#xff08;3&#xff09;主窗体 …