【java】IO流

news2024/11/16 3:46:47

IO流

原理

image.png

分类

字节流与字符流

image.png

image.png

image.png

节点流与包装流

  • Java IO详解(五)------包装流 - YSOcean - 博客园 (cnblogs.com)
  • JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流_过滤流和缓冲流,字节流的关系_X-Dragon烟雨任平生的博客-CSDN博客

字符流



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 {

    }
    //单个字节的读取
    @Test
    public 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();
            }
        }
    }
    @Test
    public 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[3];
            int datalen=0;//实际读取的长度,读取完毕返回-1
            while((datalen=in.read(buf))!=-1){
                System.out.println(datalen);
                System.out.println(new String(buf,0,datalen));
                //System.out.println(new String(buf));//这样会导致读取异常,因为当最后一次读取不够时,上一次的读取并没有清空
                out.write(buf,0,datalen);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

字节流

package file;

import org.junit.jupiter.api.Test;

import java.io.*;

public class FileReader_ {
    public static void main(String[] args) {
    }
    //单个字符
    @Test
    public 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();
            }
        }
    }

    @Test
    public 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();
            }
        }
    }
}

缓冲流

image.png

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";
        //创建 bufferedReader
        BufferedReader bufferedReader =null; 
        BufferedWriter bufferedWriter=null;
        try {
            bufferedReader=new BufferedReader(new FileReader(filePath));//也可以传入其他的Reader
            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);
                bufferedWriter.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            
                //关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
                try {
                    if(bufferedReader!=null) {
                        bufferedReader.close();
                    }
                    if(bufferedWriter!=null){
                        bufferedWriter.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            

        }
       

    }
}

好处

  • 使用更方便,屏蔽底层细节
  • 使用缓冲读取,效率更高
  • 功能更强大

大文件

  1. 前端上传文件之前,首先查询数据,比较md5值;如果存在,就提示秒传
  2. 如果不存在,前端分片上传,上传之前首先检查分片是否存在,如果存在,则不用上传实现断点续传
  3. 后端存储分片
  4. 文件上传完毕,合并分片成一个完整的文件,并保存文件记录到数据库

分布式文件系统

一个计算机无法存储海量的文件,通过网络将若干计算机组织起来共同去存储海量的文件,去接收海量用户的请求,这些组织起来的计算机通过网络进行通信

好处:

1、一台计算机的文件系统处理能力扩充到多台计算机同时处理。

2、一台计算机挂了还有另外副本计算机提供数据。

3、每台计算机可以放在不同的地域,这样用户就可以就近访问,提高访问速度。

  • 常用的分布式文件系统 - 知乎 (zhihu.com)

minio

官网:https://min.io

中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/

  • 轻量,简单,功能强大
  • 适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。支持大小从几k到5T
  • 读写性能好
  • MinIO集群采用去中心化共享架构,每个结点是对等关系,通过Nginx可对MinIO进行负载均衡访问。
  • 冗余存储,安全性高
  1. 去中心化有什么好处?

在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

它将分布在不同服务器上的多块硬盘组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。如下图:
image.png

Minio使用纠删码技术来保护数据,它是一种恢复丢失和损坏数据的数学算法,它将数据分块冗余的分散存储在各各节点的磁盘上,所有的可用磁盘组成一个集合,上图由8块硬盘组成一个集合,当上传一个文件时会通过纠删码算法计算对文件进行分块存储,除了将文件本身分成4个数据块,还会生成4个校验块,数据块和校验块会分散的存储在这8块硬盘上。

使用纠删码的好处是即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。 比如上边集合中有4个以内的硬盘损害仍可保证数据恢复,不影响上传和下载,如果多于一半的硬盘坏了则无法恢复。

fastDfs

HDFS

云厂家:oss

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

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

相关文章

算法模板(4):动态规划(2)

8.树形DP 没有上司的舞会 树上最大独立集问题 Ural 大学有 N N N 名职员,编号为 1 ∼ N 1 \sim N 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 H i H_i Hi​ 给出,…

顺序查找和折半查找

顺序查找和折半查找 顺序查找 一、算法思想 顺序查找,又叫“线性查找”,通常用于线性表。 算法思想:从头到尾挨个找(或者反过来也OK) 二、算法实现 结构体定义 typedef struct{ElemType *elem;int TableLen; }SS…

SpringBoot + Vue 的留守儿童系统的研究与实现

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 1.研究背景 以往的留守儿童爱心的管理,一般都是纸质文件来管理留守儿童爱心信息,传统的管理方式已经无法满足现代人们的需求;使用留…

变压器差动保护的影响因素和相应的措施

