IO流-----各种流(对象流,内存流,打印流,随机访问流)

news/2024/9/20 1:18:04/ 标签: java, 数据库, IO流

各种流

  • 各种流:
    • 对象流:
      • 操作:
        • 对象输入输出流:
          • 写入数据:
          • 读取数据:
    • 内存流:
      • 内存输出流:
      • 内存输入流:
    • 打印流:
      • 字节打印流:
      • 字符打印流:
    • 随机访问流:
      • 写入数据:
      • 读取数据:
      • 拷贝文件:

各种流:

  1. 对象流

  2. 内存流

  3. 打印流

  4. 随机访问流

 
 

对象流:

对象流:将程序中的对象写入到文件,并且从文件中读取出对象到程序里。

class ObjectInputStream – 对象输入流

class ObjectOutputStream – 对象输出流

序列化(钝化):将程序里的对象写入到文件。

反序列化(活化):将文件里的对象读取到程序中。

tips:

  1. 如果对象想写入文件,对象所属的类就必须实现序列化接口(Serializable)。
  2. Serializable序列化接口没有任何的属性和方法,这种接口称之为标记型接口。
  3. 对象所属的类实现了序列化接口一定要添加序列化ID(serialVersionUID),不然改变对象所属的类就会报错,因为前后的对象所属的类的序列化ID不一致。
  4. 属性使用transient修饰,该属性不会随着对象而写入到文件中。

 

操作:

对象输入输出流:
写入数据:

利用对象输出流 向文件写入数据。

java">public static void main(String[] args) throws FileNotFoundException, IOException {//1.创建流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));//2.写入数据oos.writeInt(100);//写入int值oos.writeDouble(123.123);//写入double值oos.writeUTF("今天天气真好!");//写入字符串oos.writeObject(new Date());//写入对象//3.关闭资源oos.close();}

 
 

利用对象输出流 向文件写入自定义对象。

java">public static void main(String[] args) throws FileNotFoundException, IOException {//1.创建流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));//2.写入自定义对象oos.writeObject(new User("1234567890", "123123", "晴天", "晴天娃娃", "无极剑圣", 10000, 10000));oos.writeObject(new User("1234543267", "111222", "雨天", "雨天娃娃", "九尾妖狐", 8000, 9000));oos.writeObject(new User("1243657687", "123456", "多云", "伤心娃娃", "逆羽", 9000, 8000));oos.writeObject(null);//3.关闭资源oos.close();}

 
 
 

读取数据:

利用对象输入流 读取文件里的数据。

java">public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {//1.创建流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));//2.读取数据(读取顺序必须和写入顺序一致)int readInt = ois.readInt();double readDouble = ois.readDouble();String str = ois.readUTF();Date date = (Date) ois.readObject();System.out.println(readInt);System.out.println(readDouble);System.out.println(str);System.out.println(date);//3.关闭资源ois.close();}

 
 

利用对象输入流 读取文件中的自定义对象。

java">import java.io.Serializable;public class User implements Serializable{//注意点1private static final long serialVersionUID = 4907921883130742331L;private String username;//注意点2private transient String password;private String nickName;private String name;private String role;private double hp;private double mp;public User() {}public User(String username, String password, String nickName, String name, String role, double hp, double mp) {this.username = username;this.password = password;this.nickName = nickName;this.name = name;this.role = role;this.hp = hp;this.mp = mp;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}public double getHp() {return hp;}public void setHp(double hp) {this.hp = hp;}public double getMp() {return mp;}public void setMp(double mp) {this.mp = mp;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password + ", nickName=" + nickName + ", name=" + name+ ", role=" + role + ", hp=" + hp + ", mp=" + mp + "]";}
}
java">public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {//1.创建流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));//2.读取自定义对象User user;while((user = (User)ois.readObject()) != null){System.out.println(user);}//3.关闭资源ois.close();}

 
 

内存流:

