带你深入理解Java的IO到底是个啥
摘要:操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进行系统调用,有操作系统去处理,然后再返回给进程,这样的代理模式是不是很常见?因此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到底是个啥相关推荐
- 第15章-输入/输出 --- 理解Java的IO流
(一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...
- 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树
红黑树是平衡的二叉树,它不是一个完美的平衡二叉树,但是在动态插入过程中平衡二叉搜索树的代价相对较高,所以红黑树就此出现,下面就让爱站技术频道小编带你一起进入下文了解一下吧! 一.红黑树所处数据结构的位 ...
- 想理解Java的IO,不要从操作系统开始说起的都是耍流氓...
前言 在上一篇文章中,我们了解流的概念以及JavaIO流的基本用法,但JavaIO流的演化不仅是如此简单,有心的读者会发现,在JDK1.4之前的IO类都是基于阻塞的IO(可以从InputStream. ...
- java程序设计_80后程序员,带你深入理解Java基本的程序设计结构,不来你别后悔...
前言 现在,假定已经成功地安装了JDK,并且能够运行第2章中给出的示例程序.从现在开始将介绍Java应用程序设计.本章主要讲述程序设计相关的基本概念(如数据类型.分支以及循环)在Java中的实现方式. ...
- 深入理解 Java 之 GC 到底如何工作
当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区,当这块内存不再被任何变量引用时,这块内存就变成垃圾,系统就要回收. 只回收堆内存中对象,不会回 ...
- 从一个class文件深入理解Java字节码结构
前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结 ...
- java中的NIO和IO到底是什么区别?20个问题告诉你答案
摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...
- 深入理解Java中的IO
本文转载自:深入理解Java中的IO 为了方便理解与阐述,先引入两张图 在整个Java.io包中最重要的就是5个类和一个接口. 5个类指的是File.OutputStream.InputStream. ...
- 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
很多小伙伴在转行互联网的时候,都担心自己不能坚持,不知道Java适不适合自己. 那最好的方式就是先不要着急直接转行,自己可以先去试着学习一些基础知识,看看对Java的学习难度能否适应以及自己是否真心喜 ...
最新文章
- 学会python之后-【一点资讯】学会Python后,人生简直开挂了!
- 基于重力补偿的 PD 控制
- axios捕获401 赋值token
- Application Cache manifest 的处理 (Webkit)
- 如何打造不怕被嗅探的3389登陆
- php多进程有什么用,有关php多进程的用法举例
- sublime中文输入(转)
- 网络基础知识 快速计算子网掩码的2种方法
- 腾讯面试:一条SQL语句执行得很慢的原因有哪些?
- python3.6 django部署_Apache2+Django+Python3.6部署-
- CentOS 上snmp的安装和配置
- 【已解决】Fortran77老代码中的do循环,在Fortran95中能否使用?
- 用MATLAB绘制三维网格图和三维曲面图
- 微信ubuntu版服务器,Ubuntu 18.04 安装微信(Linux通用)
- Android常用框架
- npm install 报错 this command with --force, or --legacy-peer-deps
- Unity之Touch触摸屏单指、多指触碰
- Spring Boot+Spring Security:记住我(Remember-Me): 基于简单加密token的方案 - 第25篇
- CAD中用lisp程序实现批量偏移_AutoCAD如何批量偏移
- JAVA软件技术人力外派外包费用怎么算?
热门文章
- (15)HTML面试题集锦
- 太好了 | 这篇写的太好了!Spring Boot + Redis 实现接口幂等性
- Bootstrap3 屏幕阅读器和键盘导航
- Bootstrap 折叠插件Collapse 事件
- goland创建一个不限长度的字节切片_Go语言3 : 切片
- 计划的执行与回顾的重要性与必要性
- mysql dump 二进制_mysqldump+二进制日志备份恢复
- 相干光通信系统的调制与解调
- ajax 回调数据 刷新table_Ajax gt;gt;gt; 001
- 解决移动端touch事件与click冲突的问题