【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…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
