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

java I/O知识点总结 java I/O知识点总结1、I/O操作相关类和接口1.1、File类简介2、I/O流类结构图3、流的概念和作用4、IO流的分类4.1、字符流和字节流4.2、输入流和输出流5、Java IO流对象简介5.1、字节流的输入和输出的结构5.1.1、输入字节流5.1.2、输出字节流5.1.3、字节流简单的例子5.2、字符流的输入和输出的结构5.2.1、输入字符流5.2.2、字符输出流Writer5.2.... 阅读详情

1. 输入流

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

它声明了从流中读取数据的三个基本方法;

它也声明了关闭流,检查可用字节数,跳过一定字节数,设定用于回退的标记位置,以及决定是否支持回退和标记。


2 read()方法

read方法是InputStream最基本的方法,得到一个0~255的无符号数.

方法签名为:

public abstract int read( ) throws IOException

虽然读取得到的是byte,但是返回的确是int。

这是由于只使用byte时,只能表示-128~127.

方法可能会抛出异常,所以你需要捕获其可能抛出的IOException。

但是,当读取到达末尾时,它不会抛出异常,而是返回-1。

此外,大多数读取是没有超时限制的(网络流除外),所以如果你在干别的重要的事情,最好把I/O 放在单独的线程里。


3 从流中读取大块数据

输入和输出通常是程序性能的瓶颈,

从磁盘中读取数据通常比从内存中读取慢几百倍,因此减少读取次数能够有效提升性能。


所有覆盖了read的方法都是通过读取一大块连续数据到一个数组里。

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

默认的实现只是调足够多次read来填充数组.

而子类提供了更高效的实现,有些是native层面的。


4 计算可用字节数

有时,你需要在实际读到不可读byte前,知道还有多少字节可读。

方法签名为:

public int available() throws IOException

例如按如下方式使用:

try {
  byte[] b = new byte[100];
  int offset = 0;
  while (offset < b.length) {
    int a = System.in.available( );
    int bytesRead = System.in.read(b, offset, a);
    if (bytesRead == -1) break; // end of stream
    offset += bytesRead;
}
catch (IOException ex) {
  System.err.println("Couldn't read from System.in!");
}

但是这段代码中有一个潜在的问题。如果有超过数组边界的可读数据呢?

为了解决这个问题,可能有哪个傻子创建了等同于可读数据长度的数组:

try {
  byte[] b = new byte[System.in.available( )];
  System.in.read(b);
}
catch (IOException ex) {
  System.err.println("Couldn't read from System.in!");
}

这在一个read时当然没问题,但是多个read就有问题了:将会导致创建过量的数组。

默认的java.io.InputStream的available( )方法总是返回0。

你无法确保子类覆盖了它,也有可能子类对它的实现是阻塞的,不论怎么说,你应该在单独的线程中来使用它。


5 跳过字节 Skipping Bytes

方法如下:

public long skip(long bytesToSkip) throws IOException

返回值是实际跳过值,它可能小于bytesToSkip。

Skipping通常快于读取并丢弃他们。


6 关闭输入流

通过关闭,输入流像输出流一样释放掉native资源。

public void close( ) throws IOException


一但你关闭了一个流,你就不应该再读取它。否则大部分情况下会抛出一个IOException。

也不是所有的流都需要关闭,例如System.in通常无须关闭。

然而,与网络或者文件的流通常都需要关闭。

为了确保关闭,你应该在finally中执行close操作。


7 标记和重置

并非所有的InputStream都支持标记和重置


public void    mark(int readLimit)
public void    reset( ) throws IOException
public boolean markSupported( )

如果markSupported为true则支持;如果为false则不支持,那么调用reset()将导致抛出IOException,而mark什么也不做。

已知的支持类有:BufferedInputStream和ByteArrayInputStream

注意:这里的设计确实不是很好,因为不是所有子类都支持的方法不应该放在超类中,然后通过这种方式去实现。但是在Java1.0时代,面向对象的设计理念还没有被普遍接受,所以这样的设计就出来了。


8 有效率的流拷贝

使用1K左右的buffer

public static void copy(InputStream in, OutputStream out)
   throws IOException {
    byte[] buffer = new byte[1024];
    while (true) {
      int bytesRead = in.read(buffer);
      if (bytesRead == -1) break;
      out.write(buffer, 0, bytesRead);
    }
  }


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

相关推荐

面向多目标跟踪的数据关联方法研究综述

摘要:多目标跟踪技术在军事和民用领域具有广泛应用,其核心挑战在于数据关联问题。本文系统梳理了数据关联的主要解决方法,首次将经典算法分为确定性关联和概率性关联两大类。确定性关联(如NNDA、GNN、MHT)采用"硬分配"策略,计算效率高但易受噪声干扰;概率性关联(如PDA、JPDA、PMHT)通过"软分配"处理不确定性,更适合复杂场景。文章详细分析了各类算法的原理、适用条件和优缺点,并探讨了智能学习等新兴技术在视觉跟踪等领域的应用。研究指出,尽管随机集滤波等新方法出现,

qq_43416206的博客 1139

Java入坑之IO操作

根据流包含的数据,可以将其分类为:字节流字符流。

qq_62377885的博客 1520

XMind文件解析黑科技:用Python实现版本自适应读取(兼容2010-2024)

本文深入探讨了如何利用Python实现XMind文件的版本自适应解析,兼容从2010到2024年的各版本。通过分析XMind文件作为ZIP压缩包的本质,文章提供了智能探测文件内部结构(JSON或XML)并构建健壮读取逻辑的完整方案,有效解决了版本兼容性难题,并演示了将解析数据转换为PlantUML等下游应用的实战案例。

weixin_29041767的博客 682

IO流 四、字节流

编码问题 File类的使用 RandomAccessFile 字节流 字符流 对象的序列化和反序列化 4-1 字节流之文件输入流FileInputStrream-1 IO流(输入流、输出流) 字节流、字符流 1.字节流 1)InputStream、OputStream InputStream抽象了应用程序读取数据的方式 OutputStream抽象了应用程序写出输出的方式 2...

