Java基础 - I/O的第一个层次

I/O基础知识入门 前言 在我们开始学习netty之前,我们非常有必要先来简单的了解一下I/O相关的知识,因为netty所有的努力都是基于操作系统对I/O的不断优化和Java对这些能力的不断支持,所以我们在开始学习netty之前一定要先学习一下I/O相关的基础知识 概念解释 I/O I/O : I/O是Input和Output的缩写,意思就是输入/输出,根据操作对象的不同,可以分为内存I/O、磁盘I/O、网络I/O等,和Unix操作系统和Linux操作系统中,所有的组成元素都是一个文件,文件就是一种流的外在表现形式,对这些数 阅读详情

 

所谓我理解的学习Java I/O的第一个层次

作者:写写心情的猪

参考资料:<<Java I/O>>2rd Edition

Java's I/O libraries are designed in an abstract way that enables you to read from external data sources and write to external targets, regardless of the kind of thing you're writing to or reading from. You use the same methods to read from a file that you do to read from the console or from a network connection. You use the same methods to write to a file that you do to write to a byte array or a serial port device.

PS:我觉得理解IO的第一个层次就是会使用InputStream,OutputStream这两个抽象类,只了解一点点它们的子类(只知道子类名字,不知道具体用法)。

具体来讲就是知道有InputStream,OutputStream这两个抽象类,它们是很多具有专门用途的IO类的父类,这些具有专门用途的IO类不必要去了解。你只要通过这两个类去读取或写入,而不管是从网络读取或丛文件读取(还可以从很多其他地方存取,蓝牙,串口设备。。)。所以了解和会使用这两个类,你的Java程序也就打开了跟外部的大门。(实际上这两个类很好使用,只有很少的方法)

 

       “这些具有专门用途的IO类可以先不必要去了解,你只要通过这两个类去读取或写入” 这句话可以这么理解

比如,URLConnection这个类有个public OutputStream getOutputStream( ) throws IOException 方法,可以返回一个OutputStream

       URLConnection con = new URLConnection(URL u);

       OutputStream out = con.getOutputStream();

       这里的out是什么呢?只是一个OutputStream类吗?显然不是,这个OutputStream是某个具体的IO类(它的子类)可能是sun.net.TelnetOutputStream或者sun.net.smtp.SmtpPrintStream 。。。。 你不清楚这个out到底指的是什么(实际上也不用去清楚),但是你通过OutputStream的wrint(byte[] data)方法,却可以向另外一端写入数据。(这就是面向对象的神奇的地方之一了,这个out表示“现在有一个OutputStream可以用了,你快用吧,其它的你不用管了“)。

       (这里另外值得注意的是抽象类 URLConnection,它代表应用程序和 URL 之间的通信链接。这里你本身不知道这个con到底是个什么样的连接,http?ftp?或者指向的是一个本地jar包?根据构造器的参数u返回实际的处理通信链接的具体子类,这个con也可以这么认为”现在返回一个连接了,你管它是什么连接呢,反正用吧”)

      

我觉得可以把程序和外部资源想象成2个点,你要使用外部资源,就要知道那个外部资源(URL)的点在那里,你就用URLConnection这把枪去射击那个资源点(URL),射中后会有根线(con)连接在程序和资源(URL)上面,然后你就用在这根线上铺设(getOutputStream())一个管道,铺设成功后就返回一个管道(out),你就对着管道抽取那资源,或者顺着管道往资源处加送程序的资源。(这段话纯属个人想象)

 

       The java.io.OutputStream class declares the three basic methods you need to write bytes of data onto a stream. It also has methods for closing and flushing streams:

 void

close()
          
关闭此输出流并释放与此流有关的所有系统资源。

 void

flush()
          
刷新此输出流并强制写出所有缓冲的输出字节。

 void

write(byte[] b)
          
将 b.length 个字节从指定的字节数组写入此输出流。

 void

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

abstract  void

write(int b)
          
将指定的字节写入此输出流。

 

 

       java.io.InputStream is the abstract superclass for all input streams. It declares the three basic methods needed to read bytes of data from a stream. It also has methods for closing streams, checking how many bytes of data are available to be read, skipping over input, marking a position in a stream and resetting back to that position, and determining whether marking and resetting are supported.

 int

available()
          
返回此输入流方法的下一个调用方可以不受阻塞地从此输入流读取(或跳过)的字节数。

 void

close()
          
关闭此输入流并释放与该流关联的所有系统资源。  (PS:输入流可能占用非常稀有的资源,如文件句柄或网络端口号,所以使用完了一定要关闭)

 void

mark(int readlimit)
          
