IO (位于 java.io 包中)

一、概念
1. 流:数据在内存和其他存储设备传输的通道、管道。【理解】
2. 流的分类:【面试内容】
(1) 按照方向分: [ JVM 内存为参照物 ]
a. 输入流:将 [ 其他存储设备 ] 中数据读入到 [JVM 内存 ] 中 。 ->
b. 输出流:将 [JVM 内存 ] 中数据写入到 [ 其他存储设备 ] 中。 ->
(2) 按照单位分:
a. 字节流:以字节为传输单位,可以用于操作所有类型的文件。
b. 字符流:以字符为传输单位,可以用于操作文本类型的文件。
文本文件:只要能以记事本打开,并且不丢失原有文件内容的文件。
例如: .txt / .java / .c / .html
.class / .ppt /.mp3 等文件不是文本文件。
(3) 按照功能分:
a. 节点流:只具有基本的读写功能。
b. 过滤流:在节点流的基础上,增强读写功能。
二、字节流
1. 字节流的父类: ( 父类为抽象类 )
(1) InputStream: 字节输入流 --- 》读操作 (read)
(2) OutputStream: 字节输出流 -- 》写操作 (write)
2. 字节节点流【开发应用重点】
(1) FileOutputStream :文件字节输出流
常用的构造方法:
a. FileOutputStream fos = new FileOutputStream("E:/test/a.txt");
I. 参数:代表操作文件的路径: "E:/test/a.txt" 或是 "E: \ \test \ \ a.txt"
II. 绝对路径:盘符: / 文件夹 / 文件
III. 注意:如果指定文件不存在,则系统默认创建新的文件,但是如果指定文件夹不存在,则报错,错
误信息为: java.io.FileNotFoundException: ( 系统找不到指定的路径。 )
b. FileOutputStream fos = new FileOutputStream("a.txt");
I. 相对路径:默认在项目的根目录下查找所需要的文件,有直接用,如果指定文件不存在,则系统默
认创建
c. FileOutputStream fos = new FileOutputStream("file/c.txt",false);
I. 第一个参数:指定操作文件路径 II. 第二个参数: boolean 类型,是否在原有文件内容基础上进行追加, true- 追加; false- 覆盖
常用方法:
a. void write(int n): 将单个字节写入到文件中
b. void write(byte[] bs): 将多个字节写入到文件中
c. void write(byte[] bs,int off,int len): bs 数组中的部分内容写入到文件中,起始下标为 off ,写入的个
数为 len.
d. void close() : 代表关闭资源。
(2) FileInputStream : 文件字节输入流
常用的构造方法:
a. FileInputStream fis = new FileInputStream("file/d.txt");
I. 参数:代表操作文件的路径及文件名,但是如果指定的文件找不到,则系统不会默认创建,直接报
错,错误信息为: java.io.FileNotFoundException: ( 系统找不到指定的文件。 )
常用的方法:
a. int read() : 一次性从文件中读取一个字节的内容,读取的内容作为返回值返回,如果达到文件的尾
部,则返回 -1
开发应用:将文件的内容进行全部读取。
while(true){
int n = fis.read();
if (n==-1) break;
// 基于 n 进行内容操作
System.out.println((char)n);
}
b. int read(byte[] bs) :从文件中一次性读取多个字节内容,读取的内容自动存储在 bs 数组中,返回值
代表实际读取的字节数,如果达到文件的尾部,则返回 -1.
c. int read(byte[] bs,int off,int len) :从文件中一次性读取多个字节内容,读取的内容自动存储在 bs 数组
( 存储的起始下标为 off) ,一次性读取的字节个数为 len , 如果达到文件的尾部,则返回 -1.
思考:如何实现文件拷贝? --- 》文件的上传与下载的实现原理。
3. 字节过滤流
(1) BufferedInputStream/ BufferedOutputStream
a. 缓冲流,提高 IO 读写效率,减少访问磁盘的次数
b. 缓冲流增强了缓冲区,将缓冲的内容一次性写入到文件中,可以调用 flush 方法,或是 close 方法。
flush 方法是将缓冲区的内容一次性的写入到文件中,同时缓冲清空,流可以继续使用;
但是 close 方法是关闭流的同时调用的 flush 方法,清空缓冲区的同时将缓冲的内容一次性写入文件中,
流不能继续被使用。
注意:当缓冲区满的时候,自动将缓冲区的内容一次性的写入到文件中。
(2) DataOutputStream/DataInputStream a. 用于操作 8 种基本类型的数据
b. writeByte( 形式参数 )/ writeShort( 参数 )/wirteInt( 参数 )/...
readByte()/readShort()/readInt()/...
(3) ObjectOutputStream/ObjectInputStream
a. 增强了缓冲区
b. 增强了操作 8 种基本数据类型的功能
c. 增强了操作对象的功能。
writeObject(Object obj): 将对象写入到文件中
Object readObject() : 从文件中读取对象。
d. 对象序列化:将对象放在流上进行传输的过程被称为对象序列化。【重点】
I. 对象序列化的要求 : 参与对象序列化的对象对应的类必须实现 java.io.Serializable 接口 ( 标记性接口 )
否则运行报错,错误信息为: java.io.NotSerializableException( 不可序列化异常 ) 【重点】
II. 文件达到尾部的标记: java.io.EOFException
III. transient 修饰的属性不参与对象序列化 【重点】
Iv. 如果参与对象序列化的对象中有自定义类型的属性,则自定类型的属性对应的类也必须实现
java.io.Serializable 接口,否则运行报错,为不可序列化的异常。
V. 集合对应实现了创建的对象可以参与对象序列化,因为实现类实现 java.io.Serializable 接口;
但是如果集合中存储的是自定义类型的对象,则自顶类型的对象对应 的类也需要实现
java.io.Serializable 接口。
三、字符编码【理解】
1. 常见的编码方式:
(1) ISO8859-1 西欧编码,底层占用 1 个字节
(2) GBK 简体中文, 2 万汉字
GB2312 简体中文, 6000 多常用汉字
GB18030 简体中文, 7 万左右的中国符号
注意: GBK/GB2312/GB18030 相互兼容。
(3) Big5 繁体中文
(4) UTF-8 万国码,底层采用动态字节数存储,每一个字符存储空间为 1~3 字节;
汉字: 2~3 字节
2. 编码和解码
(1) 编码:字符对应十进制转换为二进制的过程
(2) 解码:二进制转换为对应的十进制从而转换为与之对应的字符的过程。
注意:编码方式和解码方式必须统一,否则会出现乱码。
四、字符流
1. 字符流父类: ( 抽象类 ) (1) Reader: 字符输入流 -- 》读操作
(2) Writer: 字符输出流 -- 》写操作
2. 字符流的节点流
(1) FileWriter: 文件字符输出流
常用的构造方法:
FileWriter fw = new FileWriter("file/a.txt");
注意:参数代表指定文件的路径及文件名,写法等同于 FileOutputStream 路径的写法。
常用功能方法:
void write(int n): 将单个字符写入到文件中。
void write(String str): 将多个字符一次性写入到文件中
void write(char[] cs): cs 数组中所有字符内容一次性写入到文件中
(2) FileReader: 文件字符输入流
常用构造方法:
FileReader fr = new FileReader("file/a.txt");
常用功能方法:
int read() :一次读取一个字符内容,将读取的字符内容存储在返回值,达到文件尾部 , 则返回 -1
int read(char[] cs): 一次性读取多个字符的内容,将读取的字符内容自动存储在 cs 数组中,返回值
代表实际读取的字符个数,如果达到文件的尾部,则返回 -1.
3. 字符的过滤流【重点】
(1) BufferedReader :
常用方法: String readLine() : 一次性读取一个文本行,如果达到文件的尾部,则返回 null
// 1. 创建字符节点流对象
FileReader fr = new FileReader ( "file/c.txt" );
// 2. 包装过滤流
BufferedReader br = new BufferedReader ( fr );
// 3. 读操作
while ( true ){
String str = br . readLine ();
if ( str == null ) break ;
System . out . println ( str );
}
// 4. 关闭:最外层
br . close ();
(2) PrintWriter:
① 可以操作 8 种基本数据类型
② 提供了自动换行和不换行的 println/print 方法
println( 形式参数 ) :自动完成换行
print( 形式参数 ): 不自动换行
println(Object obj)/print(Object obj) :将对象的 toString 方法的返回值结果写入到文件中。
注意:写出 ObjectOutputStream writeObject(Object ob) 方法 和 PrintWriter println(Object obj)
方法的区别。
解析: ObjectOutputStream writeObject(Object ob) :将对象放入流上进行传输,要求传输的对象对
应的类必须实现 java.io.Serializable 接口,这个过程被称为对象序列化。
PrintWriter println(Object obj): 将对象的 toString 方法的返回值 String 类型的结果写入文件中 ,
写入的对象对应的类没有任何要求。
4. 字符的桥转流【开发重点】
(1) InputStreamReader: 桥转的输入流
OutputStreamWriter: 桥转换的输出流
(2) 作用:
a. 可以将字节流转换字符流,即字节流和字符流转换桥梁
b. 可以设置编解码的格式
(3) 应用场景:需要指定编解码格式的时候,可以利用桥转流进行指定。
(4) 使用步骤:
① 创建字节节点流对象: FileOutputStream/FileInputStream
② 创建桥转换流:字节流 - 》字符流,同时指定编解码格式
OutputStreamWriter / InputStreamReader
③ 包装过滤流:目的增强字符流的读写操作
PrintWriter / BufferedReader
④ 读写操作
⑤ 关闭流:关闭最外层即可
五、 File (java.io 包中 )
1. File 类和 IO 流的区别。
(1) IO 流:对文件的内容进行操作,读取的内容或是将内容写入到文件中。
(2) File 类:对文件本身进行操作,例如:删除文件、更改文件名等。
注意: File 类本身不具有操作文件的功能,类中的方法提供了操作文件的功能。
2. File 类中常用的方法:
(1) String getName() : 获取文件名,带有扩展名。
(2) String getAbsolutePath(): 获取绝对路径。【重点】
// 功能:获取文件夹中所有内容,同时进行逐一判断
public static void selectAllEndJava ( File file ){
// 获取文件夹中所有文件和文件夹
File [] fs = file . listFiles ();
// 遍历:获取每一个文件或是文件夹
for ( File f : fs ){
// 判断是文件还是文件夹
if ( f . isFile ()){
// 是文件
// 判断文件是否 以 .java 结尾
String name = f . getName ();
if ( name . endsWith ( ".java" )){
// 打印输出 绝对路径
System . out . println ( f . getAbsolutePath ());
}
} else {
// 文件夹 :
selectAllEndJava ( f ); // 递归
}
}
}

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

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

