IO流-文件复制

news2024/9/21 22:48:56

IO流

  • 概述:IO流,输入输出流(Input Output)
  • 流:一种抽象的概念,对数据传输的总称。(数据在设备之间的传输称为流)
  • 常见的功能
    • 文件复制
    • 文件上传
    • 文件下载
  • 学习流,我们要搞懂流的方向,这个是很重要的一个事情
    • 输入-读数据 (从硬盘到程序)
    • 输出-写数据 (从程序到硬盘)
  • IO流分类
    • 按照数据流向
      • 输入流
      • 输出流
    • 按照数据类型
      • 字节流
      • 字符流
  • 如何判断使用哪种流?
    • 通过自带记事本打开,能读懂内容,用字符流
    • 一般使用字节流

字节流

字节输入流
InputStream
  • 概述:这个抽象类是字节输入流所有类的超类
FileInputStream
  • 概述:文件输入流,InputStream 的子类

  • 作用:将数据从硬盘读出展示到控制台上

  • 常用方法

    方法作用
    FileInputStream(String name)通过打开与实际文件的连接来创建一个 FileInputStream,该文件由文件系统中的路径名 name 命名
    int read()从该输入流读取一个字节数据,空值为(-1)
    int read(byte[] bys)从该输入流读取一个字节数组,空值为(-1)
  • 常用的两种读取格式

    // 一次读取一个字节数据
    int by;
    while((by = fis.read()) != -1){
        System.out.print((char)by);
    }
    
    // 一次读取一个字节数组
    byte[] bys = new byte[1024];
    int len;
    while((len = fis.read(bys)) != -1){
        System.out.print(new String(bytes, 0, len));
    }
    
  • 代码演示

    • 首先,在 D 盘创建 一个 a.txt 文件,内容 abc123

    注意:fis.read(bys) 一次最大读取 1024 个数据,放入 bys 数组中,返回 当前读取的字符长度

字节输出流
OutputStream
  • 概述:这个抽象类是表示字节输出流的所有类的超类
