【Java IO流 - 中秋活动特供】流的分类,API使用,文件操作

在这里插入图片描述

博主:_LJaXi
专栏: Java | 从跨平台到跨行业
开发工具:IntelliJ IDEA Community Edition 2022.3.3

Java IO流

  • 中秋特供啦 🥮
  • Java Io 🍔
    • 什么是流
    • 流的分类
    • 文件字节输入流
      • 1. 条件循环解决
        • 1 (2) 读取特性
      • 2. 数组存储解决
    • 文件字节输出流
        • 输出流构造方法
    • 字节流复制文件
    • 字节缓冲流
      • BufferedInputStream
      • BufferedInputStream 自定义读取部分数据
      • BufferedOutputStream
    • 对象流
      • Student 类
      • ObjectOutStream
      • ObjectInputSteam
      • 序列化和反序列化注意点

中秋特供啦 🥮

提前祝大家 中秋 | 国庆 快乐 🥮🥮🥮

Java Io 🍔

什么是流

I: Input | 输入

O: Output | 输出

流的分类

  • 按照数据的流向
    • 输入流:读数据
    • 输出流:写数据
  • 按照数据类型来分
    • 字节流
      • 字节输入流
      • 字节输出流
    • 字符流
      • 字符输入流
      • 字符输出流

输入流,输出流

字节流,字符流

文件字节输入流

FileInputStream