qq_40638497的博客 233

深入解析LinuxCNC源码:从界面开发到硬件交互

本文深入解析LinuxCNC开源数控系统的源码架构与二次开发实践。详细介绍了从GTK+界面定制、Python脚本绑定,到硬件抽象层(HAL)配置与核心运动控制模块的完整开发流程。通过实战案例,帮助开发者掌握如何基于LinuxCNC源码进行界面开发和硬件交互定制,实现个性化数控系统。

weixin_29164843的博客 540

记录:N10激光雷达串口编程,将数据存进 SQLite,并进行 ROS2 - cartographer 单雷达建图

N10 系列采用 TOF(time of flight)测距原理,通过测量调制激光的发射、返回时间差来测量物体与传感器的相对距离。激光发射器发出调制脉冲激光,内部定时器开始 从t1时刻计算时间,当激光照射到目标物体后,部分能量返回,当雷达接收到返回的激光信号时,在t2时刻停止内部定时器计时,光速C,激光雷达到达物体的距离D为:经过N10系列激光雷达内嵌的信号处理单元的实时解算得到探测物体的距离值,结合高精度自适应角度测量模块输出的角度信息,可以得到量程内周围 360 度环境 的二维平面信息。

m0_74013893的博客 1096

Java之IO流学习总结

流:可以理解为数据的流动,就是一个数据流,IO流最终要以对象来体现 流的分类:     按照流的方向:输入流和输出流  (输入流只能进行读操作,输出流只能进行写操作)     按照处理数据的不同:字节流与字符流 (若处理的数据是纯文本类型的用字符流,其他全用字节流) 字节流:处理字节数据的流对象,无论是图片、文字、视频,他都可以以二进制存储,所以字节流可以 处理设备上

TH226的专栏 454

电子系统设计与创新实践作品:简易电子琴

题目 4:简易电子琴 (1)具有8个音阶按键,每个音阶按键频率如表1所示。 (2)每个按键对应LED显示。 (3)音阶信号经功放连接8欧姆扬声器,输出功率可达1W。 (4)每个音阶输出音量一样。 (5)扬声器输出音量可调节,音量调节分为高、中、低三档,并进行档位显示。

