网络IO与磁盘IO

article/2025/11/5 18:56:29

目录

一.了解IO

IO流的分类

IO流的数据来源

1.网络

2.磁盘

3.内存

4.键盘

IO流的原理

二.字节流

1.read方法加缓存数组

2.字节流解决乱码问题

3.缓冲字节流

5.序列化和反序列化

三.字符流

四.网络IO

1.Socket和ServerSocket

2.基于Socket手写实现RPC框架

五.NIO(New IO) 


一.了解IO

Java中的IO体系:在Java中I/0流操作的类很多,但是核心体系实际上就只有File、lnputStream、OutputStream、Reader、Writer. 

IO流的分类

 

IO流的数据来源

1.网络

2.磁盘

        //磁盘FileInputStream fi = null; //创建管道try {fi = new FileInputStream("d:/111/123.txt"); //存放在磁盘中的文件int i = 0;//如果没有值 read()会返回-1while ((i = fi.read()) != -1) {System.out.print((char) i);}} catch (IOException e) {e.printStackTrace();}

3.内存

        //内存String str = "Hello Word"; //数据在内存中存放ByteArrayInputStream bai = new ByteArrayInputStream(str.getBytes());int i = 0;//如果没有值 read()会返回-1while ((i = bai.read()) != -1) {System.out.print((char) i);}

4.键盘

        //键盘//ScannerInputStream is = System.in;int i = 0;//如果没有值 read()会返回-1while ((i = is.read()) != -1) {System.out.print((char) i);}}

注意:

 流使用完成后一定要关闭!!

我们可以调用close方法手动关闭

也可以把流写在try(创建流){} catch(){}里JVM(java7)可以帮我们自动关闭流,前提是那个流实现了closeable接口

IO流的原理

为了安全,用户的进程不能直接操作底层的硬件,只能委派操作系统去执行。所以IO操作一定要借助内核去完成。

二.字节流

1.read方法加缓存数组

目的:减少磁盘IO

public class ReadBufferDemo {public static void main(String[] args) {FileInputStream fi = null; //创建管道FileOutputStream fo = null;try {//存放在磁盘中的文件 "Hello World"fi = new FileInputStream("d:/111/123.txt");fo = new FileOutputStream("d:/111/123_cp.txt");int i = 0;//创建一个数组 相当于缓存 可以减少 磁盘IO的次数byte[] buffer = new byte[3];//buffer [][0][]->[H][e][l] ->[1][o][ ]->[w][o][r] ->[1][d][r]while ((i = fi.read(buffer)) != -1) {//在这个类例子中,原本需要和磁盘进行11次I0操作,我增加了buffer之后,只需要进行4次IOSystem.out.println(new String(buffer,0,i));}} catch (IOException e) {e.printStackTrace();}//关闭流}
}

2.字节流解决乱码问题

因为中文在UTF-8中占3个字节 所以我们一个一个字节的取一定会乱码,所以我们一次全取出来在输出就可以解决乱码的问题