应用场景:项目中频繁使用的数据可以使用内存流备份一份。

class ByteArrayInputStream – 内存输入流

class ByteArrayOutputStream – 内存输出流

tips:

  1. 内存流是程序和内存交互,跟文件无关(与硬盘无关)。
  2. 内存流是程序到内存的通道,是关闭不掉的。

 

内存输出流:

java">public static void main(String[] args) throws IOException {//1.创建流对象ByteArrayOutputStream baos = new ByteArrayOutputStream();//2.写入数据 -- 将数据写入到baos对象中的byte数组里//new 的数组在堆里面,在内存中。baos.write("123abc木头人".getBytes());//关闭资源(内存流是程序到内存的通道,是关闭不掉的)//baos.close();//获取流对象里的数据System.out.println(new String(baos.toByteArray()));System.out.println(baos.toString());}

 
 

内存输入流:

java">public static void main(String[] args) throws IOException {//1.创建流对象ByteArrayInputStream bais = new ByteArrayInputStream("123abc木头人".getBytes());//2.读取数据byte[] bs = new byte[1024];int len;while((len = bais.read(bs)) != -1){System.out.println(new String(bs, 0,len));//关闭资源(内存流是程序到内存的通道,是关闭不掉的)//bais.close();}}

 
 

打印流:

lass PrintStream – 字节打印流

class PrintWriter – 字符打印流

tips:

​        打印流实际上就是输出流,只有一个方向(程序->文件)。

PrintStream 和 PrintWriter 区别:
 
​ 区别1:

​        PrintStream是以字节为单位。

​        PrintWriter是以字符为单位。
 
​ 区别2:

​        PrintStream:将字节流转换为字节打印流。

​        PrintWriter:将字节流和字符流转换为字符打印流。

 
 

字节打印流:

java">public static void main(String[] args) throws IOException {//1.创建流对象//PrintStream ps = new PrintStream("io.txt");//1.创建流对象(字节流 -> 字节打印流)//PrintStream ps = new PrintStream(new FileOutputStream("io.txt"));//1.创建流对象(字节流 -> 字节打印流) + 在末尾追加PrintStream ps = new PrintStream(new FileOutputStream("io.txt",true));//2.写入数据ps.write("今天天气真好!".getBytes());//3.关闭资源ps.close();}

 
 

字符打印流:

java">public static void main(String[] args) throws IOException {//1.创建流对象//PrintWriter pw = new PrintWriter("io.txt");//1.创建流对象(字节流 -> 字节打印流)//PrintWriter pw = new PrintWriter(new FileOutputStream("io.txt"));//1.创建流对象(字节流 -> 字节打印流) + 在末尾追加//PrintWriter pw = new PrintWriter(new FileOutputStream("io.txt",true));//1.创建流对象(字符流 -> 字符打印流)//PrintWriter pw = new PrintWriter(new FileWriter("io.txt"));//1.创建流对象(字符流 -> 字符打印流) + 在末尾追加//PrintWriter pw = new PrintWriter(new FileWriter("io.txt",true));//1.创建流对象(设置编码格式 + 在末尾追加 + 考虑到效率)//设置编码格式----->OutputStreamWriter//在末尾追加------>FileOutputStream//考虑到效率------>BufferedWriterPrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt",true), "GBK")));//2.写入数据pw.write("今天天气真好!");//3.关闭资源pw.close();}

 
 

随机访问流:

随机访问流:该流认为文件是一个大型的byte数组。有一个隐藏的指针(默认为0),其实就是下标,可以从指针的位置写入或读取,意味着该流两个方向(写入–>输出流,读取–>输入流)。

 
模式:r-读,rw-读写

class RandomAccessFile – 随机访问流

 
 

写入数据:

利用随机访问流 向文件写入数据。
 
需求1:向文件写入 数字、英文、中文数据。