weixin_47510497的博客 2856

Hadoop笔记

大数据指高速 (Velocity) 涌现的大量 (Volume) 多样化 (Variety) 具有一定价值( Value )并且真实( veracity )的数据,其特性可简单概括为 5V高速: 数据每秒产生的速度相对比较块大量: 数据总量一般比较庞大,所考虑的存储和计算与一般的其他技术会不一样。

sheep55的博客 1071

Natural Language Processing

作者:禅与计算机程序设计艺术 1.简介 自然语言处理(NLP)是研究如何使计算机理解和处理自然语言的理论和方法,目的是让电脑更好的理解、获取、生成、存储和沟通人类语言。20世纪80年代末,IBM的三位博士陈天奇、周博磊和王力雄在贝尔实验室创建了首个自然语言处理系统——“布莱克多·艾森豪威尔”(Bletc

AI天才研究院 724

高通拨号流程介绍

本文介绍了高通平台(如SDX55)中APSS(A7处理器)与ModEM(Q6处理器)间的通信机制。

四儿家的小祖宗的博客 1067

使用java打包为zip文件

String dir="e:/testPicture"; File d = new File(dir); if (!d.isDirectory()) throw new IllegalArgumentException("Not a directory: " + dir); ...

chuoxieai9700的博客 271

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 895

Java I/O(三)文件I/O

Java文件I/O 字节流 字符流 输入流 输出流

yunyun1886358的专栏 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java—I/O操作

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

m0_54049074的博客 1034

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【JAVA】I/O 基本操作

I/O 基本操作 详解

weixin_37559642的博客 1192

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA的I/O流

I/O

Zonzereal的博客 3260

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

Java基础——I/O流

流是一种抽象的概念,它代表了数据的有序传输。就像水流一样,数据从一个源(如文件、网络连接)流向一个目标(如内存、另一个文件)。在Java中,流可以看作是一系列的数据序列,程序可以从流中读取数据(输入流),也可以向流中写入数据(输出流)。Java的I/O流提供了丰富的类和方法,用于处理各种数据传输需求。通过合理选择字节流、字符流、处理流和对象流,可以高效地完成文件读写、网络通信等任务。在使用I/O流时,要注意资源的正确关闭,避免资源泄漏。同时,要根据具体的应用场景选择合适的流类型,以提高程序的性能和可维护性。

jukuya的博客 995

Java中的I/O流

参考文章:JAVA中IO流详解

谢公子的博客 1680

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流详解

定义:在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。说明:字节流是程序中最常用的流。在JDK中,所有的字节输入流都继承自 InputStream,所有的字节输出流都继承自 OutputStream。相较于字节流处理所有的文件,文件流只能用与处理文本数据,也就是我们所说的txt文件,其中也和字节流的形式差不多,都是拥有输入流和输出流,但是他们的基类有差距,分别是Reader 类和Write类.

qq_45705626的博客 946

Java之I/O

文章目录Java I/O1.File文件操作类1.1常用操作方法1.2目录操作1.3取得文件信息1.4列出目录中全部组成2.字节流与字符流2.1字节输出流(OutPutStream)2.2字节输入流(InputStream) Java I/O 核心掌握五个类(File、OutputStream、InputStream、Reader、Writer)一个接口(Serializable) 1.File文...

perfectmatch_G的博客 793

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

Java的I/O历史

Java的I/O历史

AiFlutter的博客 1251

Java——I/O流总结

在Java中File类对象,可以用来操作文件,但是不能处理文件内容 为了处理文件内容,进行 I/O 操作,必须使用流的操作模式来完成 I/O流体系结构图: I/0流分类: 1)根据处理的数据类型分为:字节流和字符流 2)根据处理的数据流向分为:输入流和输出流 字节流与字符流的区别: 字节流和字符流操作的本质区别只有一个:字节流是原生的操作,而字符流是经过处理后的操作。 ...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值