    try(FileInputStream in = new FileInputStream(file);FileOutputStream out = new FileOutputStream(cp_file)) {int len = 0;//因为中文在UTF-8中占3个字节 所以我们一个一个字节的取一定会乱码byte[] buffer = new byte[1024];while ((len = in.read(buffer)) != -1) {System.out.println(new String(buffer,0,len));               }}catch (Exception e) {}

3.缓冲字节流

对比普通字节流和缓冲字节流复制文件test.zip大小约500000kb,所需时间的多少

public class BufferDemo1 {//test.zip 大小500000kbstatic File file = new File("d:/111/test.zip");//普通字节流 加缓冲数组static void in_cp(File file, File cp_file) {try(FileInputStream in = new FileInputStream(file);FileOutputStream out = new FileOutputStream(cp_file)) {int len = 0;byte[] buffer = new byte[1024];//设置缓存区大小为1024while ((len = in.read(buffer)) != -1) {//输出out.write(buffer,0,len);}}catch (Exception e) {}}//缓冲字节流//普通字节流 加缓冲数组static void bin_cp(File file, File cp_file) {try(FileInputStream in = new FileInputStream(file);FileOutputStream out = new FileOutputStream(cp_file);BufferedInputStream bin = new BufferedInputStream(in);BufferedOutputStream bout = new BufferedOutputStream(out)) {int len = 0;byte[] buffer = new byte[1024];while ((len = bin.read(buffer)) != -1) {//输出bout.write(buffer,0,len);}}catch (Exception e) {}}public static void main(String[] args) {long star = System.currentTimeMillis();//普通字节流File cp1_file = new File("d:/111/test1.zip");in_cp(file, cp1_file);System.out.println("普通字节流花费时间"+(System.currentTimeMillis()-star));long star2 = System.currentTimeMillis();//缓冲字节流File cp2_file = new File("d:/111/test2.zip");bin_cp(file, cp2_file);System.out.println("缓冲字节流花费时间"+(System.currentTimeMillis()-star2));}}

结果:

普通字节流花费时间8096
缓冲字节流花费时间1378

因为BufferedInputStream 底层 采用的缓存数组大小为8192

 所以我想 试着把普通字节流的缓存数组 设为1024*8   发现他们的执行效率几乎相同

结果:

普通字节流花费时间1457
缓冲字节流花费时间1484

缓冲流的flush()方法的作用:

因为缓冲流的缓冲数组为1024*8,当我们write的时候,只有当缓冲区填满了的时候才会写入,所以为了防止数据没填满缓冲区导致数据没写入,我们可以用到这个flush()方法,顺便提一下close方法里也会调用一次flush相当于刷盘操作。

5.序列化和反序列化

ObjectOutputStream实现序列化对象

    static void serialize(Object obj) {//ObjectOutputStream实现对象的序列化try(FileOutputStream fo = new FileOutputStream("d:/111/user");ObjectOutputStream obo = new ObjectOutputStream(fo)) {//把对象写入磁盘 相当于序列化obo.writeObject(obj);} catch (Exception e) {}System.out.println("序列化成功");}

ObjectInputStream实现反序列化对象

    static void deserialize(File file) {try(FileInputStream fi = new FileInputStream(file);ObjectInputStream obi = new ObjectInputStream(fi)) {//把对象从磁盘读取 相当于反序列化User user = (User) obi.readObject();System.out.println("反序列化" + user);} catch (Exception e) {}}

test

    public static void main(String[] args) {User user = new User("ws", 18);//序列化对象serialize(user);//反序列化deserialize(new File("d:/111/user"));}

结果:

序列化成功
反序列化User{name='ws', age=18}

三.字符流

字符流体系与字节流相似,字符流中特别的就是字符转换流InputStreamRead,他是字节流转换字符流的桥梁,它还可以指定编码格式。

四.网络IO

1.Socket和ServerSocket

模拟客户端与服务端通信

ServerSoket

public class ServerSoketDemo {final static int DEFAULT_PORT = 7486;public static void main(String[] args) {ServerSocket serverSocket = null;try {//创建一个监听serverSocket = new ServerSocket(DEFAULT_PORT);//等待客户端连接 accept()会阻塞  直到获取到客户端才会往下执行Socket socket = serverSocket.accept();System.out.println("客户端" + socket.getPort() +"已连接");//获取字节输入流getInputStream();//转换为缓存字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = null;msg = br.readLine();//接受客户端消息System.out.println("客户端发送消息:" + msg);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream()));//给客户端发送消息bw.write("我收到你的消息啦~\n");bw.flush();} catch (IOException e) {e.printStackTrace();}}
}

ClienSocket

public class ClienSocketDemo {final static int DEFAULT_PORT = 7486;public static void main(String[] args) {try {Socket socket = new Socket("localhost",DEFAULT_PORT);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("我是客户端:clien-01\n");bw.flush();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = br.readLine();System.out.println(msg);} catch (IOException e) {e.printStackTrace();}}
}

结果:

 

 2.BIO阻塞IO

所以 传统的IO在网络的数据传输上有两部分的阻塞,一部分是连接阻塞,一部分是IO阻塞。

可以利用线程池对其进行优化

    //创建线程池private final ExecutorService executorService = Executors.newCachedThreadPool();//创建监听ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(port);System.out.println("开启服务");while(true) {final Socket socket = serverSocket.accept(); //连接阻塞System.out.println("客户端" + socket.getPort() +"已连接");//把IO的逻辑交给多线程完成executorService.execute(new ProcessorHandler(service, socket));}} catch (IOException e) {e.printStackTrace();}   //关闭serverSocket

2.基于Socket手写实现RPC框架

基于Socket手写RPC框架

五.NIO(New IO) 

简述:

        NIO 从JDK1.4提出的,本意是New l0,它的出现为了弥补I0的不足,提供了更高效的方式,针对于网络IO,他还可以非阻塞的模式进行网络IO.

详细了解JAVA NIO


http://chatgpt.dhexx.cn/article/SPw51CA1.shtml

相关文章

网络IO和磁盘IO详解

1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。 读操作:操作系统检查内核的缓冲区有没…

linux系统资源分析 - 磁盘IO篇

目录 一、理解磁盘IO 二、普通文件IO调度 三、磁盘阵列 四、常用命令 4.1 iostat命令详解 五、综合案例(内存&IO) 一、理解磁盘IO 以超市结账为例,来理解磁盘IO的队列情况(结账付款时间 等待时间 服务时间) 交款总人数(排队的人数多,处理慢…

网络I/O与磁盘I/O

目录 一、同步&异步 阻塞&非阻塞二、网络I/O1. BIO2. NIO3. 多路复用器3.1 select & poll3.2 epoll3.3 Redis的IO多路复用 4. Reactor模型5. Netty 三、磁盘I/O1. 缓存I/O2. Direct I/O3. mmap4. write、flush、fsync 一、同步&异步 阻塞&非阻塞 参考&…

Linux 查看磁盘IO的使用

我们在线上linux服务器排查问题时,一般会通过top、free、netstat、df -h等命令排查cpu、内存、网络和磁盘等问题。有的时候我们需要更进一步了解磁盘io的使用情况,那么本文就是重点讲解一下如何查看linux的磁盘io信息的。 1.iostat: 1.1 命…

磁盘IO和网络IO

4、IO访问方式 4.1 磁盘IO 具体步骤: 当应用程序调用read接口时,操作系统检查内核缓冲区中是否存在需要的数据,如果存在,就直接从内核缓存中直接返回,否则从磁盘中读取,然后缓存至操作系统的缓存中。 当应…

内存与IO,磁盘IO,网络IO

本节主要内容: 系统IO原理:Linux VFS FD pagecache [java] 1文件系统的io 2内存和io关系 3网络io 任何程序都有 0:标准输入 1:标准输出 2:报错输出 /proc/$$进入当前进程目录 $$表示当前bash的pid $BA…

关于 IO、存储、硬盘和文件系统

关于IO、存储、硬盘和文件系统 0.引入1.了解IO1.1.存储器IO1.2.设备IO 2.存储介质和存储类型2.1.内存2.2.硬盘2.3.固态硬盘(SSD)2.4.U盘 3.硬盘的工作原理3.1.磁头3.2.盘片3.3.电动机3.4.硬盘的读写操作 4.文件系统概述4.1.文件系统的类型4.2.文件系统的…

Linux查看与测试磁盘IO性能

1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 IO 过高等。 top命令的其他参数代表的含义详见top命令详解…

Linux 查看磁盘IO

查看命令iostat,# 如果没有 iostat 命令,那么使用 yum install sysstat 进行安装 #间隔1秒,查询10次 iostat -x 1 10 由上图可知,vdb磁盘的 %util【IO】几乎都在100%,原因是频繁的读取数据造成的。 其他字段说明 De…

linux查看磁盘io

iostat -dxk 1 2 iostat iostat,对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。 命令参数说明…

linux查看磁盘IO,网络IO 总结

linux查看磁盘IO,网络 IO可用的命令 1. top 监控整体服务器,cpu,内存,磁盘,网络等 2. dstat -d 查看当前磁盘每秒的读取,写入量,单位K 3. dstat -r 查看当前磁盘随机的读IOPS,…

linux查看磁盘io使用情况

六种方法 top命令、vmstat命令、iostat命令、iotop命令、pt-ioprofile命令、pidstat命令 一、 top命令 top - 11:41:22 up 51 min, 2 users, load average: 0.01, 0.04, 0.01 Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.1%sy, 0.0%n…

从磁盘看 IO

计算机上的易失和非易失存储器 常见磁盘可以分为两类:机械磁盘和固态磁盘。 第一类,机械磁盘,也称为硬盘驱动器(Hard Disk Driver),通常缩写为 HDD。机械磁 盘主要由盘片和读写磁头组成,数据就…

硬盘io性能分析

一、磁盘性能主要经常会看磁盘i/o使用率、iops、吞吐量、i/o响应时间等,常用命令sar、iostat、dstat : 1、常用命令:iostat -xm 1 ,单位MB,表示每1秒刷新一次 ----------------- avg-cpu ---------------- %user&…

磁盘IO 基本常识

更多内容,前往 IT-BLOG 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的 CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同…

【性能测试】系统常用监控- -磁盘IO

性能测试系统常用监控- -磁盘 文章目录 性能测试系统常用监控- -磁盘前言磁盘IO1.常用概念2.磁盘IO性能3.性能指标4.性能分析5.常用分析5. 1 iostat命令解析5.2 查看硬盘类型5.3 查看磁盘IO调度5.4 查看磁盘IO调度5.3 调优方法5.1 RAID 总结 前言 性能测试过程中,在…

磁盘IO

基本概念: 在数据库优化和存储规划过程中,总会提到IO的一些重要概念,在这里就详细记录一下,个人认为对这个概念的熟悉程度也决定了对数据库与存储优化的理解程度,以下这些概念并非权威文档,权威程度肯定就不…

磁盘IO及性能指标

一、磁盘 I/O 的概念 I/O 的概念,从字义来理解就是输入输出。操作系统从上层到底层,各个层次之间均存在 I/O。比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 I/O,这是广义上的 I/O。通常来讲,一个上层的 I/O 可能会产生针对磁盘的多个 I/O,也就是说,上层的 …

一提到mysql,总有人说磁盘IO,到底什么是磁盘IO?

为什么mysql的innodb存储引擎选择了B树,这个和磁盘的特性有着非常大的关系。 我们先来看下磁盘上的物理结构。 如果我们简化一下,可以这么看 再看几张模型图 一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动,各个磁盘必须同…

一寸照像素和厘米的关系及换算

一寸照的概念: 照片的一寸和二寸是指照片的边长度,而不是对角线。 这里的寸指的是英寸 厘米和英寸: 1 厘米=0.3937 英寸 1 英寸=2.54 厘米 一寸照的厘米概念: 一寸照规格是宽*高2.5cm*3.5cm ,换…