在此输入流中标记当前的位置。                  (PS:一般只能有一个标记,设置第二个标记为消除第一个标记)

 boolean

markSupported()
          
测试此输入流是否支持 mark 和 reset 方法。   (PS:在使用mark方法前先用此方法测试输入流是否支持mark)

abstract  int

read()
          
从输入流读取下一个数据字节。

 int

read(byte[] b)
          
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。

 int

read(byte[] b, int off, int len)
          
将输入流中最多 len 个数据字节读入字节数组。

 void

reset()
          
将此流重新定位到对此输入流最后调用 mark 方法时的位置。

 long

skip(long n)
          
跳过和放弃此输入流中的 n 个数据字节。

 

一些简单的代码框架:

关闭输入流

// Initialize this to null to keep the compiler from complaining

// about uninitialized variables

InputStream in = null;

try {

  URL u = new URL("http://www.msf.org/");

  in = u.openStream( );

  // Read from the stream...

}

catch (IOException ex) {

  System.err.println(ex);

}

finally {

  if (in != null) {

    try {

      in.close( );

    }

    catch (IOException ex) {

      System.err.println(ex);

    }

  }

}

PS:在finally里关闭输入流是个不错的方法。

关闭输出流

// Initialize this to null to keep the compiler from complaining

// about uninitialized variables

OutputStream out = null;

try {

  out = new FileOutputStream("numbers.dat");

  // Write to the stream...

}

catch (IOException ex) {

  System.err.println(ex);

}

finally {

  if (out != null) {

    try {

      out.close( );

    }

    catch (IOException ex) {

      System.err.println(ex);

    }

  }

}

An Efficient Stream Copier

import java.io.*;

public class StreamCopier {

  public static void main(String[] args) {

    try {

      copy(System.in, System.out);

    }

    catch (IOException ex) {

      System.err.println(ex);

    }

  }

  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);

    }

  }

}

 

PS:下面一篇文章我会谈下所谓我理解的I/O的第二个层次 知道各个具体的子类的区别,即知道各种架设的管道的材质和适用的范围。

Java中的五种I/O模型详解 输入/输出(I/O)是计算机程序与外部环境(如文件、网络等)进行交互的方式。Java语言提供了多种I/O模型,帮助开发者处理数据读写和通信。本文将深入探讨Java中的五种I/O模型:阻塞I/O、非阻塞I/O、选择器I/O、NIO(New I/O)以及异步I/O,分析它们的工作原理、优缺点和适用场景,以帮助读者全面理解Java的I/O处理机制。 阅读详情

相关推荐

【Java】I/O 流篇 —— 字节 I/O 流

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

m0_72516377的博客 1301

Java网络编程(输出流 OutputStream)

网络程序所做的很大一部分工作都是简单的输入输出: 将数据字节从一个系统移动到另一个系统。字节就是字节。在很大程度上讲: 读取服务器发送给你的数据与读取文件并没有什么不同。 向客户端发送文本和写文件也没有什么不同。但是,Java中输入和输出(I/O)的组织与其他语言都不太一样。因此,这里说一下Java独特的I/O方法。 Java的I/O建立在流(stream)之上。 输入流读取文件,输出流...

young_1004的博客 6534

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了YOLOv11多模态融合技术,重点介绍基于YOLOFuse框架的RGB与红外线(IR)协同检测方法。通过动态权重分配、跨模态特征对齐等创新设计,实现在低光照等复杂环境下的高精度目标检测,mAP提升高达37%。文章包含实战案例、训练技巧和部署方案,为计算机视觉开发者提供完整的多模态融合解决方案。

weixin_29038345的博客 290

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

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

java基础I/O

3.4 字符流通常一次会读取多个字符,比如一行字符,CopyLine.java 就是按行读取写入的例子,一串带有行终止符的字符称为一行。用了缓冲流呢,每次读取8192个字节,回来复制一下,write(int i)复制时呢就是一个字节一个字节复制的,write(byte[8192],0,len)就是每次复制8192个字节,当然最快。IO流代表的是一个数据输入的源或者输出的目标地址,可以是硬盘,内存,网络或者什么其他的电子设备,而IO流的类型也很多比如最简单的字节或者字符,或者其他更高级的对象。

lx18854869896的博客 1603

PCIe(二) —— 配置空间

好了,这一篇我们把配置空间的结构,分配和访问,都大概总结了一遍,并且还介绍了它们的头部字段和这些字段的意义,包括BAR和消息路由的原理。之后,如果有时间,我们会继续来探索PCIe的数据报文的结构和传输等等。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1767

Java NIO编程理论基础篇——Java I/O的发展以及linux网络I/O模型