FileOutputStream
  • 概述:文件字节输出流

  • 作用:将数据写入到硬盘中

  • 常用方法

    方法作用
    FileOutputStream(String name)创建文件输出流以指定的名称写入文件
    void write(int b)将指定的字节写入此文件输出流(一次写一个字节数据)
    void write(byte[] b)将b.length字节从指定的字节数组写入此文件输出流(一次写一个字节数组数据)
    void write(byte[] b , int off , int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流(一次写一个字节数组的部分数据)
  • 代码演示

    public class Test {
        public static void main(String[] args) throws IOException {
            // 创建文件字节输出流对象
            FileOutputStream fos = new FileOutputStream("D:\\b.txt");
            // 一次写一字节
            fos.write(65);
    
            // 一次写一字节数组
            byte[] bys = {97,98,99,100};
            fos.write(bys);
    
            // 从指定位置写
            fos.write(bys,1,2);
    
            // 创建文件字节输入流对象
            FileInputStream fis = new FileInputStream("D:\\b.txt");
            // 读数据
            byte[] b = new byte[1024];
            int len;
            while((len = fis.read(b)) != -1){
                System.out.println(new String(b,0,len));
            }
        }
    }
    

    注意:FileOutputStream 我们直接调用写方法的时候,并未创建文件 b.txt,但是它自己生成了,所以默认当无此文件时,先创建再写入!

字节缓冲流
BufferedOutputStream
  • 概述:字节缓冲输出流。该类实现缓冲输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

  • 构造方法

    方法作用
    BufferedOutputStream(OutputStream os)根据字节输出流对象创建一个字节缓冲输出流对象
BufferedInputStream
  • 概述:字节缓冲输入流。创建BufferedInputStream将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填入,一次很多字节

    方法作用
    BufferedInputStream(InputStream is)根据字节输入流对象创建一个字节缓冲输入流对象

注意:字节缓冲流仅仅提供缓冲区,而真正的读写数据还是依靠基本的字节流对象进行操作


字符流

  • 概述:字符流 = 字节流 + 编码表 ,不能直接写到文本中,需要刷新操作
字符输入流
Reader
  • 概述:字符输入流的抽象类
FileReader
  • 概述:用于读取字符文件的便捷类

    方法作用
    FileReader(String fileName)创建一个字符输入流对象
  • 常用方法:和字节流的一样,只不过字节变成了字符

字符输出流
Writer
  • 概述: 字符输出流的抽象类
FileWriter
  • 概述:用于写入字符文件的便捷类

    方法作用
    FileWriter(String fileName)创建一个字符输出流对象
    void flush()刷新资源
  • 常用方法:和字节流的一样,只不过字节变成了字符

  • 注意:这里写数据后,要调用 flush() 方法进行刷新才行,否则不会显示

字符缓冲流
BufferedReader
  • 概述:字符缓冲输入流(读数据)可以指定缓冲区大小,默认大小已经足够大多数用途

  • 常用方法和特有方法

    方法作用
    BufferedReader(Reader in)创建一个字符缓冲输入流对象
    String readLine()读一行文字,结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
  • 代码格式

    String line;
    while((line = br.readLine()) != null){
        System.out.println(line);
    }
    
BufferedWriter
  • 概述:字符缓冲输出流(写数据)可以指定缓冲区大小,默认大小已经足够大多数用途

  • 常用方法和特有方法

    方法作用
    BufferedWriter(Writer out)创建一个字符缓冲输出流对象
    void newLine()写一行行分隔符,行分隔符字符串由系统属性定义
  • 写数据步骤

    bw.writer(line);                 // 写数据
    bw.newLine();                    // 换行
    bw.flush();                      // 刷新资源
    

IO流总结

  • 字节流可以复制任意文件数据,一般采用字节缓冲流一次读写一个字节数组的方式
  • 字符流只能复制文本数据,一般采用字符缓冲流的特有功能

案例

字节流文件复制

public class Test {
    public static void main(String[] args) throws IOException {
        // 创建 文件字节输入流和输出流对象
        FileInputStream fis = new FileInputStream("D:\\a.txt");
        FileOutputStream fos = new FileOutputStream("D:\\b.txt");

        // 定义字节数组,用来存储读取到的字节
        byte[] bys = new byte[1024];
        // 存储读取到的字节长度
        int len;
        while((len = fis.read(bys)) != -1){
            // 将读取到的数据,写入新文件中
            fos.write(bys,0,len);
        }
        // 释放流
        fis.close();
        fos.close();
    }
}

字节缓冲流文件复制

public class Test {
    public static void main(String[] args) throws IOException {
        // 创建字节缓冲输入流和输出流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\b.txt"));
        // 定义字节数组
        byte[] bys = new byte[1024];
        int len;
        while((len = bis.read(bys)) != -1){
            bos.write(bys,0,len);
            // 记得刷新,要不不显示
            bos.flush();
        }
        // 释放流
        bis.close();
        bos.close();
    }
}

字符流文件复制

public class Test5 {
    public static void main(String[] args) throws IOException {
        // 创建文件字符输入流和输出流对象
        FileReader fr = new FileReader("D:\\a.txt");
        FileWriter fw = new FileWriter("D:\\b.txt");

        // 定义字符数组
        char[] chs = new char[1024];
        int len;
        while((len = fr.read(chs)) != -1){
            fw.write(chs,0,len);
            // 记得刷新
            fw.flush();
        }

        // 释放流     
        fr.close();
        fw.close();
    }
}

字符缓冲流文件复制

public class Test6 {
    public static void main(String[] args) throws IOException {
        // 创建 字符缓冲输入流和输出流对象
        BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\b.txt"));

        // 定义存储 数据的 字符串
        String s;
        while((s = br.readLine()) != null){
            bw.write(s);
            // 换行
            bw.newLine();
            // 刷新
            bw.flush();
        }
        // 释放流
        br.close();
        bw.close();
    }
}

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

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

相关文章

CSS 发光输入框动画

<template><view class="content"><input placeholder="请输入..." class="input" /> </view> </template><script></script><style>/* 设置整个页面的背景颜色为 #212121 */body{background-c…

centos7系统部署SqlServer2019

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一 关于SQL Server SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统(RDBMS)。 二 安装部署 2.1 安装依赖 …

使用 matlab 求解最小二乘问题

有约束线性最小二乘 其标准形式为&#xff1a; min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin​21​∥Cx−d∥22​ 约束条件为&#xff1a; A ⋅ x ≤ b A e q ⋅ x b e q l b ≤ x ≤ u b \begin{aligned} …

linux创建pyspark虚拟环境

一、创建虚拟环境 conda create -n test python3.6.6 二、注意添加镜像 vi /root/.condarc channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- http://mirrors.ustc.edu.cn/anaconda/pkgs/ma…

消息队列-RockMQ-批量收发实践

批量收发实战 发送消息是需要网络连接的如果我们单条发送吞吐量可能没有批量发送好。剖来那个发送可以减少网络IO开销&#xff0c;但是也不能一批次发送太多的数据&#xff0c;需要根据每条消息的大小和网络带宽来确定量的数目。 比如网络带宽为可以支持一次性发送8M的数据包&…

如何解读服务器的配置和架构?

在当今数字化时代&#xff0c;服务器作为企业或组织的重要基础设施&#xff0c;其配置和架构对于保障业务的稳定运行至关重要。如何解读服务器的配置和架构&#xff0c;成为了一个备受关注的话题。本文将围绕服务器配置和架构的解读进行深入探讨&#xff0c;帮助读者更好地理解…

DDIM学习笔记

写在前面&#xff1a; &#xff08;1&#xff09;建议看这篇论文之前&#xff0c;可先看我写的前一篇论文&#xff1a; DDPM推导笔记-大白话推导 主要学习和参考了以下文章&#xff1a; &#xff08;1&#xff09;一文带你看懂DDPM和DDIM &#xff08;2&#xff09;关于 DDIM …

如何精选WordPress插件

WordPress的强大功能大多得益于其众多插件。正确选择插件可以让你的网站功能强大、运行平稳&#xff0c;而错误的选择则可能导致网站变慢甚至出现安全漏洞。这篇文章将指导你如何在众多可选的插件中作出明智的选择。 明确需求 在浏览WordPress的插件目录或其他市场之前&#…

阶段十-分布式-任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架&#xff08;vue-CLI&#xff09;的使用是基于nodejs环境下的。 你可以简单理解为&#xff0c;Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考&#xff1a;https://blog.csdn.net…

谁动了我的注册表?免费的注册表对比分析工具

关于这款工具&#xff0c;可以在B站搜谁动了我的注册表&#xff0c;UP主名字为有限的未知。该注册表对比分析工具视频教程链接如下。谁动了我的注册表&#xff1f;注册表比对分析工具 & 手动实现右键菜单自由_哔哩哔哩_bilibili 声明&#xff1a;该款注册表分析软件&#…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

接口测试实战教程详解(加密解密攻防)

一、对称加密 对称加密算法是共享密钥加密算法&#xff0c;在加密解密过程中&#xff0c;使用的密钥只有一个。发送和接收双方事先都知道加密的密钥&#xff0c;均使用这个密钥对数据进行加密和解密。 数据加密&#xff1a;在对称加密算法中&#xff0c;数据发送方将明文 (原…

用python提取excel表格第一列汉字首字母到第二列

今天有个任务就是需要提取excel表格里面的汉字首字母&#xff0c;然后我就手动写了三个小时&#xff0c;结果还剩3000多行&#xff0c;这样下去不行啊 想了下用python能不能做到呢&#xff1f; import openpyxl from pypinyin import lazy_pinyin, Style# 加载工作簿 workbook…

代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com) 总结 332.重新安排行程 欧拉通路和欧拉回路&#xff1a; 欧拉通路&#xff1a;对于图G来说&#xff0c;如果存在一条通路包含G的所有边&#xff0c;则该通路称为欧拉通路&#xff0c;也称欧拉路径。欧拉回路&#xff1a;如果欧拉路径是一条…

mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

文章目录 场景使用JacksonTypeHandler实现类型转换自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中, mybatisPlus默认实现了JacksonTypeHandler&#xff0c;GsonTypeHandler&#xff0c;FastjsonTypeHandler&#xff0c;也可以自定义…

(2022|CVPR,非自回归,掩蔽图像生成,迭代译码)MaskGIT:掩蔽生成式图像 Transformer

MaskGIT: Masked Generative Image Transformer 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 训练中的掩蔽视觉标记建模&#xff08;Masked Visual Token Mod…

科技云报道:“存算一体”是大模型AI芯片的破局关键?

科技云报道原创。 在AI发展历史上&#xff0c;曾有两次“圣杯时刻”。 第一次发生在2012年10月&#xff0c;卷积神经网络&#xff08;CNN&#xff09;算法凭借比人眼识别更低的错误率&#xff0c;打开了计算机视觉的应用盛世。 第二次是2016年3月&#xff0c;DeepMind研发的…

在anaconda中安装pytorch的GPU版本

本文前提&#xff1a; 1.你已经下载好了anaconda,最好是新建一个虚拟环境来安装pytorch的GPU版本&#xff0c;并且设置了国内镜像源&#xff1b; 2.了解自己电脑对应的cuda版本&#xff0c;可通过nvidia-smi&#xff0c;并下载好了cuda。 安装pytorch的GPU版本 到官网中https…