Java IO

2023-10-27

相关概念

Java IO

Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中"流"动一样。

Java IO类库的框架

Java IO的类型

从是读媒介还是写媒介的维度看,Java IO可以分为:

  1. 输入流:InputStream和Reader
  2. 输出流:OutputStream和Writer

  输入流和输出流

  对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。 

而从其处理流的类型的维度上看,Java IO又可以分为:

  1. 字节流:InputStream和OutputStream
  2. 字符流:Reader和Writer

  字符流和字节流

  字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

IO类库

Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。各类用途汇总如下:

  • 文件访问
  • 网络访问
  • 内存缓存访问
  • 线程内部通信(管道)
  • 缓冲
  • 过滤
  • 解析
  • 读写文本 (Readers / Writers)
  • 读写基本类型数据 (long, int etc.)
  • 读写对象

 

基本用法

字节流

InputStream:字节输入流基类,抽象类是表示字节输入流的所有类的超类。

	// 从输入流中读取数据的下一个字节
	abstract int read()
	// 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中
	int read(byte[] b)
	// 将输入流中最多 len 个数据字节读入 byte 数组
	int read(byte[] b, int off, int len)
	
	// 跳过和丢弃此输入流中数据的 n个字节
	long skip(long n)

	// 关闭此输入流并释放与该流关联的所有系统资源
	void close()

OutputStream:字节输出流基类,抽象类是表示输出字节流的所有类的超类。

    // 将 b.length 个字节从指定的 byte 数组写入此输出流
	void write(byte[] b)
	// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
	void write(byte[] b, int off, int len)
	// 将指定的字节写入此输出流
	abstract void write(int b)

	// 关闭此输出流并释放与此流有关的所有系统资源
	void close()
	
	// 刷新此输出流并强制写出所有缓冲的输出字节
	void flush()

BufferedInputStream:字节缓冲输入流,提高了读取效率。

	 // 创建一个 BufferedInputStream并保存其参数,即输入流in,以便将来使用。
	 BufferedInputStream(InputStream in)
	 // 创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流in以便将来使用
	 BufferedInputStream(InputStream in, int size)

BufferedOutputStream:字节缓冲输出流,提高了写出效率。

	 构造方法:
	 // 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
	 BufferedOutputStream(OutputStream out)
	 // 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
	 BufferedOutputStream(OutputStream out, int size)
	 
	 常用方法:
	 // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流
	 void write(byte[] b, int off, int len)
	 // 将指定的字节写入此缓冲的输出流
 	 void write(int b)
	 // 刷新此缓冲的输出流
	 void flush()

字符流

Reader:读取字符流的抽象类.

 	// 读取单个字符
	int read()
	// 将字符读入数组
	int read(char[] cbuf)
	// 将字符读入数组的某一部分
	abstract int read(char[] cbuf, int off, int len)
	// 跳过字符
	long skip(long n)
	
	// 关闭该流并释放与之关联的所有资源
	abstract void close()

Writer:写入字符流的抽象类.

 	// 写入字符数组
	 void write(char[] cbuf)
	// 写入字符数组的某一部分
	abstract void write(char[] cbuf, int off, int len)
	// 写入单个字符
	void write(int c)
	// 写入字符串
	void write(String str)
	// 写入字符串的某一部分
	void write(String str, int off, int len)

	// 将指定字符添加到此 writer
	Writer append(char c)
	// 将指定字符序列添加到此 writer
	Writer append(CharSequence csq)
	// 将指定字符序列的子序列添加到此 writer.Appendable
	Writer append(CharSequence csq, int start, int end)

	// 关闭此流,但要先刷新它
	abstract void close()
	// 刷新该流的缓冲
	abstract void flush()

BufferedReader:字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

    // 创建一个使用默认大小输入缓冲区的缓冲字符输入流
	BufferedReader(Reader in)
	// 创建一个使用指定大小输入缓冲区的缓冲字符输入流
	BufferedReader(Reader in, int sz)
 特有方法:
    // 读取一个文本行
	String readLine()

BufferedWriter:字符缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

 	// 创建一个使用默认大小输出缓冲区的缓冲字符输出流
	BufferedWriter(Writer out)
	// 创建一个使用给定大小输出缓冲区的新缓冲字符输出流
	BufferedWriter(Writer out, int sz)
 特有方法:
 	// 写入一个行分隔符
	void newLine() 