发展简述: Java在jdk1.4之前,Java对I/O的支持并不完善,开发人员会遇到许多问题,例如: 没有数据缓冲区,性能较低; 没有C或者C++中的Channel概念,通常 ...

sdr_zd的博客 5677

人工智能训练师三级补贴3120元申领全攻略|条件+流程+五省市对比

补贴是真的,但不是"白给"的。你需要满足社保、户籍、时间等条件,严格按照流程操作。记住四件事先确认自己是否满足条件,再报名——别考完了才发现领不到紧缺工种补贴更高——确认你所在城市是否在紧缺目录中证书下发后12个月内申请——设个日历提醒材料准备齐全再提交——避免来回折腾如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证到申领补贴的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1520

无刷电机里的霍尔传感器,和 AS5600 编码器到底有什么区别?

摘要: 无刷电机中的霍尔传感器主要用于换相控制,提供6种状态反馈,无法实现精确角度测量。与AS5600磁编码器(分辨率4096)相比,霍尔仅能确保电机“转得对”,而编码器则用于高精度角度反馈。在机器人等需要位置闭环的场景中,两者需协同使用:霍尔负责基础换相,编码器提供精确角度控制。简单应用中可仅用霍尔,但高精度定位必须搭配编码器。

qq_45430571的博客 242

Java基础——I/O流

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

jukuya的博客 995

ArcGIS Pro SDK (二十五)工作流管理器

【代码】ArcGIS Pro SDK (二十五)工作流管理器。

Winemonk 494

I/O编程基础知识

编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象。“流”概念源于UNIX中的管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等,它屏蔽了实际的I/O设备中处理数据的细节。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Inte

辙忆 3039

ABAP Cloud:面向云时代的 ABAP 开发范式与实践指南

摘要: 本文系统讲解SAP ABAP Cloud开发模型,涵盖其架构、工具链、规范及实践。ABAP Cloud作为统一开发模型,支持在SAP BTP和S/4HANA上构建云就绪应用,遵循clean core原则,通过RAP(RESTful应用编程模型)实现低耦合扩展。文章详细解析其核心构成(RAP、稳定API、clean core约束)、工具链(ADT、软件物流)及两种典型扩展场景(on-stack与side-by-side),并附可运行RAP示例代码(如销售笔记应用)。重点强调通过规范开发确保系统可升级性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 391

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

青何 3184

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

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

Java笔记十九.深入解析I/O编程之流的层次结构

深入解析I/O编程之流的层次结构 转载请表明出处:http://blog.youkuaiyun.com/u012637501(嵌入式_小J的天空)     大多数应用程序都需要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络。所谓I/O(Input/Output缩写),即指应用程序对这些设备的数据输入与输出。在程序中,键盘被当作输入文件、显示器被当作输出文件使用。Java语言定义了许多专门负责各种方

嵌入式Developer_小J的天空 2133

Java的I/O历史

Java的I/O历史

AiFlutter的博客 1252

JAVA基础-I/O

本文摘要: Java文件操作主要涉及File类、流处理和序列化三部分。File类用于文件/目录管理,但不支持内容读写;流处理分为字节流和字符流,包括基本I/O流、缓冲流和转换流等,支持不同场景下的文件读写和数据处理;序列化提供了Serializable和Externalizable两种方式实现对象持久化。文章详细介绍了各种流的特点、构造方法、常用操作和性能优化,并提供了文件搜索、复制等实用代码示例,同时强调了跨平台兼容性和内存管理注意事项。

m0_51751350的博客 977

Java I/O流基础总结

Java I/O流前言一、概述:什么是Java IO流1、OutputStream是什么?2、OutputStream的方法3、关于OutputSteam层次结构4、InputSteam是什么?5、InputSteam的方法6、关于InputStream层次结构二、FileOutputSream和FileInputSream1、FileOutputSream是什么?2、FileOutputStream方法3、案例3.1、写入单个字节3.2、写入字符串4、FileInputStream是什么?5、FileIn

qq_52810280的博客 2031

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

lybugproducer的博客 1363

Java—I/O操作

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

m0_54049074的博客 1034

Java的I/O模型

不同的I/O模型由于线程模型、API等差别很大,所以用法的差异也非常大。

fengshi95的博客 908

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基础之I/O模型分类&I/O多路复用技术

1、早期Java I/O的缺陷 Java 1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下: (1) 没有数据缓冲区,I/O性能存在问题; (2)没有C或者C++中的Channel概念,只有输入和输出流; (3)同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞; (4)支持的字符...

聚沙成塔 888
上一篇: Java基础 - 数据类型
下一篇: 写的文章没了
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值