Java I/O全文摘要(一)基本I/O,介绍

【Java】I/O 流篇 —— 字节 I/O 流 I/O流(Input/Output Stream)是计算机中数据传输的一种抽象概念,用于描述数据在程序和外部设备(如文件、网络、内存等)之间的流动方式。可以将它想象成一条“数据管道”,数据像水流一样在这条管道中连续传输。作用:I/O 流用于读写文件中的数据(可以是读写文件,或网络中的数据)。读(Read) → Input(输入)当程序从外部(如文件、键盘、网络等)获取数据时,称为“读”操作。例如:读取文件内容、接收用户键盘输入、获取网络数据等。这属于输入(Input) 阅读详情

本文摘要自Java I/O一书,选取中间精炼简单的部分,译成中文,并书写成文章。


1.什么是流? What is Stream?

A stream is an ordered sequence of bytes of indeterminate length.

流是长度不确定的字节序列.

输入流将其他通用的外部目标移入Java程序,而输出流则是将Java程序中的数据移到外部。

输入到Java程序的来源是多样的,输出流也有多种目的地。

所有的输入输出流在形式上是简单的,你使用相同的类和相同的方法来进行操作。


2.流来自什么地方?

最简单的输入流莫过于 System.in

输出流则是 System.out System.err


当然还有 文件流,网络流,管道流


3.大体有一些什么类呢?

最基本的:java.io.InputStream java.io.OutputStream


此外,还有(不必记住它们,后面会介绍)

BufferedInputStream

BufferedOutputStream

ByteArrayInputStream

ByteArrayOutputStream

DataInputStream

DataOutputStream

FileInputStream

FileOutputStream

FilterInputStream

FilterOutputStream

ObjectInputStream

ObjectOutputStream

PipedInputStream

PipedOutputStream

PrintStream

PushbackInputStream

SequenceInputStream


还有来自java.util.zip,java.util.jar包与压缩相关的流;

来自java.security和JCE的摘要和安全方面相关的流。


4.数值对象

由于InputStream 和OutputStream是以byte(字节)为单位进行读取写入的;

而Readers和Writers是以character(字符)为单位进行读写操作的,

所以必须理解Java是如何处理基本类型,以及如何将其中一个转化为另一个。


int 4byte ,big-endian(大端字节序)

BE:将高序字节存储在起始地址

例如:0x4321

0x4000 0x4001 0x4002 0x4003

     4          3          2           1

byte :8bit

但是,由于任何 int以下数字的加法都将转化为int,所以直接使用byte并非最佳实践。

byte b1 = 22;
byte b2 = 23;
byte b3 = b1 + b2;//error!need obvious cast

5.输入输出基本方法

处于这样的原因,所以输入流虽然是对byte进行读操作,但是返回值确实int

public abstract int read( ) throws IOException
使用0~255来表示读到的数据,使用-1表示流已经到达末尾。

而在输出流,也可以看到这样的实现:

public abstract void write(int b) throws IOException
注意,传入的数据b只运行0~255,否则将截取

使用b = b & 0x000000FF;

此外,允许读取数组:

public int read(byte[] data) throws IOException
public int read(byte[] data, int offset, int length) throws IOException

一批次读取多个byte能显著的提高效率,这是因为

单一的byte任然需要在JVM中占据4byte空间,但bytes数组占据了它实际所需空间的总和。

虽然byte只能保存-128~127,但是下面这个方法用于有符号型到无符号型的转化:

int unsignedByte = signedByte >= 0 ? signedByte : 256 + signedByte;

6.字符数据

Java程序需要进行处理的内容:数字是一部分,而文本是另一部分。

而字符码是和编码有关的,例如在Ascii中将A编码成65,B编码成66;不同的编码,不同的结果。

Java支持多种语言的多种编码方式,

Java内置使用Unicode字符集,它是Latin-1字符集的超集。


7. ASCII和Latin-1

American Standard Code for Information Interchange, is a 7-bit character set