OutputStreamWriter:字节流转字符流。

 	// 创建使用默认字符编码的 OutputStreamWriter
	OutputStreamWriter(OutputStream out)
	// 创建使用给定字符集的 OutputStreamWriter
	OutputStreamWriter(OutputStream out, Charset cs)
	// 创建使用给定字符集编码器的 OutputStreamWriter
	OutputStreamWriter(OutputStream out, CharsetEncoder enc)
	// 创建使用指定字符集的 OutputStreamWriter
	OutputStreamWriter(OutputStream out, String charsetName)
 特有方法:
    //返回此流使用的字符编码的名称 
    String getEncoding() 

InputStreamReader:字节流转字符流,它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

 	// 创建一个使用默认字符集的 InputStreamReader
	InputStreamReader(InputStream in)
	// 创建使用给定字符集的 InputStreamReader
	InputStreamReader(InputStream in, Charset cs)
	// 创建使用给定字符集解码器的 InputStreamReader
	InputStreamReader(InputStream in, CharsetDecoder dec)
	// 创建使用指定字符集的 InputStreamReader
	InputStreamReader(InputStream in, String charsetName)
 特有方法:
    //返回此流使用的字符编码的名称 
    String getEncoding() 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java IO 的相关文章

  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • 使用 TLS PSK 加密时如何正确检测流结束?

    我已经准备好了一个简单的 TLS PSK 客户端测试用例 https github com afarber jetty newbie tree master TlsPskClient2 src main java de afarber tl
  • 使用itext java库复制时pdf文件大小大大增加

    我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中 我使用的是 itextpdf 5 5 10 版本 我在两种方式上都面临着不同的问题 PDFStamper 和 PdfCopy 当我使用 PDFSt
  • 来自行号的方法名称

    给定特定类源代码 Java C 的行号 是否有一种简单的方法来获取它所属的方法的名称 如果它落入其中 大概使用抽象语法树 这对于将 checkstyle 的输出限制为仅触及的方法很有用 我假设您必须使用抽象语法树来执行 Line gt Me
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • java彩色滚动条搜索结果

    我将如何在 Java 中自定义滚动条 以便我可以进行像 chrome 一样的搜索 也就是说在结果所在的位置放置彩色条纹 我不想要一个库 因为我更喜欢自己编写代码 另外 我不想失去我拥有的 L F 欢迎举例 实际上 它将查看一个大的文本文件或
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • Kotlin 支持 Java 11 吗?

    我尝试使用 Kotlin V1 2 70 Gradle V4 10 1 和 Java 11 使用 gradle 编译项目时 出现错误 未知 JVM 目标版本 11 支持的版本 1 6 1 8 Kotlin 编译器是否支持 Java 11 生
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe

