【Java基础】IO流
IO流




最后一定要关闭流,防止资源泄露
字节流
一次读取1字节,8比特
FileInputStream
import org.junit.jupiter.api.Test;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyBytes {public static void main(String[] args) throws IOException {}//单个字节的读取@Testpublic void test1() throws IOException{FileInputStream in = null;FileOutputStream out = null;String path="src\\single\\in.txt";String dpath="src\\single\\out.txt";try {in = new FileInputStream(path);//String,boolean true追加;false覆盖,默认out = new FileOutputStream(dpath,true);int datacode;//read()一次读取一个字节,返回读取字节的ASCII码,返回-1,表示读取完毕while ((datacode = in.read()) != -1) {System.out.println(datacode);//输出ASCII码 例如 a 是97 ;一个汉字是3个字节System.out.println((char)datacode);out.write(datacode);}} finally {if (in != null) {in.close();}if (out != null) {out.close();}}}@Testpublic void test2() throws IOException{FileInputStream in = null;FileOutputStream out = null;String path="src\\single\\in.txt";String dpath="src\\single\\out.txt";try {in = new FileInputStream(path);out = new FileOutputStream(dpath);//一次读取多个字节,返回读取字节的长度byte[] buf=new byte[2];int datalen=0;while((datalen=in.read(buf))!=-1){System.out.println(datalen);System.out.println(new String(buf,0,datalen));out.write(buf,0,datalen);}} finally {if (in != null) {in.close();}if (out != null) {out.close();}}}
}
字符流
FileReader
package file;import org.junit.jupiter.api.Test;import java.io.*;public class FileReader_ {public static void main(String[] args) {}//单个字符@Testpublic void readFile01() {String filePath = "src\\file\\in.txt";String dPath="src\\file\\out.txt";FileReader fileReader = null;FileWriter fileWriter=null;int datacode = 0;//1. 创建 FileReader 对象try {fileReader = new FileReader(filePath);fileWriter=new FileWriter(dPath);//循环读取 使用 read, 单个字符读取while ((datacode = fileReader.read()) != -1) {System.out.print(datacode);System.out.println((char) datacode);fileWriter.write(datacode);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader != null) {fileReader.close();}if(fileWriter!=null){//这里一定要关闭,才会写入 或者flush //close 等价于 flush + close//底层还是字节流fileWriter.close();}} catch (IOException e) {e.printStackTrace();}}}@Testpublic void readFile02() {String filePath = "src\\file\\in.txt";String dPath="src\\file\\out.txt";FileReader fileReader = null;FileWriter fileWriter=null;int readLen = 0;char[] buf = new char[8];//1. 创建 FileReader 对象try {fileReader = new FileReader(filePath);fileWriter=new FileWriter(dPath,true);//循环读取 使用 read(buf), 返回的是实际读取到的字符数//如果返回-1, 说明到文件结束while ((readLen = fileReader.read(buf)) != -1) {System.out.print(new String(buf, 0, readLen));fileWriter.write(buf,0,readLen);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader != null) {fileReader.close();}if(fileWriter!=null){fileWriter.close();}} catch (IOException e) {e.printStackTrace();}}}
}
处理流
BufferedReader