Latin-1, is an 8-bit character set that's a strict superset of ASCII

Latin-1相当于在标准ASCII的基础上增加了1bit,然后新增了128个字符,用于表示拉丁文和一些图形


8. Unicode

Latin-1能够满足西欧国家的使用,但是却满足不了Cyrillic, Greek, Arabic, Hebrew, or Devanagari,

而中国,日本这类象形文字的就更不可能了,所以开发了Unicode。

它有100万种可能,能够满足绝大多数国家语言的需求。

[重要]Unicode只是一个字符集,而不是一种编码方式。

也就是说,虽然Unicode规定了A编码成65,但并没有说是用1个字节,2个字节还是4个字节,这就导致了多种可能。

但实际上最常用的编码方式还是UTF-8, UTF-16, and UTF-32。

UTF-32是最幼稚的编码方式,简单的使用4byte代表所有的数据。

UTF-16,使用2字节来表示常用字符,使用4字节来表示中文,音乐数学符号,和其他已经死亡的语言。

UTF-8,最高效的方式,1字节表示ASCII,2字节表示其他字母表,3~4字节来表示亚洲语系。


除了上面介绍的三种ASCII,Latin-1,Unicode以外,还有很多的字符集。


9. char数据类型

在Java中,文本主要由char,char array,String组成。

char由2个字节构成,使用默认的UTF-16进行编码。

[注意]String.getBytes()将会根据字符集来返回byte数目。


10. Reader和Writers

输入输出流是byte-based;而读写器是character-based,它依据不同的编码集而具有不同位宽。

例如ASCII 和 Latin-1 使用 1-byte characters. UTF-32 使用 4-byte characters. UTF-8 使用可变宽度的characters。

java.io.Reader和java.io.Writer是顶层的抽象类

包括各8个读写器:

BufferedReader
BufferedWriter
CharArrayReader
CharArrayWriter
FileReader
FileWriter
FilterReader
FilterWriter
InputStreamReader
LineNumberReader
OutputStreamWriter
PipedReader
PipedWriter
PrintWriter
PushbackReader
StringReader
StringWriter全部位于java.io包中。

对比与流,则是将其中的byte替换成了char

例如在OutputStream中,其中一个写方法为

public void write(byte[] data) throws IOException
则在Writer中,变为了

public void write(char[] data) throws IOException
,但是Writer提供了两个额外的方法,用于操作字符串。

public void write(String s) throws IOException
public void write(String s, int offset, int length) throws IOException

11. 缓冲与通道 Buffers and Channels

传统的流会阻塞进程,直到流结束,而过去的处理方式是起一个单独的线程来处理它。

而线程的创建和管理都需要大量工作。

Java1.4中引入了非阻塞I/O。

流只是一个代表,实际工作都在buffer和channel中完成了;

可多通道读取写入流,这样一个线程就处理多个通道的信息。

通道和缓冲还可用于内存映射的I/O,文件被当做大的内存块来使用。

被映射的文件可以使用诸如

int x = file.getInt(1067)来的形式来读取,或者

file.putInt(x, 1067) 形式来写入。

通道和缓冲比流和字节要复杂,但是对于特定的应用程序,这些复杂度是值得的。


12. 普遍存在的异常 The Ubiquitous IOException

自从计算机运转开始,输入输出就不可靠。

几乎每一个输入输出流都将抛出 IOException,它是一个受检异常。

所以,你使用这些流时,要么抛出异常,要么try catch 它。唯一的例外是PrintStream and PrintWriter。

IOException有很多子类,用于表示特定的I/O异常。


13. 控制台 System.out, System.in, and System.err

System.out与 C或者Unix中的stdout一致

System.err通常没啥用,debug的时候可能会用到

System.in标准输入

这几个流都可重定向:

public static void setIn(InputStream in)
public static void setOut(PrintStream out)
public static void setErr(PrintStream err)