java">public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile w = new RandomAccessFile("io.txt", "rw");//2.写入数据w.write("123abc木头人".getBytes());//3.关闭资源w.close();}

 
 

利用随机访问流 向文件写入数据。
 
需求1:向文件写入 数字、英文、中文数据。
 
需求2:在文件末尾追加。

java">public static void main(String[] args) throws IOException {//1.创建流对象File file = new File("io.txt");RandomAccessFile w = new RandomAccessFile(file, "rw");//设置指针的位置,把指针移到文件末尾w.seek(file.length());//2.写入数据w.write("123abc木头人".getBytes());//3.关闭资源w.close();}

 
 

读取数据:

利用随机访问流 读取文件里的数据。
 
需求1:读取数据。

java">public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile r = new RandomAccessFile("io.txt", "r");//2.读取数据byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源r.close();}

 
 

利用随机访问流 读取文件里的数据。
 
需求1:读取数据。
 
需求2:从英文处开始读取数据。

java">public static void main(String[] args) throws IOException {//1.创建流对象RandomAccessFile r = new RandomAccessFile("io.txt", "r");//设置指针的位置r.seek(3);//2.读取数据byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){System.out.println(new String(bs, 0, len));}//3.关闭资源r.close();}

 
 

拷贝文件:

java">public static void main(String[] args) throws IOException {RandomAccessFile r = new RandomAccessFile("Original.mp4", "r");RandomAccessFile w = new RandomAccessFile(copy.mp4, "rw");byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){w.write(bs, 0, len);}r.close();w.close();
}

 
 

断点续传!

java">public static void main(String[] args) throws IOException {RandomAccessFile r = new RandomAccessFile("Original.mp4", "r");File targetFile = new File("copy.mp4");RandomAccessFile w = new RandomAccessFile(targetFile, "rw");//设置指针long fileLength = targetFile.length();r.seek(fileLength);w.seek(fileLength);byte[] bs = new byte[1024];int len;while((len = r.read(bs)) != -1){w.write(bs, 0, len);}r.close();w.close();}

http://www.ppmy.cn/news/1467498.html

相关文章

5.27机器人基础-机械臂逆解

前面简单讲了机械臂的正解问题,即通过原位姿和控制各关节的角度得到终点位姿。而在实际应用的时候,我们通常都是知道起始点和末端终点的位姿,需要考虑如何达到,即运动学机械臂的运动学逆解问题。 求解操作臂运动学方程是一个非线…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

DP动态规划(上)

文章目录 动态规划基本概念斐波那契数列问题C 实现Python 实现Java 实现 迷你结C、Python和Java在实现动态规划时有哪些性能差异?迷你结哪种语言在动态规划中更适合大规模数据处理?迷你结C有哪些知名的库适用于动态规划和大数据处理?动态规划辅助库大数据处理库 迷…

NLP(21)--任务型对话机器人