处理流以节点流为基础,提供了更加强大的功能
package file;import java.io.*;/*** @author 韩顺平* @version 1.0* 演示 bufferedReader 使用*/
public class BufferedReader_ {public static void main(String[] args) {String filePath = "src\\file\\in.txt";String dPath="src\\file\\out.txt";//创建 bufferedReaderBufferedReader bufferedReader =null; BufferedWriter bufferedWriter=null;try {bufferedReader=new BufferedReader(new FileReader(filePath));bufferedWriter=new BufferedWriter(new FileWriter(dPath));//读取String line; //按行读取, 效率高//说明//1. bufferedReader.readLine() 是按行读取文件//2. 当返回 null 时,表示文件读取完毕while ((line = bufferedReader.readLine()) != null) {System.out.println(line);bufferedWriter.write(line);}} catch (Exception e) {e.printStackTrace();}finally {//关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流try {if(bufferedReader!=null) {bufferedReader.close();}if(bufferedWriter!=null){bufferedWriter.close();}} catch (IOException e) {e.printStackTrace();}}}
}
打印流
PrintWriter
也是一种处理流
打印流只有输出流,没有输入流
打印到显示器或文件
PrintStream out = System.out;
//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
/*
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
*/
out.print("john, hello");
//因为 print 底层使用的是 write , 所以我们可以直接调用 write 进行打印/输出
out.write("韩顺平,你好".getBytes());//我们可以去修改打印流输出的位置/设备
//1. 输出修改成到 "e:\\f1.txt"
//2. "hello, 韩顺平教育~" 就会输出到 e:\f1.txt
//3. public static void setOut(PrintStream out) {
// checkIO();
// setOut0(out); // native 方法,修改了 out
// }
System.setOut(new PrintStream("e:\\f1.txt"));
System.out.println("hello, 韩顺平教育~");out.close();//flush + 关闭流, 才会将数据写入到文件.
标准输入输出流
System.in
System.out
System.in System.out System.err
程序启动时创建,退出时关闭。
不需要程序员关闭
package single;import org.junit.jupiter.api.Test;import java.util.Scanner;public class TestClass {public static void main(String[] args) {}@Testpublic void test1(){Scanner scanner = new Scanner(System.in);/*System.inSystem 的public final static InputStream in = null;编译类型InputStream运行类型BufferedInputStream标准输入是键盘*/System.out.println();/*System.outSystem 的 public final static PrintStream out = null;编译类型PrintStream运行类型PrintStream标准输出是屏幕*/}}
ObjectOutputStream
对象处理流
序列化:
是将对象的状态信息转换为可以存储或传输的二进制形式的过程。
就是在保存数据的时候,保存数据的值和数据类型
反序列化:
将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程
就是在恢复数据的时候,恢复数据的值和数据类型
需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
- Serializable //这是一个标记接口(没有方法),推荐
- Externalizable //有方法,他也实现了Serializable
@Testpublic void objectoutputstream() throws Exception{//序列化后的文本格式,是按他自己的方式String path="D:\\IDEA_file\\Learn_8\\src\\file\\Files\\file5.dat";ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(path));oos.write(100);//int->Integer,实现了Serializableoos.writeBoolean(false);//boolean->Boolean,实现了Serializableoos.writeChar('7');//char->Character,实现了Serializableoos.writeDouble(9.8);//double->Double,实现了Serializableoos.writeUTF("china");//String,实现了Serializableoos.writeObject(new Dog("wnag",19));//关闭流oos.close();}}//要想数据可序列化,必须继承Serializableclass Dog implements Serializable {String name;int age ;public Dog(String name, int age) {this.name = name;this.age = age;}}
如果有些字段不想进行序列化,
对于不想进行序列化的变量,使用 transient 关键字修饰。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。
关于 transient 还有几点注意:
transient只能修饰变量,不能修饰类和方法。transient修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰int类型,那么反序列后结果就是0。static变量因为不属于任何对象(Object),所以无论有没有transient关键字修饰,均不会被序列化。
serialVersion
- serialVersionUID作用是什么以及如何生成的? - 腾讯云开发者社区-腾讯云 (tencent.com)
- serialVersionUID 是干什么的? - 知乎 (zhihu.com)
- (46条消息) idea如何一键自动生成序列化serialVersionUID_秋竹的博客-CSDN博客_idea 生成serialversionuid
序列化运行时与每个可序列化类关联一个版本号(称为 serialVersionUID),该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否已加载与序列化兼容的类。如果接收方为对象加载了一个类,该类的串行版本UID与相应发送方的类的类不同,则反序列化将导致无效类异常,可序列化类可以通过声明一个名为 的字段来显式声明自己的串行VersionUID,该字段必须是静态的、最终的和类型:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
不能被继承
转换流
inputStremReader
把字节流转换成字符流
字节流可以指定编码格式,可以处理中文乱码等情况
public class InputStreamReader_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\a.txt";
//解读
//1. 把 FileInputStream 转成 InputStreamReade
//2. 指定编码 gbk
//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//3. 把 InputStreamReader 传入 BufferedReader
//BufferedReader br = new BufferedReader(isr);
//将 2 和 3 合在一起
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(filePath), "gbk"));
//4. 读取
String s = br.readLine();
System.out.println("读取内容=" + s);
//5. 关闭外层流
br.close();相关文章:
【Java基础】IO流
IO流 最后一定要关闭流,防止资源泄露 字节流 一次读取1字节,8比特 FileInputStream import org.junit.jupiter.api.Test;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class CopyBytes {pub…...
Boolean,Array,Object数据类型(回顾)
Boolean数据类型范围Boolean(value)Object数据类型特点键值对数组特点类数组特点 Boolean数据类型范围 true,false 链接 Boolean(value) 定义:其他类型转布尔类型 六大假值:false,undefined,null,NaN,0…...
Python常见的数据类型
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
欠缺知识点罗列
UML五种关系的特点 依赖,关联,组合,聚合,泛化。认识UML类关系——依赖、关联、聚合、组合、泛化 - 腾讯云开发者社区-腾讯云 数据结构- 生成树的定义。 每周学点大数据 | No.17最小生成树 - 腾讯云开发者社区-腾讯云 有向图。 …...
基于springboot+vue的校园社团管理系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
你了解互联网APP推荐的背后逻辑么(下)?
上篇重点介绍了互联网APP在搜索交互场景下的通用逻辑,让大众对每天离不开的搜索进行了一个普遍介绍。这一篇,我们来聊聊抖音、头条等APP划一划这个动作背后,是怎么做推荐的。推荐的背后,离不开每个用户的数据,而且这个…...
总是跳转到国内版(cn.bing.com)?New Bing使用全攻略
你是否想要使用强大的(被削后大嘘)New Bing? 你是否已经获得了New Bing的使用资格? 你是否在访问www.bing.com/new时提示页面不存在? 你是否在访问www.bing.com时总是重定向到cn.bing.com而使用不了New Bing? New Bi…...
神经网络的基本骨架—nn.Module使用
一、pytorch官网中torch.nn的相关简介可以看到torch.nn中有许多模块:二、Containers模块1、MODULE(CLASS : torch.nn.Module)import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):#nn.Module---所有神经网络模块的…...
面试官:你是怎样进行react组件代码复用的
mixin Mixin 设计模式 Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。 常用的方法:JQuery 的 exte…...
arxiv2017 | 用于分子神经网络建模的数据增强 SMILES Enumeration
论文标题:SMILES Enumeration as Data Augmentation for Neural Network Modeling of Molecules论文地址:https://arxiv.org/abs/1703.07076代码地址:https://github.com/Ebjerrum/SMILES-enumeration一、摘要摘要中明显提出:先指…...
倒计时2天!TO B人的传统节日,2023年22客户节(22DAY)
去年,2022.02.22,正月二十二星期二,在这个最多2的一天,成功举办了“首届22客户节(22DAY)”,一群To B互联网人相约杭州见证; 癸卯兔年,2023.02.22,让我们再度…...
java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
java版工程管理系统Spring CloudSpring BootMybatis实现工程管理系统 工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和…...
数据结构刷题(六):142环形链表II、242有效的字母异位词、383赎金信、349两个数组的交集
1.环形链表II题目链接思路:设置快慢双指针注意:(1)是否有环(快慢双指针是否能碰面也就是相等)(2)环形入口的判断。从头结点出发一个指针,从相遇节点 也出发一个指针&…...
OpenGL学习日记之光照计算
引言 现实生活中的光照极其复杂,而且会收到很多因素的影响,是我们当前计算机的算力无法模拟的。因此我们会根据一些简化的模型来模拟现实光照,这样在可以模拟出近似的光照感受,但是又没有那么复杂的计算。 常用的光照模型有&…...
七大排序经典排序算法
吾日三省吾身:高否?富否?帅否?答曰:否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底,暂时还未开启新语言的学习,但是大同小异,语法都差不多。目录:一.排序定义二.排序…...
设计模式—“对象性能”
面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模式有:Singleton、Flyweight 一、Flyweight 运用共享技术将大量细粒度的对象进项复用,…...
基于Spring Boot的零食商店
文章目录项目介绍主要功能截图:登录后台首页个人信息管理用户管理前台首页购物车部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关…...
Python语言的优缺点
为初学者而著!适合准备入行开发的零基础员学习python。python也是爬虫、大数据、人工智能等知识的基础。感兴趣的小伙伴可以评论区留言,领取视频教程资料和小编一起学习,共同进步!https://www.bilibili.com/video/BV13D4y1G7pt/?…...
3款强大到离谱的电脑软件,个个提效神器,从此远离加班
推荐3款让你偷懒,让你上头的提效电脑软件,个个功能强大,让你远离加班! 很多几个小时才能做好的事情,用上它们,只需要5分钟就行!! 1、JNPF —— 个人最喜欢的低代码软件 它为开发者…...
vue3 使用typescript小结
最近学习vue3 typescript,网上看了很多文章,汇总一下,分享给大家,希望会对大家有帮助。 一. 为props标注类型 defineProps()宏函数支持从它的参数中推导类型: <script setup langts>import { defineProps } fro…...
滨会生物冲刺港股:年亏1.2亿 乐普生物与扬子江药业是股东
雷递网 雷建平 4月5日武汉滨会生物科技股份有限公司(简称:“滨会生物”)日前更新招股书,准备在港交所上市。滨会生物总计募资超10亿元,其中,2021年2月完成募资6亿元,2022年7月完成募资2.4亿元&a…...
一键迁移方案:OpenClaw配置备份与Qwen3-4B模型快速恢复
一键迁移方案:OpenClaw配置备份与Qwen3-4B模型快速恢复 1. 为什么需要配置迁移方案 上周我的开发机突然硬盘故障,导致所有OpenClaw配置丢失。重新配置飞书通道、模型连接和技能库花了大半天时间。这次教训让我意识到:自动化工具的配置本身也…...
二十载面香溢加州:鲁味居(101 Noodle Express)的北美餐饮进阶启示录
近日,南加州知名中餐地标品牌“鲁味居(101 Noodle Express)”正式迎来创立二十周年。在竞争激烈的北美餐饮市场,该品牌凭借对中国纯正传统面食与非遗卤味技艺的坚守,不仅确立了其在海外华人圈层的核心地位,…...
2026 年 1月 24 日-KB5078127(OS内部版本26200.7628 和 26100.7628)带外
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
Linux内核中的高精度定时器:hrtimer机制详解
Linux内核中的高精度定时器:hrtimer机制详解 作为一名深耕操作系统和嵌入式开发的工程师,我对Linux内核中的高精度定时器(hrtimer)机制有着深入的理解。hrtimer提供了微秒甚至纳秒级的定时精度,是实时应用的关键基础设…...
【物联网】基于STM32F429与TMS320F28377的储能变流器控制软件架构设计
目录 一、双处理器架构设计概述 (一)异构双核系统定位 (二)硬件资源协同策略 二、STM32F429ZGT6 核心功能开发 (一)系统管理模块设计 1. 任务调度与状态监控 2. 多源数据融合存储 (二&am…...
python binascii
## 关于Base64,你可能需要知道这些 在编程的世界里,数据并不总是以我们熟悉的形式存在。有时候,一段文字、一张图片,或者任何其他类型的数据,需要被转换成另一种形式才能在不同的系统中安全传输或存储。Base64就是这样…...
多智能体仓库AI指挥层技术架构
多智能体仓库AI指挥层实现运营卓越与供应链智能 仓库的“大脑”:解决碎片化运营难题 尽管仓库的自动化和数据丰富程度已达历史新高,但多数站点仍然依赖一套难以跟上节奏的系统:仓库管理系统(WMS)、少量仪表盘和分散的…...
如何让旧iPhone/iPad焕发新生:Legacy-iOS-Kit终极降级指南
如何让旧iPhone/iPad焕发新生:Legacy-iOS-Kit终极降级指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
新手福音:通过快马平台生成的示例代码,轻松迈出openclaw启动第一步
作为一个刚接触爬虫开发的新手,第一次听说openclaw这个工具时,我完全不知道从哪里下手。好在发现了InsCode(快马)平台,它不仅能生成带详细注释的示例代码,还能直接运行测试,让我这个小白也能快速理解openclaw的启动流程…...