SAP FICO 中的 F-02 :概念、使用场景及案例解析 在 SAP FICO (财务会计与管理会计) 模块中,F-02 是一个用于录入总账凭证的事务代码。这个事务代码主要用于手动输入总账凭证,适用于各类财务交易,例如资产购入、费用支付、收入确认等。F-02 的重要性在于,它允许财务人员在 SAP 系统中创建凭证,并确保这些凭证能够正确影响总账账户。 阅读详情

相关推荐

Latex在VSCODE中编译报错`Recipe terminated with error. Retry building the project.

Latex在VSCODE中编译报错Recipe terminated with error. Retry building the project. 1 报错提示: Recipe terminated with error 2 报错原因 大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况 3 解决方案 请按照如下方式进行系统变量的添加 对windows,win+R 然后输入sysdm.cpl 在高级中选择环境变量 找到path环境变量,将txtlive中

呆呆象呆呆的博客 3万+

【JAVA】I/O 基本操作

I/O 基本操作 详解

weixin_37559642的博客 1192

多模型对抗性审查:用AI辩论提升技术文档质量

在软件工程领域,技术文档是团队协作和项目成功的关键基础。传统的文档评审依赖人工经验,存在盲区和效率瓶颈。通过引入多模型对抗性审查机制,不同大语言模型从各自视角对文档进行批判性分析,模拟现实中的专家评审过程。这种技术方法的核心价值在于利用模型间的思维差异,自动发现单个视角容易忽略的边界情况、逻辑漏洞和隐含假设。在应用场景上,特别适合产品需求文档和技术规格书这类需要多角度审视的复杂文档。adversarial-spec工具通过Claude协调多模型辩论,实现从概念到实现的完整文档质量保障,显著提升文档的完整性和

weixin_42531579的博客 379

Java I/O 流介绍

流是一种抽象的概念,它代表了数据的序列。数据就像水流一样,从一个地方流向另一个地方。在 Java 中,流可以是输入流,用于从外部源读取数据;也可以是输出流,用于将数据写入到外部目标。Java 的 I/O 流体系提供了丰富的类和接口,使得开发者能够方便地处理各种输入输出任务。字节流适用于处理二进制数据,字符流适用于处理文本数据。缓冲流可以提高 I/O 操作的效率,对象流则允许我们进行对象的序列化和反序列化。在实际开发中,我们需要根据具体的需求选择合适的流类来完成数据的读写操作。

zsnandzmn的博客 1003

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1235

星链V3的2048条波束与1Tbps:多波束相控阵的工程代价

低轨卫星通信的容量提升,核心在于多波束相控阵天线的空间复用能力。相控阵通过控制大量天线单元的相位,可在同一阵面同时形成多条独立指向的波束,从而在有限频谱内成倍提升系统容量。星链V3宣称的2048条波束与1 Tbps汇聚吞吐量,正是基于这一原理:更多波束意味着更高的频率复用系数和更灵活的资源调度。但工程实现并非免费午餐,数字背后是供电、散热、重量、发射成本及运维复杂度的急剧攀升。从用户侧看,更精细的波束也带来切换频繁、低仰角衰减等新挑战。本文从多波束相控阵的基础原理出发,拆解波束形成、频谱复用和动态调度的工程

weixin_33462167的博客 346

Java I/O模型的演变:从阻塞I/O到异步I/O的底层机制解析

以上代码示例展示了各种I/O模型的基本用法,从阻塞I/O的简单粗暴,到异步I/O的高效并发,每种模型都有其适用的场景。理解这些模型的底层机制,可以帮助我们根据实际需求选择合适的I/O模型,编写出高性能、高并发的Java应用程序。I/O模型的演进是为了解决并发问题,选择哪种模型取决于具体场景。阻塞I/O简单但并发低,非阻塞I/O解决了阻塞但消耗CPU,I/O多路复用提高并发,异步I/O实现了真正的高效并发。

weixin_41455464的博客 1495

数字电子时钟——数字电路课设

本文设计了一种基于中小规模集成电路的数字电子时钟系统,采用模块化设计方法,包含晶振电路(CD4060+D触发器)、计时电路(74HC161计数器)、数码管驱动(CD4511)和整点报时功能。系统实现了60进制秒/分、24进制小时、7进制星期的计时显示,支持手动校时功能,并具备整点报时特性(59分54-58秒5次500Hz低音,59秒1次1000Hz高音)。通过分模块调试与整合,最终实物电路满足设计要求,获得优秀评价。

来自FZU——电子科学与技术专业 1487

深入分析 Java I/O (一)概述

一Java 的 IO 类库 基于字节的 IO 操作接口 基于字符的 IO 操作接口 字节与字符的转化接口 二磁盘 IO 工作机制 三Java Socket 的工作机制 建立通信链路 数据传输 四NIO 的工作方式 BIO 带来的挑战 NIO 的工作机制 Buffer 的工作方式 五IO 调优 磁盘 IO 优化 性能检测 提升 IO 性能 网络 IO 优化 同步与异步 阻塞与非阻...

keep_trying的专栏 1469

【教程4>第5章>第19节】基于Gardner环的位同步系统MATLAB仿真与带时偏基带数据导出

由于在FPGA中,时偏的影响主要是由系统收发两端晶振的不同步带来的,所以在仿真测试阶段,很难直接通过FPGA来模拟这个因素,所以我们采用MATLAB模拟带时偏的基带输入信号,并将其导出,由FPGA调用作为测试信号源。可以看到,同步之后(图3)相对于带时偏的基带信号(图2),其更接近标准的数据(图1),且抖动较小。订阅过的朋友可以复习下这个课程,没有订阅的朋友,也可以直接复制如下的程序进行仿真测试。上述程序中,加入时偏的基带信号,通过子函数。同步之后,可以恢复出标准的QPSK星座图。

FPGA/MATLAB学习教程/源码/项目合作开发 520

高通Camx功能feature分析之十:高通NCS服务之注册和启动

本文介绍了高通NCS(非相机传感器)服务的注册与启动流程。NCS通过QMI接口访问陀螺仪等传感器,为相机EIS/AEC等功能提供辅助数据。文章详细解析了服务注册时的QueryCapabilites能力查询、RegisterService注册流程,以及通过StartNCSService启动服务线程的过程。重点包括:1)AF/EIS等节点通过NCSService创建传感器对象;2)注册时需校验传感器类型和接口;3)首次注册成功后会启动NCS服务线程;4)采样率变化时需重新配置会话。通过线程池管理实现传感器数据的

1261

Java的I/O演进之路

一、I/O 基础入门 Java1.4之前的早期版本,对I/O的支持并不完善,开发人员在开发java高性能IO程序的时候,会面临一些巨大的挑战和困难,主要问题如下: 没有数据缓存区,IO性能存在问题 没有C或者C++的Channel概念,只有输入、输出流 同步阻塞式I/O通信(BIO),通常会让通讯线程长时间的阻塞服务端的响应 支持的字符集有限,硬件可移植性不好 在Java支持异步通讯之前的很长一段时间里,一直都是C/C++长期占据着高性能服务端程序开发的语言,Java的同步阻塞式I/O一直被人们锁所诟病

csdn5215的博客 8016

华为OD新系统机试真题 - 失灵的键盘(C/C++/Py/Java/Js/Go)

华为OD新系统机试真题 【失灵的键盘】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【失灵的键盘】

qq_45776114的博客 1064

Java I/O

在 Java 中,I/O 模型主要分为三种:BIO(Blocking I/O,同步阻塞 I/O)、NIO(Non-blocking I/O,同步非阻塞 I/O) 和 AIO(Asynchronous I/O,异步非阻塞 I/O)。它们分别代表了不同的 I/O 处理方式,适用于不同的应用场景。Java 的 I/O(输入/输出)是 Java 编程中非常重要的一部分,用于处理数据的读取和写入。在 Java 的 I/O 中,同步/异步和阻塞/非阻塞是两个重要的概念,它们描述了 I/O 操作的行为模式和性能特性。

qq_33807380的博客 699

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java的I/O历史

Java的I/O历史

AiFlutter的博客 1251

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java语言基础(九)Java I/O 流

本篇文章主要介绍了 Java 中的 I/O ,其中最重要的是 I/O 流的概念,然后举例说明了一些常用的输入输出操作,包括控制台、文件和网络中的数据输入输出。

青何 3184

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 的 I/O 类库的基本架构

Java 的 I/O 类库的基本架构 原文地址:https://developer.ibm.com/zh/articles/j-lo-javaio/ 目录Java 的 I/O 类库的基本架构前言:1、基于字节的 I/O 操作接口2、基于字符的 I/O 操作接口字节与字符的转化接口3、磁盘 I/O 工作机制4、Java Socket 的工作机制建立通信链路数据传输5、NIO 的工作方式BIO 带来的挑战NIO 的工作机制6、Buffer 的工作方式7、I/O 调优磁盘 I/O 优化性能检测提升 I/O 性能8

zyfhhhw的博客 218

Java—I/O操作

IO 即,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。InputStream/Reader: 是所有的输入流的基类,InputStream是字节输入流,Reader是字符输入流。

m0_54049074的博客 1034

Java I/O(一)I/O概述

I/O,内存I/O,磁盘I/O,网络I/O,Java I/O,同步 I/O,异步I/O, 阻塞I/O,非阻塞I/O

yunyun1886358的专栏 891

网络I/O介绍

网络 I/O(Input/Output)涉及在计算机网络中传输数据的输入和输出过程。

Alaskan_Husky的博客 1051

Java I/O全文摘要(三)基本I/O,输入流

1 输入流 java.io.InputStream是一个抽象的超级类,它是

computer165的专栏 583

深入理解 java I/O

Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。正因如此,所以 Java 在 I/O 上也一直在做持续的优化,如从 1.4 开始引入了 NIO,提升了 I/O 的性能。关于 NIO 我们将在后面详

Java 攻城狮~~ 1313

Linux系统的I/O操作与Java的I/O模型

1. **阻塞 I/O**:Java 的传统 I/O 模型(BIO)直接依赖 Linux 的阻塞 I/O 系统调用(如 `read()` 和 `write()`),每次 I/O 操作都会阻塞线程,直到操作完成。 2. **非阻塞 I/O 和 NIO**:Java NIO 的非阻塞 I/O 操作依赖于 Linux 提供的非阻塞 I/O 系统调用(如 `fcntl` 或 `ioctl`)

itsniu的博客 897

Unix I/O与Java I/O

文章目录背景Unix I/O模型阻塞I/O模型非阻塞I/O模型I/O多路复用模型I/O多路复用技术信号驱动I/O模型异步I/O模型五种I/O模型的比较Java IO模型IO(面向流的,也叫BIO)NIOBufferChannelSelectorNIO2(AIO)Netty 背景 Unix I/O模型 I/O模型一共有哪些策略,JavaI/O是对这些策略的具体实现 阻塞I/O模型 第一阶段copy阻塞,第二阶段copy阻塞; 进程在整个recvfrom期间阻塞,即recvfrom没完成前,进程都处

qq_42647047的博客 633

《Java I/O》Chapter 1

Chapter1 介绍I/O 输入和输出,简称I/O,是任何计算机操作系统或编程语言的基础。只有理论家才觉得编写不需要输入或产生输出的程序很有意思。 与此同时,I/O几乎没有资格成为计算机科学中更“惊心动魄”的主题之一。它是偏向底层的技术,你每天都在使用它——但对于大多数开发者来说,它不是一个很具有吸引力的话题。 但实际上,Java程序员应该发现I/O很有趣。Java在核心API中包含了一组特别丰...

stepMore的博客 849
上一篇: Building and Running
下一篇: Java I/O全文摘要(二)基本I/O,输出流
computer165
博客等级 码龄16年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值