package FileInput;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** Author: _LJaXi* @author ASUS*/
class FileInput {public static void main(String[] args) throws IOException {try {FileInputStream fis = new FileInputStream("d:\\aaa.txt");// 一次读取多个字节,存到数组中// 创建一个长度为3的数组 / 字节类型byte[] buf = new byte[3];int count = 0;// 条件判断循环while ((count = fis.read(buf)) != -1) {System.out.print(new String(buf,0,count));}// 3. 关闭fis.close();} catch (FileNotFoundException e) {e.printStackTrace();}}
}

1. 条件循环解决

package main.java.com.mycode;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** Author: _LJaXi* @author ASUS*/
class MyIo {public static void main(String[] args) throws IOException {try {FileInputStream fis = new FileInputStream("d:\\aaa.txt");// 读取System.out.println(fis.read());int data = 0;// 循环打印字节while ((data = fis.read()) != -1) {System.out.print((char) data);}// 3. 关闭fis.close();} catch (FileNotFoundException e) {e.printStackTrace();}}
}

1 (2) 读取特性

package main.java.com.mycode;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** Author: _LJaXi* @author ASUS*/
class MyIo {public static void main(String[] args) throws IOException {try {FileInputStream fis = new FileInputStream("d:\\aaa.txt");// 一次读取多个字节,存到数组中// 创建一个长度为3的数组 / 字节类型byte[] buf = new byte[3];// 返回实例读取的个数int count = fis.read(buf);// 打印字符串 bufSystem.out.println(new String(buf));System.out.println(count);// 多次读取int count2 = fis.read(buf);System.out.println(new String(buf));System.out.println(count2);int count3 = fis.read(buf);System.out.println(new String(buf));System.out.println(count3);// 若文件内字符太短,可能会出现读取数组you多余元素问题,那是你的上次buf数组没有清空导致的// 可以使用// System.out.println(new String(buf, index(索引), count3)); 来清理多余的元素// new String(buf)参数:// 1. param1 是一个字节数组,用于构建新的字符串对象// 2. param2 是偏移量(offset),表示从 param1 的索引为 param2 的位置开始构建字符串// 3. param3 是长度(length),表示构建字符串的长度// 3. 关闭fis.close();} catch (FileNotFoundException e) {e.printStackTrace();}}
}

2. 数组存储解决

package main.java.com.mycode;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** Author: _LJaXi* @author ASUS*/
class MyIo {public static void main(String[] args) throws IOException {try {FileInputStream fis = new FileInputStream("d:\\aaa.txt");// 一次读取多个字节,存到数组中// 创建一个长度为3的数组 / 字节类型byte[] buf = new byte[3];int count = 0;// 条件判断循环while ((count = fis.read(buf)) != -1) {System.out.print(new String(buf,0,count));}// 3. 关闭fis.close();} catch (FileNotFoundException e) {e.printStackTrace();}}
}

文件字节输出流

FileOutputStream

package main.java.com.mycode;import java.io.FileOutputStream;/*** Author: _LJaXi* @author ASUS*/public class FileOutput {public static void main (String[] args) throws Exception {// 1. 创建文件字节输出流对象// 若不想覆盖原本内容,将构造方法append,设置为trueFileOutputStream fos = new FileOutputStream("d://aaa.txt", true);// 2. 写入文件// fos.write(97);// fos.write('b');// fos.write('c');String str = "helloworld";// 获取字符串所对应的字节数组fos.write(str.getBytes());// 3. 关闭fos.close();System.out.println("执行完毕");}
}

输出流构造方法

// 某个构造方法有个形参 append,这个构造方法的 append 若为true 表明不覆盖原本内容
public FileOutputStream(String name, boolean append)throws FileNotFoundException{this(name != null ? new File(name) : null, append);}

字节流复制文件

package CopyFile;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*
* 使用文件字节流实现文件的复制
* */
public class CopyFile {public static void main(String[] args) throws IOException {// 1. 先用文件字节输入流读到内存中FileInputStream fis = new FileInputStream("C:\\Users\\ASUS\\Desktop\\凌波.png");// 2. 再用一个文件字节输出流写入到硬盘FileOutputStream fos = new FileOutputStream("C:\\Users\\ASUS\\Desktop\\凌波丽.jpg");// 3. 一边读 一边写byte[] buf = new byte[1024];int count = 0;while((count=fis.read(buf)) != -1) {fos.write(buf,0,count);}// 4. 关闭流fis.close();fos.close();System.out.print("复制完毕");}
}

字节缓冲流

BufferedInputStream / Buffered0utputStream

提高IO效率,减少访问磁盘的次数;
数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close;

BufferedInputStream

package Buffered;import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;/*
* 使用字节缓冲流读取
* BufferedInputStream
* @Tip 我想和 符韬_(pinegg) 一起玩
* */
public class BufferedStream {public static void main(String[] args) throws IOException {// 1. 创建BufferedInputStreamFileInputStream fis = new FileInputStream("d:\\aaa.txt");// 增强底层流BufferedInputStream bis = new BufferedInputStream(fis);// 2. 读取 bis 读文件会放在缓冲区,提高效率int count = 0;// bis.read() 并不是读一个字节,先把一部分数据读到bis缓冲区内,调用已经读了8k了// private static int DEFAULT_BUFFER_SIZE = 8192;while ((count=bis.read()) != -1) {System.out.print((char) count);}// 3. 关闭bis.close(); // 缓冲流close之后, 会自动帮你关闭输入流 fis.close()}
}

BufferedInputStream 自定义读取部分数据

package Buffered;import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;/*
* 使用字节缓冲流读取
* BufferedInputStream
* @author 符韬是谁?
* */
public class BufferedStream {public static void main(String[] args) throws IOException {// 1. 创建BufferedInputStreamFileInputStream fis = new FileInputStream("d:\\aaa.txt");// 增强底层流BufferedInputStream bis = new BufferedInputStream(fis);// 2. 读取 bis 读文件会放在缓冲区,提高效率int count = 0;// bis.read() 并不是读一个字节,先把一部分数据读到bis缓冲区内,调用已经读了8k了// private static int DEFAULT_BUFFER_SIZE = 8192;// 当然你也可以自己定义把一部分数据读取到缓冲区, 下方注释写法byte[] buf = new byte[6000];while ((count=bis.read(buf)) != -1) {System.out.print(new String(buf, 0, count));}// 3. 关闭bis.close(); // 缓冲流close之后, 会自动帮你关闭输入流 fis.close()}
}

BufferedOutputStream

package Buffered;
import java.io.*;/** 使用字节缓冲流写入* BufferedOutputStream* @time 2023年9月11日14:19:47* @author _LJaXi* @tip 想秀阿卡丽* */public class OutputStream {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("d:\\aaa.txt", true);BufferedOutputStream bos = new BufferedOutputStream(fos);String data = "LOL";bos.write(data.getBytes()); // 写入 8k 到缓冲区fos.flush(); // 刷新到硬盘/*---------------------------------------------------------------* bos.flush()的作用是将缓冲区中的数据立即刷新(写入)到硬盘中* 当使用BufferedOutputStream写入数据时,数据通常会先被存储在内部的缓冲区中,直到缓冲区达到一定的容量或者手动调用flush()方法* ---------------------------------------------------------------* flush()方法的使用是为了确保数据被及时写入硬盘,而不是一直停留在缓冲区* 在调用flush()方法后,任何未写入的数据将被立即写入到硬盘中,这样可以避免数据丢失的风险* ---------------------------------------------------------------* 在流关闭之前或发生异常时,也会自动调用flush()方法,确保所有数据都被写入硬盘* ---------------------------------------------------------------*/bos.close(); // 内部也会调用 flush() 方法} catch (IOException e) {e.printStackTrace();}}
}

对象流

  1. 增强了缓冲区功能
  2. 增强了读写8种基本数据类型和字符串功能
  3. 增强了读写对象的功能 {

readObject() 从流中读取一个对象

writeObject(Object obj) 向流中写入一个对象

}

使用流传输对象的过程称为序列化(写入)、反序列化(读取)

Student 类

package ObjectStream;import java.io.Serializable;// 要想序列化,类必须实现一个接口,为标记接口
public class Student implements Serializable {private String name;private int age;public Student() {}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// this is 重写 toString 方法@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

ObjectOutStream

package ObjectStream;import java.io.*;
/*
* 序列化类必须要实现 Serializable 接口(标记接口)
* ObjectOutputStream
* @time 2023年9月14日13:49:52
* @author _LJaXi
* @tip 阿卡丽5连败
* */
public class OutStream {public static void main(String[] args)throws IOException {// 1. 创建对象流FileOutputStream fos = new FileOutputStream("d:\\aaa.bin");ObjectOutputStream oos = new ObjectOutputStream(fos);// 2. 序列化(写入操作)Student zs = new Student("张三", 20);oos.writeObject(zs);// 3. 关闭oos.close();System.out.println("序列化完毕");}
}

ObjectInputSteam

package ObjectStream;import java.io.*;/*
* ObjectInputStream 反序列化(读取重构成对象)
* @time 2023年9月14日23:31:23
* @author _LJaXi
* @tip 阿卡丽排位3连胜
* */
public class InputStream {public static void main(String[] args) throws IOException, ClassNotFoundException {// 1. 创建对象流FileInputStream fis = new FileInputStream("d:\\aaa.bin");ObjectInputStream ois = new ObjectInputStream(fis);// 2. 读取文件(反序列化)Student s = (Student)ois.readObject();// Student s2 = (Student)ois.readObject(); // 不能读取多次// 3. 关闭ois.close();System.out.println("执行完毕");System.out.println(s.toString());}
}

序列化和反序列化注意点

序列化类必须实现 Serializable 接口

序列化类中对象属性要求实现 Serializable 接口

序列化类中对象属性要求实现 Serializable 接口意思为:

public class Student implements Serializable {private String name;private int age;private Class class; // Class类要实现 Serializable 接口// ... 其他内容
}

正在更新 ING…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

固定资产管理口号标语怎么写

在现代企业管理中,固定资产的管理是至关重要的一环。它不仅关系到企业的经济效益,也影响到企业的运营效率和稳定性。因此,我们需要一种既富有创意又实用有效的口号来引导我们的固定资产管理工作。 明确一个观点  我们要明确一个观点&#…

flink on yarn任务中文乱码问题解决记录

开发反馈预生产部分部分flink任务出现中文乱码的问题 找到乱码的flink任务所在的节点,登录服务器,执行locale命令: 发现是locale没有设置好,使用vim编辑文本,写入中文都直接乱码 对比其他几台机器,发现主…

MySQL优化第二篇

MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析(重中之重) 七种JOIN 1、inner join :可以简写为join,表示的是交集,也就是两张表的共同数据 sql语句&#xff1a…

文心一言插件开发全流程,ERNIE-Bot-SDK可以调用文心一言的能力

文心一言插件开发 前言插件插件是什么工作原理申请开发权限 开始第一步:安装python第二步:搭建项目manifest 描述文件:ai-plugin.json插件服务描述文件:openapi.yaml开发自己的plugin-server 第三步:上传插件 SDK相关链…

Vue3高频面试题+八股文

Vue3.0中的Composition Api 开始之前 Compos:1 tion API可以说是ue3的最大特点,那么为什么要推出Compos1t1on Api,解决了什么问趣? 通常使用Vue2开发的项目,普遍会存在以下问题: 代码的可读性随着组件变大而变差每一种代码复用的…

想要精通算法和SQL的成长之路 - 课程表II

想要精通算法和SQL的成长之路 - 课程表 前言一. 课程表II (拓扑排序)1.1 拓扑排序1.2 题解 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 课程表II (拓扑排序) 原题链接 1.1 拓扑排序 核心知识: 拓扑排序是专…

C++模版基础

代码地址 gitgithub.com:CHENLitterWhite/CPPWheel.git 专栏介绍 本专栏会持续更新关于STL中的一些概念,会先带大家补充一些基本的概念,再慢慢去阅读STL源码中的需要用到的一些思想,有了一些基础之后,再手写一些STL代码。 (如果你…

mysql远程连接失败

先上结论,只提出最容易忽略的地方 服务器是阿里云、腾讯云等平台,平台本身自带的防火墙没有开启iptables规则中禁用了3306,即使你根本没有启用iptables服务 第二条是最离谱的 从这里可以看到,我服务器并未启用 iptables 服务 但…

React 入门实例教程

目录 一、HTML 模板 二、ReactDOM.render() 三、JSX 语法 四、组件 五、this.props.children 六、PropTypes 七、获取真实的DOM节点 八、this.state 九、表单 十、组件的生命周期 constructor() componentWillMount() render() componentDidMount() 组件生命周期…

OPCAE扫盲

目录 1 基本概念 1.1 服务器/客户端 1.2 区域 1.3 报警/条件 1.4 事件 2 条件概念 2.1 子条件 2.2 OPCConditions属性 2.3 Condition质量 2.4 OPCSubConditions属性 2.5 Condition定义 2.6 严重性 2.7 Condition启用/禁用 2.8 Area启用/禁用 2.9 Condition状态集…

Apollo源码安装的问题及解决方法

问题一 在进行git clone时,会报错Failed to connect to github.com port 443: Timed out,经过实践后推荐以下两种方法。 方法一:在原地址前加https://ghproxy.com 原地址:git clone https://github.com/ApolloAuto/apollo.git …

Python while循环嵌套

视频版教程 Python3零基础7天入门实战视频教程 我们在while循环内部还可以继续通过while循环来实现复杂得应用&#xff0c;比如我们打印二维的行列。 实例&#xff1a; # 定义行 i 1# 打印5行 while i < 5:print(f"打印第{i}行")# 定义列j 1# 打印8列while j…

yolov7简化网络yaml配置文件

yolov7代码结构简单&#xff0c;效果还好&#xff0c;但是动辄超过70几个模块的配置文件对于想要对网络进行魔改的朋友还是不怎么友好的&#xff0c;使用最小的tiny也有77个模块 代码的整体结构简单&#xff0c;直接将ELAN结构化写成一个类就能像yolov5一样仅仅只有20几个模块&…

github要求提供双重认证 (2FA), 终于试成功

这是悲剧的事情。 短信认证 不支持中国大陆&#xff0c;包括中国的香港&#xff0c;澳门也不支持。但是中国的台湾他却支持…它默认推荐的几个&#xff0c;什么1password&#xff0c;微软自带&#xff0c;还有一个axxx什么的&#xff0c;只支持google play和ios&#xff0c;我…

2023Web前端面试题及答案(一)

答案仅供参考&#xff0c;每人的理解不一样。 文章目录 1、简单说一说事件流原理 事件流: &#xff08;1&#xff09;事件流是指页面 接收事件的顺序; &#xff08;2&#xff09;假设页面中的元素都具备相同的事件,并且这些个元素之间是相互嵌套的 关系. &#xff08;3&#xf…

CentOS 安装 Docker

注意&#xff1a;下文的命令使用的是 root 用户登录执行&#xff0c;不是 root 的话所有命令前面要加 sudo。 在安装 docker 之前&#xff0c;先说一下配置&#xff0c;我这里是 Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8 以上貌似也可以。 本文目录 1…

廉价的全闪存雷电 NAS 折腾笔记:NUC9 操作系统踩坑

上一篇文章中&#xff0c;分享了关于低成本全闪存 NAS 的个人方案选择。 本篇文章&#xff0c;来聊聊硬件相关部分&#xff0c;以及软件的基础配置部分&#xff0c;也聊聊雷电组网的踩坑之旅。 写在前面 我使用的设备是 NUC9i5QNX&#xff0c;这台设备的硬件基础规格&#x…

类和对象(3)

文章目录 1.回顾上节2. 拷贝构造3. 运算符重载&#xff08;非常重要&#xff09;4. 赋值运算符重载 1.回顾上节 默认成员函数&#xff1a;我们不写&#xff0c;编译器自动生成。我们不写&#xff0c;编译器不会自动生成 默认生成构造和析构&#xff1a; 对于内置类型不做处理对…

【面试心得】WebBench 整理

在面试九识的时候&#xff0c;被问到了WebBench的原理&#xff0c;当时没答上来&#xff0c;这里做一个整理 WebBench 源码【带注释】&#xff1a;GitHub - YukunJ/annotated-webbench-1.5: bilingually annotated Webbench-1.5 webbench是一个轻量的压测工具&#xff0c;可以…

抖去推爆款视频生成器怎么制作开发?--短视频矩阵系统研发

在当今的数字时代&#xff0c;短视频已经成为一种非常受欢迎的内容形式。人们通过观看短视频来获取娱乐、学习和营销信息。然而&#xff0c;制作优秀的爆款视频并不容易&#xff0c;这需要创意、技能和时间。为了简化这一过程&#xff0c;抖去推推出了一款爆款视频生成器&#…