由于变压器一、二次电流、电压大小不同,相位不同,电流互感器特性差异,电源侧有励磁电流,都将造成不平衡电流流过继电器,必须采用相应措施消除不平衡电流的影响。 主要措施 (1)减小稳态情况下的…

SpringCloud学习笔记(四)RabbitMQ

一、同步通讯的优缺点 时效性较强,可以立即得到结果但是耦合度高,性能和吞吐能力下降有额外的资源消耗 二、异步通讯的优缺点 耦合度低,吞吐量提升故障隔离,流量削峰依赖于Broker的可靠性、安全性和吞吐能力 三、什么是MQ MQ…

物联网Lora模块从入门到精通(七)串口通讯

一、前言 在Lora模块的程序设计中,串口通信一定是一个极其重要且常用的通信方式,借助串口通信,我们不但可以向外传输我们获取的数据,还可以根据外部指令做出相应。 同样的,在例程中,为我们提供了一个名为us…

SSM简易项目实战(基本CRUD操作):速速来学+项目完整源码

前言:又是一年暑期将至,找实习?手里没几个项目恐怕不行,今天给各位带来一个较为简易的Web项目,快来学吧! 一、项目简介 1、云借阅图书管理系统 技术栈:(SpringSpringMVCMybatisMyS…

【面试必问】Spring核心之控制反转(IOC)

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 💕💕 推荐:体系化学习Java(Java面试专题&#…

驱动开发:内核封装WFP防火墙入门

WFP框架是微软推出来替代TDIHOOK传输层驱动接口网络通信的方案,其默认被设计为分层结构,该框架分别提供了用户态与内核态相同的AIP函数,在两种模式下均可以开发防火墙产品,以下代码我实现了一个简单的驱动过滤防火墙。 WFP 框架分…

触发器和事件自动化的讲解

触发器和事件自动化 一、触发器 1、触发器的基本概念 触发器是和表相关的一种数据库对象,可以将他看作一种特殊的存储过程,不需要人为调动的存储过程。 关键字:trigger 基本作用:通过对表进行数据的插入、更新或删除等操作来触…

UnityVR--AudioManager--音频管理中心

目录 前言 建立音频配置文件AudioConfig 建立音频管理AudioManager 使用AudioManager播放音效 前言 关于音频组件的简单使用请详见VideoPlayer&AudioSource,不过在一个工程项目中,会有很多的声音文件,播放的时间和条件也不相同&#…

【算法题】2614. 对角线上的质数

题目: 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。 注意: 如果某个整数大于 1 ,且不存在除 1 和自身之外的正整数因子,…

Docker环境下部署Ghost开源内容管理系统

Docker环境下部署Ghost开源内容管理系统 一、Ghost介绍1.1 Ghost简介1.2 Ghost特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Ghost镜像五、部署Ghost开源内容管理系统…

【linux工具备忘录】- tmux

文章目录 安装常用命令会话的进入和退出窗口创建、删除、切换窗口内的子窗口管理(创建/删除/切换)会话的后台托管管理 tmux的配置配置的创建配置重载修改前缀键更多使用说明 tmux的插件管理tpm插件管理器tmux-powerline 一个漂亮的底栏 安装 sudo apt install tmux常用命令 会…

分布式软件架构——RESTful服务

RESTful(Representational State Transfer) RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网…

shell脚本基础2——条件语句、分支选择、循环语句

文章目录 一、条件语句二、分支选择三、循环语句3.1 for循环3.1.1 语法一3.1.2 语法二 3.2 while循环3.2.1 普通用法3.2.2 whileif判断循环3.2.3 特殊用法 3.3 until循环 四、break和continue4.1 break用法4.2 continue用法 五、自定义脚本退出状态码 一、条件语句 使用 if 语句…

XdsObjects .NET 8.45.1001.0 Crack

XdsObjects 是一个工具包,允许开发人员使用 IHE XDS 和 XDS-I 配置文件开发应用程序,只需花费最少的时间和精力,因为遵守配置文件和 ebXML 规则的所有艰苦工作都由该工具包处理。 它为所有角色提供客户端和服务器支持,包括&#…

【Spring MVC】学会这些你就会利用Spring Boot进行前后端交互了,美滋滋,距离编程世界更近一步了,何乐而不为呢 ? ? ?

前言: 大家好,我是良辰丫,! ! !💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成…

【仪器使用操作笔记】 TDS1012示波器基础原理与使用

今日要学习使用的是一台实验室老旧战损版TDS1012示波器,它长这样: 本文会从以下目录的几个方面全方位介绍示波器的一些基础运用: 目录 一、面板按键旋钮介绍: 整体面板介绍: 示波器探头接线与校准接线: …

一文弄懂java中的代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。 这样做的好处是:可以在目标对象实现的基础上,增强额…