前言 仅记录学习过程,有问题欢迎讨论 问答系统 闲聊、任务型(帮我设闹钟)、回答型(Q&A) 任务型对话机器人:(帮我定火车票/多轮次) 领域识别(分类、匹配&#xff…

【Python字符串攻略】:玩转文字,编织程序的叙事艺术

文章目录 🚀一.字符串基础🌈二.查看数据类型⭐三.转化❤️四.字符串索引🚲五.字符串切片🎬六.字符串切片-步长☔七.反向切片注意事项🚲八.字符串💥查💥改💥删 ❤️九.字符串拼接&…

DS:数与二叉树的相关概念

欢迎来到Harper.Lee的学习世界!博主主页传送门:Harper.Lee的博客主页想要一起进步的uu可以来后台找我哦! 一、树的概念及其结构 1.1 树的概念亲缘关系 树是一种非线性的数据结构,它是由n(n>0)个有限节点…

idea 常用插件推荐

文章目录 1、Lombok2、Convert YAML and Properties File3、Grep Console4、MyBatisX5、Free MyBatis Tool6、MyBatis Log EasyPlus (SQL拼接)7、MyBatisPlus8、Eclipse theme9、Eclipse Plus Theme10、Rainbow Brackets Lite - Free and OpenSource&…

Windows API 开发桌面应用程序,在窗口按下鼠标左键不放可以拖图,并且拖图期间鼠标图标变成手掌

在Windows API中,要实现鼠标左键按下并拖动以移动窗口中的某个图形,并且同时改变鼠标图标为“手掌”形状(这通常指的是“拖动”或“移动”的图标),你需要执行几个步骤。 以下是一个基本的步骤指南,用于在W…

多扇区轮询存储提高FLASH使用寿命

/********************************************************************************* brief flash 多扇区轮询存储(用于提高flash使用寿命)******************************************************************************1.数组首位UserData[第一位] 和 UserData[最后一…

常用maven - jar 下载与 安装

1. guava 如果你想直接将 JAR 文件安装到本地 Maven 仓库,而不使用 POM 文件,可以使用 mvn install:install-file 命令并手动提供必要的元数据。以下是步骤: 下载 Guava JAR 文件: 从 Maven Central 仓库下载 Guava JAR 文件&am…

Django 默认 CSRF 保护机制

Django 的默认 CSRF 保护机制旨在防止跨站请求伪造攻击(CSRF)。CSRF 攻击是一种恶意攻击,其中攻击者通过伪造用户的请求来执行未授权的操作。Django 通过以下方式实现 CSRF 保护: 1. CSRF 中间件 Django 包含一个 CSRF 中间件 (CsrfViewMiddleware),它会自动添加到项目的…

U9C的数据查询视图Sql

U9C的数据查询视图Sql if object_id(TEMPDB..#priceTable) is not null begin drop table #priceTable endcreate table #priceTable (polineCreatedOn date,price varchar(max),itemid varchar(max),purchaseOrderdocno varchar(max),)insert into #priceTable select max(…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是,代理服务器也有不同的类型。就其来源而言,最常见的代理服务器类型是住宅代理和数据中心代理: 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址,因此允许…

make_ext4fs:not found

报错信息: 解决: sudo apt-get install android-tools-fsutils sudo apt-get install android-sdk-libsparse-utils sudo apt-get install android-sdk-ext4-utils

二叉树练习题(2024/6/5)

1翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]…

Docker 入门版

目录 1. 关于Docker 2. Dockr run命令中常见参数解读 3. Docker常见命令 4. Docker 数据卷 5. Docker本地目录挂载 6. 自定义镜像 Dockerfile 语法 自定义镜像模板 Demo 7. Docker网络 1. 关于Docker 在docker里面下载东西,就是相当于绿色面安装板&#x…

【JavaEE】留言板与图书管理系统

目录 留言板1. 准备工作2. 约定前后端交互接口lombok3. 服务器代码4. 调整前端页面代码 图书管理系统1. 准备工作2. 约定前后端交互接口3. 服务器代码4. 调整前端页面代码 留言板 需求: 界⾯如下图所⽰ 输⼊留⾔信息, 点击提交. 后端把数据存储起来.⻚⾯展⽰输⼊的表⽩墙的信…

2024国内热门大语言模型在科研方面的应用

本博客总结了几款热门的国产大语言模型,帮助大家利用这些大语言模型更好的进行科研。 模型介绍 1.文心一言 链接:https://yiyan.baidu.com/ 开发方:百度 特点:专注于中文语言理解与生成,适合中文文本的语义理解任务。 百度推出…

数据仓库与数据挖掘实验练习8

pivot_table()透视表 sales.pivot_table(values Revenue,index Date, columns Name,aggfunc sum,fill_value 0,margins True,margins_name 总计 ) 使用 Pandas 的 pivot_table 函数将一个名为 sales 的 DataFrame 转化为透视表。 1. sales.pivot_table(...) sales: …

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (上)

本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 移动平台上…