相关文章

‌HBase是什么,‌HBase介绍

‌官方网站:Apache HBase – Apache HBase Home HBase是一个分布式的、面向列的NoSQL数据库,主要用于存储和处理海量数据。‌它起源于Google的​​​​​​​BigTable论文,是Apache Hadoop项目的子项目。HBase设计用于高可靠性、高性能和可伸…

【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章

文章目录 【C 语言篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章前言一 、指针的介绍与使用1. 指针的介绍1.1指针表示1.2指针变量1.3空指针 2. 使用指针2.1交换两个变量的值2.2计算输出最小值和最大值 二、野指针的介绍与使用1. 野指针…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题: 1)不同单位在视频平台建设中以所属领域为单位,设备品牌众多,存在的标准不一,各系统之间也没有统一标准; 2)各单位视频平台建设分散、统筹性差&am…

【从零开始入门unity游戏开发之——C#篇08】逻辑运算符、位运算符

文章目录 一、逻辑运算符1、**&&(逻辑与)**语法:示例: 2、**||(逻辑或)**语法:示例: 3、**!(逻辑非)**语法:示例: 4、**^&…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作,我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置,我们将完成 CEF 的构建工作,最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

环境变量的知识

目录 1. 环境变量的概念 2. 命令行参数 2.1 2.2 创建 code.c 文件 2.3 对比 ./code 执行和直接 code 执行 2.4 怎么可以不带 ./ 2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下,也不用带 ./ 了 2.4.2 把我们自己的路径添加到环境变量里 3. 认识PATH 3.…