随机推荐

  • vue-admin 详细注释,必须手把手做项目系列之(二)

    文章将会自动保存至草稿 更新 麻雀虽小五脏俱全 项目地址 https github com whylisa vue admin step by step git 前言 这两天项目上线楼主要一大推的事要忙 要和产品撕逼 要和后台讨论一系列的问
  • selenium面试题

    今天有同学问到seleinum面试的时候会问到的问题 随便想了想 暂时纪录一下 欢迎大家在评论中提供更多问题 回复是我自己的答案 如果大家有什么好的看法 可以留言交流 去哪儿的面试题 selenium中如何判断元素是否存在 selenium
  • 【C++】 探索程序 详细解读程序在运行过程中都发生了什么

    目录 头文件 源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期 运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象
  • 解决某些软件无法在parallels desktop虚拟机下运行

    步骤1 打开注册表 点开始菜单 点运行 输入regedit exe后回车 步骤2 找到HKEY LOCAL MACHINE HARDWARE DESCRIPTION System 步骤3 找到右边的VideoBiosVersion 双击打开
  • 【计算机视觉

    文章目录 一 Precision Recall 和 F1 score 二 IoU 三 mAP 四 AP 4 1 定义 4 2 分类 4 2 1 APs 4 2 2 APr 4 2 3 两者之间的区别 一 Precision Recall 和
  • Linux Shell 常用命令总结

    1 find find pathname options print exec ok 让我们来看看该命令的参数 pathname find 命令所查找的目录路径 例如用 来表示当前目录 用 来表示系统根目录 print find 命令将匹配
  • ipad编写html,iPad HTML Focus

    Sorry folks I guess I have to bring you a bad news So much questions for HOW DO I FOCUS ON AN INPUT FIELD ON IPAD USING
  • c51两个定时器中断冲突_单片机学习day11—中断系统(外部中断 & 定时器/计数器)...

    51单片机的中断系统 非常非常非常重要 一 中断的概念 CPU在处理某一事件A时 发生了另一事件B请求CPU迅速去处理 中断发生 CPU暂时中断当前的工作 转去处理事件B 中断响应和中断服务 待CPU将事件B处理完毕后 再回到原来事件A被中
  • 蓝桥杯 算法训练 乘积最大Python实现(动态规划)详细

    资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 今年是国际数学联盟确定的 2000 世界数学年 又恰逢我国著名数学家华罗庚先生诞辰90周年 在华罗庚先生的家乡江苏金坛 组织了一场别开生面的数学智力竞赛的活动 你的一个好朋友
  • WPF应用无法从任务栏恢复(唤起)

    背景 两个window 一个在前 小屏播放视频 一个在后 全屏播放视频 点击切换按钮 两个window中的内容对调 当点击任意window上面的缩小按钮的时候 将所有的window的 windowState 设置为 minimized 期望
  • 数据结构—快速掌握如何手动求解关键路径

    看到一道题 分析如何手动求解关键路径 文末有题目出处 如上图 红点表示状态 边表示活动及其所需要的时间 这是用箭线表示活动 节点表示事件的一种网络图绘制方法 也称为双代号网络图 AOA 下面我们将利用其它快捷方法求出关键路径 方法一 逆推法
  • 美国国家安全局(NSA)网络攻击主战武器“酸狐狸”

    近日 国家计算机病毒应急处理中心对美国家安全局 NSA 酸狐狸 漏洞攻击武器平台 FoxAcid 进行了技术分析 该漏洞攻击武器平台是美国国家安全局 NSA 特定入侵行动办公室 TAO 也被称为 接入技术行动处 对他国开展网络间谍行动的重要
  • 乐高编程学c语言吗,乐高编程和少儿编程的区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 乐高编程和少儿编程的区别如下 1 乐高编程是以调用编程模块指令让机器动起来为目的 通常需要编程的模块是已经写好存储在模块里的 学员做的只是将模块以不同的方式拼接组合起来 2
  • DataGridView控件常用属性

    DataGridView控件常用属性 1 AllowUserToAddRow 去掉最后一行添加行的选项 2 RowHeadersVisble 去掉第一列包含行标题的列 3 AutoSizeColumnsMode 可见列的自动调整大小 4 S
  • C++ 预处理器

    预处理器是一些指令 指示编译器在实际编译之前所需完成的预处理 所有的预处理器指令都是以井号 开头 只有空格字符可以出现在预处理指令之前 例如 include 指令 这个宏用于把头文件包含到源文件中 C 还支持很多预处理指令 比如 inclu
  • 关系型数据库和NoSQL数据库探讨

    在当今数据时代 数据量持续增长 数据种类不断增加 使得传统关系型数据库面临了很大的挑战 为了解决这些问题 新型数据库技术也应运而生 同传统关系型数据库进行对比 就可以更好地了解其优点和局限性 1 传统关系型数据库的弊端 在传统关系型数据库中
  • 怎么用Python实现微信自动回复,一文看懂

    都什么年代了 不会还有人用itchat吧 itchat早就寄了 在网上搜用Python实现微信自动回复的 搜来搜去全是用itchat 一运行全都不行 无奈只能自己用别的库实现 根据预定的csv数据自动回复 import numpy as n
  • C# 泛型List相关用法以及与ArrayList和数组三者的区别

    数组 首先在C 也是存在数组的 用法如下 一维 string s new string 2 s 0 a s 1 b s 0 c 修改 二维 string arr new string 3 5 表示三行五列的二维数组 1 1 1 1 1 1
  • 收到字节跳动 java岗offer后,他终于哭出了声!

    在小刘拿到offer的那天下午 他打了个电话给我 他诉说着对我的感谢 吐槽面试遇到的奇葩事儿 最后 他激动的说 建哥 我终于不用担心变成失业人员了 找工作有多可怕 小刘是我亲自带的第一届实习生 他聪慧 一点就透 踏实 不懂就问 不会就学 这
  • Java IO

    相关概念 Java IO Java的核心库java io提供了全面的IO接口 包括 文件读写 标准设备输出等 Java中IO是以流为基础进行输入输出的 所有数据被串行化写入输出流 或者从输入流读入 流 流是一个很形象的概念 当程序需要读取数