摘要:操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进行系统调用,有操作系统去处理,然后再返回给进程,这样的代理模式是不是很常见?因此app 就是你写的程序,资源就是硬盘或者其他的设备,io就是进行的系统调用。

本文分享自华为云社区《惊呆了,原来JavaIO如此简单》,原文作者:香菜聊游戏。

操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进行系统调用,有操作系统去处理,然后再返回给进程,这样的代理模式是不是很常见?因此app 就是你写的程序,资源就是硬盘或者其他的设备,io就是进行的系统调用。

为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space ) 。像我们平常运行的应用程序都是运行在用户空间,只有内核空间才能进行系统态级别的资源有关的操作,比如如文件管理、进程通信、内存管理等等。也就是说,我们想要进行 IO 操作,一定是要依赖内核空间的能力。并且,用户空间的程序不能直接访问内核空间。当想要执行 IO 操作时,由于没有执行这些操作的权限,只能发起系统调用请求操作系统帮忙完成。因此,用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间

java的io 实在太复杂了,往往新手很难掌握,因为只缘身在此山中,新手往往很难从全体去看到问题的本质,我和打铁的朋友的聊天截图能帮你解答一些。

类结构如下

在平常的读写文件的时候可以先用基本流,然后看是否需要字符流,最后在用上带buffer 的流。IO流的设计思想就是装饰器模式,一层一层的进行升级功能。

IO类大点兵

来波实例展示

1、访问操作文件(FileInputStream/FileReader ,FileOutputStream/FileWriter)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/**
* 拷贝文件
* @author 香菜
*/
public class CopyFileWithStream {public static void main(String[] args) {int b = 0;String inFilePath = "D:\\wechat\\A.txt";String outFilePath = "D:\\wechat\\B.txt";try (FileInputStream in = new FileInputStream(inFilePath); FileOutputStream out = new FileOutputStream(outFilePath)) {while ((b = in.read()) != -1) {out.write(b);}} catch (IOException e) {e.printStackTrace();}System.out.println("文件复制完成");}
}

2、缓存流的使用(BufferedInputStream/BufferedOutputStream,BufferedReader/BufferedWriter)

package org.pdool.iodoc;import java.io.*;/**
* 拷贝文件
*
* @author 香菜
*/
public class CopyFileWithBuffer {public static void main(String[] args) throws Exception {String inFilePath = "D:\\wechat\\A.txt";String outFilePath = "D:\\wechat\\B.txt";try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFilePath));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFilePath))) {byte[] b = new byte[1024];int off = 0;while ((off = bis.read(b)) > 0) {bos.write(b, 0, off);}}}
}

3、获取键盘输入

import java.util.Scanner;public class TestScanner {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextLine()){System.out.println(scanner.nextLine());}}
}

让我们看下源码是啥情况:

总结:

  • 而Reader/Writer则是用于操作字符,增加了字符编解码等功能,适用于类似从文件中读取或者写入文本信息。本质上计算机操作的都是字节,不管是网络通信还是文件读取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁。
  • Buffered等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率。
  • 记住IO流的设计模式是装饰器模式,对流进行功能升级。
  • stream,reader ,buffered 三个关键词记住

点击关注,第一时间了解华为云新鲜技术~

带你深入理解Java的IO到底是个啥相关推荐

  1. 第15章-输入/输出 --- 理解Java的IO流

    (一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...

  2. 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树

    红黑树是平衡的二叉树,它不是一个完美的平衡二叉树,但是在动态插入过程中平衡二叉搜索树的代价相对较高,所以红黑树就此出现,下面就让爱站技术频道小编带你一起进入下文了解一下吧! 一.红黑树所处数据结构的位 ...

  3. 想理解Java的IO,不要从操作系统开始说起的都是耍流氓...

    前言 在上一篇文章中,我们了解流的概念以及JavaIO流的基本用法,但JavaIO流的演化不仅是如此简单,有心的读者会发现,在JDK1.4之前的IO类都是基于阻塞的IO(可以从InputStream. ...

  4. java程序设计_80后程序员,带你深入理解Java基本的程序设计结构,不来你别后悔...

    前言 现在,假定已经成功地安装了JDK,并且能够运行第2章中给出的示例程序.从现在开始将介绍Java应用程序设计.本章主要讲述程序设计相关的基本概念(如数据类型.分支以及循环)在Java中的实现方式. ...

  5. 深入理解 Java 之 GC 到底如何工作

     当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区,当这块内存不再被任何变量引用时,这块内存就变成垃圾,系统就要回收. 只回收堆内存中对象,不会回 ...

  6. 从一个class文件深入理解Java字节码结构

    前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结 ...

  7. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

  8. 深入理解Java中的IO

    本文转载自:深入理解Java中的IO 为了方便理解与阐述,先引入两张图 在整个Java.io包中最重要的就是5个类和一个接口. 5个类指的是File.OutputStream.InputStream. ...

  9. 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java

    很多小伙伴在转行互联网的时候,都担心自己不能坚持,不知道Java适不适合自己. 那最好的方式就是先不要着急直接转行,自己可以先去试着学习一些基础知识,看看对Java的学习难度能否适应以及自己是否真心喜 ...

最新文章

  1. 学会python之后-【一点资讯】学会Python后,人生简直开挂了!
  2. 基于重力补偿的 PD 控制
  3. axios捕获401 赋值token
  4. Application Cache manifest 的处理 (Webkit)
  5. 如何打造不怕被嗅探的3389登陆
  6. php多进程有什么用,有关php多进程的用法举例
  7. sublime中文输入(转)
  8. 网络基础知识 快速计算子网掩码的2种方法
  9. 腾讯面试:一条SQL语句执行得很慢的原因有哪些?
  10. python3.6 django部署_Apache2+Django+Python3.6部署-
  11. CentOS 上snmp的安装和配置
  12. 【已解决】Fortran77老代码中的do循环,在Fortran95中能否使用?
  13. 用MATLAB绘制三维网格图和三维曲面图
  14. 微信ubuntu版服务器,Ubuntu 18.04 安装微信(Linux通用)
  15. Android常用框架
  16. npm install 报错 this command with --force, or --legacy-peer-deps
  17. Unity之Touch触摸屏单指、多指触碰
  18. Spring Boot+Spring Security:记住我(Remember-Me): 基于简单加密token的方案 - 第25篇
  19. CAD中用lisp程序实现批量偏移_AutoCAD如何批量偏移
  20. JAVA软件技术人力外派外包费用怎么算?

热门文章

  1. (15)HTML面试题集锦
  2. 太好了 | 这篇写的太好了!Spring Boot + Redis 实现接口幂等性
  3. Bootstrap3 屏幕阅读器和键盘导航
  4. Bootstrap 折叠插件Collapse 事件
  5. goland创建一个不限长度的字节切片_Go语言3 : 切片
  6. 计划的执行与回顾的重要性与必要性
  7. mysql dump 二进制_mysqldump+二进制日志备份恢复
  8. 相干光通信系统的调制与解调
  9. ajax 回调数据 刷新table_Ajax gt;gt;gt; 001
  10. 解决移动端touch事件与click冲突的问题