从0-1开发一个Vue3前端系统页面-9.博客页面布局

本节主要实现了博客首页界面的基本布局并完善了响应式布局,因为完善了响应式布局故对前面的页面布局有所改动,这里会将改动后的源码同步上传。 1.对页面头部的用户信息进行设计和美化 布局设计参考 :通常初级前端的布局会通过多个div划分区域…

Nginx中Server块配置的详细解析

Nginx中Server块配置的详细解析 一、Server块简介 在Nginx配置文件中,server块是非常关键的部分。它用于定义虚拟主机,一个server块就代表一个虚拟主机。这使得我们可以在一台Nginx服务器上通过不同的配置来处理多个域名或者基于不同端口的服务请求。 …

C# Winform双色纸牌接龙小游戏源码

文章目录 一、设计来源双色纸牌接龙小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏界面快成功了 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/144419994 …

Linux环境下 搭建ELk项目 -单机版练习

前言 ELK 项目是一个由三个开源工具组成的日志处理和分析解决方案,ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母缩写。这个项目的目标是帮助用户采集、存储、搜索和可视化大量的日志和事件数据,尤其是在分布式系统中。下面是每个组件的概述&…

Java写URI网址唤醒APP小程序等NDEF信息

本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bvCxCPM&ftt&id615391857885 import com.sun.jna.Library ; import com.sun.jna.Native; import java.io.IOException;interface CLibrary extends Library {//DLL绝…

Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

OpenHarmony和OpenVela的技术创新以及两者对比

两款有名的国内开源操作系统,OpenHarmony,OpenVela都非常的优秀。本文对二者的创新进行一个简要的介绍和对比。 一、OpenHarmony OpenHarmony具有诸多有特点的技术突破和重要贡献,以下是一些主要方面: 架构设计创新 分层架构…

【图像配准】方法总结

图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…

Ubuntu本地化安装MYSQL及Navicat

本教程记录一下,如何在ubuntu上安装mysql,并安装免费版的数据库图形化连接软件Navicat Linux上安装mysql首选使用docker安装,直接拉取mysql的docker镜像即可,这种方式最简单、快捷,这是linux云端服务器最常用的安装方式…

案例分享|企查查的数据降本增效之路

分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…

【Java Web】Axios实现前后端数据异步交互

目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案,而…

龙迅#LT7911E适用于EDP/DP/TPYE-C转MIPIDSI应用,支持图像处理功能,内置I2C,主应用副屏显示,投屏领域!

1. 描述 LT7911E 是一款高性能 eDP 转 MIPI D-PHY 转换器,旨在将 eDP 源连接到 MIPI 显示面板。 LT7911E 集成了一个符合 eDP1.4 标准的接收器,支持 1.62Gbps 至 5.67Gbps 的输入数据,以 270Mbps 的递增步长,以及一个 2 端口 D…

selenium工作原理

原文链接:https://blog.csdn.net/weixin_67603503/article/details/143226557 启动浏览器和绑定端口 当你创建一个 WebDriver 实例(如 webdriver.Chrome())时,Selenium 会启动一个新的浏览器实例,并为其分配一个特定的…