JavaSE——IO流1:FileOutputStream(字节输出流)、FileInputStream(字节输入流)

news2024/11/27 18:48:32

目录

一、IO流概述

二、IO流的分类

三、字节输出流与字节输入流

(一)字节输出流——FileOutputStream

1.FileOutputStream书写步骤

2.FileOutputStream书写细节

3.FileOutputStream写数据的3种方式

4.FileOutputStream的换行和续写

(二)字节输入流——FileInputStream

1.FileInputStream书写步骤

2.FileInputStream书写细节

(三)文件拷贝

1.使用FileInputStream和FileOutputStream拷贝文件

2.文件拷贝的弊端 

3.使用FileInputStream和FileOutputStream拷贝文件改进

4.异常捕获

5.实现了AutoClosable的类使用try-with-resourses

5.1JDK7的写法 

5.2JDK9的写法 


一、IO流概述

        IO流:存储读取数据的解决方案。

        内存中的数据,不能永久化存储,程序停止,数据就会丢失。如果将数据保存在文件中,下一次打开文件就还能够获取数据。

        File类表示系统中的文件或者文件夹的路径。利用File可以获取文件信息(大小、文件名、修改时间)、判断文件类型、创建文件/文件夹、删除文件/文件夹等。但是,File类只能对文件本身进行操作,不能读写文件里面存储的数据。

        因此,想要读写文件中或网络中的数据,就必须使用IO流。


写出数据:又叫output,将数据保存到文件当中。

读取数据:又叫input,将数据从文件中加载到程序中。

因此,以程序(或内存)为参照物看读写的方向。

二、IO流的分类

IO流的简单分类:

(一)按照流向分类

输出流:程序——>文件

输入流:文件——>程序

(二)按照操作文件的类型

字节流:可以操作所有类型的文件

字符流:只能操作纯文本文件

纯文本文件的概念:用windows系统自带的记事本打开并且能读懂的文件(.txt、.md、.xml、.lrc等)

三、字节输出流与字节输入流

注意:以下文件的读写都是英文,暂时不考虑中文。

(一)字节输出流——FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中,是字节流的基本流。

1.FileOutputStream书写步骤

(1)创建字节输出流对象;

(2)将数据写到目标文件中;

(3)释放资源

public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {        
        FileOutputStream fos = new FileOutputStream("chapter18\\a.txt");
        fos.write(97);
        fos.close();
    }
}

2.FileOutputStream书写细节

3.FileOutputStream写数据的3种方式

public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("chapter18\\a.txt");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(97);
        fos.write(98);
        fos.write(10); // 10在ASCII码表中表示换行

        byte[] bytes = {97, 32, 98, 99, 100, 101};
        fos.write(bytes); // 32在ASCII码表中表示空格
        fos.write(10);

        // 要写出的数组,起始索引,写出的元素个数
        fos.write(bytes, 1, 3);
        fos.write(10);
        fos.close();
    }
}

a.txt文件内容:

4.FileOutputStream的换行和续写

换行写:
    再次写出一个换行符就可以了
    windows: \r\n或\n
    Linux:    \n
    Mac:      \r


续写:
    如果想要续写,打开续写开关即可
    开关位置:创建对象的第二个参数
    默认false:表示关闭续写,此时创建对象会清空文件
    手动传递true:表示打开续写,此时创建对象不会清空文件

public class ByteStreamDemo3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("chapter18\\b.txt", true); // 打开续写
        // 换行
        String str = "zhangsan";
        byte[] bytes1 = str.getBytes();
        fos.write(bytes1);

        String wrap = "\n";
        byte[] bytes2 = wrap.getBytes();
        fos.write(bytes2);

        String str2 = "999";
        byte[] bytes3 = str2.getBytes();
        fos.write(bytes3);

        fos.close();
    }
}

b.txt文件

(二)字节输入流——FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中。

1.FileInputStream书写步骤

(1)创建字节输入流对象

(2)读取数据

(3)释放资源

public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("chapter18\\b.txt");
        int b1;
        while ((b1 = fis.read()) != -1) {
            System.out.print((char) b1);
        }
        fis.close();
    }
}

b.txt文件:

读取结果:

2.FileInputStream书写细节

(三)文件拷贝

1.使用FileInputStream和FileOutputStream拷贝文件

public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {
        // 1.创建对象
        FileInputStream fis = new FileInputStream("D:\\test\\aaa\\movie.mp4");
        FileOutputStream fos = new FileOutputStream("chapter18\\copy.mp4");
        // 2.拷贝:边读边写
        long start = System.currentTimeMillis();
        int b;
        while ((b = fis.read()) != -1) {
            fos.write(b);
        }
        long end= System.currentTimeMillis();
        System.out.println("拷贝时间:" + copyTime + "毫秒");
        // 拷贝时间:104289毫秒

        // 3.释放资源
        // 规则:先开的最后关闭
        fos.close();
        fis.close();
    }
}

2.文件拷贝的弊端 

上面文件拷贝方式的弊端:一次读取一个字节,时间长,效率低。

改进办法:

一次读一个字节数组的数据,每次读取会尽可能把数组装满,数组长度一般是1024的整数倍。

文件拷贝代码示例:

public class ByteStreamDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("chapter18\\b.txt");

        // b 代表的是实际读取的字节数
        int b;
        byte[] bytes = new byte[2];
        while ((b = fis.read(bytes)) != -1) {
            String str = new String(bytes, 0, b);
            System.out.print(str);
        }
        fis.close();
    }
}

运行结果:

3.使用FileInputStream和FileOutputStream拷贝文件改进

public class ByteStreamDemo4 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\test\\aaa\\movie.mp4");
        FileOutputStream fos = new FileOutputStream("chapter18\\copy.mp4");

        long start = System.currentTimeMillis();
        int len;
        byte[] bytes = new byte[1024 * 1024];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        long end = System.currentTimeMillis();
        long copyTime = end - start;
        System.out.println("拷贝时间:" + copyTime + "毫秒");
        // 拷贝时间:43毫秒

        fos.close();
        fis.close();
    }
}

4.异常捕获

public class ByteStreamDemo4 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("D:\\test\\aaa\\movie.mp4");
            fos = new FileOutputStream("chapter18\\copy.mp4");

            int len;
            byte[] bytes = new byte[1024 * 1024];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

5.实现了AutoClosable的类使用try-with-resourses

5.1JDK7的写法 

        只有实现了AutoCloseable的类才能在()中创建对象,表示整个try-catch执行完之后,()中的流就会自动释放资源。

public class ByteStreamDemo4 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("D:\\test\\aaa\\movie.mp4");
             FileOutputStream fos = new FileOutputStream("chapter18\\copy.mp4")) {
            int len;
            byte[] bytes = new byte[1024 * 1024];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.2JDK9的写法 
public class ByteStreamDemo4 {
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("D:\\test\\aaa\\movie.mp4");
        FileOutputStream fos = new FileOutputStream("chapter18\\copy.mp4");
        try (fis; fos) {
            int len;
            byte[] bytes = new byte[1024 * 1024];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

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

相关文章

如何给手机换ip地址

在当今数字化时代,IP地址作为设备在网络中的唯一标识,扮演着举足轻重的角色。然而,有时出于隐私保护、网络访问需求或其他特定原因,我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法,帮助您轻松实现手机IP…

若依框架中spring security的完整认证流程,及其如何使用自定义用户表进行登录认证,学会轻松实现二开,嘎嘎赚块乾

1)熟悉之前的SysUser登录流程 过滤器链验证配置 这里security过滤器链增加了前置过滤器链jwtFilter 该过滤器为我们自定义的,每次请求都会经过jwt验证 ok我们按ctrl alt B跳转过去来看下 首先会获取登录用户LoginUser 内部通过header键,获…

Deep Learning

深度学习 文章目录 前言面向开发人员的 NVIDIA AI 平台每个 AI 框架 - 加速统一平台从开发到部署前言 深度学习是 AI 和机器学习的一个子集,它使用多层人工神经网络在对象检测、语音识别、语言翻译等任务中提供最先进的准确性。 深度学习与传统机器学习技术的不同之处在于,深…

python爬虫加解密分析及实现

第一种: 1、找到加密的接口地址,通过加密的接口地址全局搜索 2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二; 3、找到用的是哪种加密方式,如: cr…

PCL 点云配准 基于目标对称的ICP算法(精配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1计算点云的法线 2.1.2基于对称误差估计的ICP配准 2.1.3可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总…

OpenCV高级图形用户界面(20)更改窗口的标题函数setWindowTitle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在OpenCV中,cv::setWindowTitle函数用于更改窗口的标题。这使得您可以在程序运行时动态地更改窗口的标题文本。 函数原型 void cv::…

SpringBoot日常:封装redission starter组件

文章目录 逻辑实现POM.xmlRedissionConfigRedissionPropertiesRedissionUtilsspring.factories 功能测试application.yml配置POM.xmlTestController运行测试 本章内容主要介绍如何通过封装相关的redission连接配置和工具类,最终完成一个通用的redission starter。并…

论文速读:通过目标感知双分支蒸馏进行跨域目标检测(CVPR2022)

原文标题:Cross Domain Object Detection by Target-Perceived Dual Branch Distillation 中文标题:通过目标感知双分支蒸馏进行跨域目标检测 论文地址: https://arxiv.org/abs/2205.01291 代码地址: GitHub - Feobi1999/TDD 这篇…

使用多块AMD GPU通过Megatron-DeepSpeed进行大型语言模型的预训练

Pre-training a large language model with Megatron-DeepSpeed on multiple AMD GPUs 2024年1月24日,作者:Douglas Jia 在这篇博客中,我们将向你展示如何使用Megatron-DeepSpeed框架在多块AMD GPU上预训练GPT-3模型。我们还将展示如何使用你…

5、JavaScript(二) 对象+DOM

17.对象 1、对象:⽤来存储多个数据的 是由多个键值对/key value对组成的 ⽤来描述⼀个事物的 相当于多个变量的集合 2、格式 :{key:value,key:value} 键/值对 属性名:属性值 3、对象的属性值是不限制数据类型的,甚至还可以是对…

常用的字符集(ASCII、GBK)

目录 1.ASCII字符集 2.各版本的字符集 3. GBK字符集在计算机中的存储规则 4. 总结 1.ASCII字符集 计算机中最小的存储单元是一个字节,一个字节8bit 0-127 一共是128个 2.各版本的字符集 只需要掌握GBK和Unicode两个字符集。GBK是简体中文window操作系统默认使…

85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找

目录 3.操作顺序表 1.分析中间插入函数 函数的参数 代码示例 图片分析 main.c部分改为 在SeqList.h添加SLInsert函数的声明 运行结果 2.分析中间删除函数 函数的参数 代码示例 图片分析 main.c部分改为 在SeqList.h添加SLErase函数的声明 运行结果 承接84.【C语…

Atlas800昇腾服务器(型号:3000)—YOLO全系列NPU推理【检测】(五)

服务器配置如下: CPU/NPU:鲲鹏 CPU(ARM64)A300I pro推理卡 系统:Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本: Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

spring boot实现不停机更新

主要实现思路:发布新的应用程序(与原端口不同),启动成功后,将原端口进行优雅关闭,同时将应用程序端口动态切换至原端口 application.yml server:port: 8000shutdown: graceful DatapickCliApplication package com.zy.datapickcli;import org.springframework.boot.SpringAp…

保研考研机试攻略:python笔记(1)

🐨🐨🐨宝子们好呀 ~ 我来更新欠大家的python笔记了,从这一篇开始我们来学下python,当然,如果只是想应对机试并且应试语言以C和C为主,那么大家对python了解一点就好,重点可以看高分篇…

pikachu靶场CSRF-get测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、抓包使用burp生成csrf脚本 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 Burp sui…

【Trick】在vscode上配置copilot时,输出端出现Invalid copilot token: missing token: 403

今天心血来潮想要给vscode配置一个copilot,正好上学期在github上通过教育邮箱实现了学生认证,可以免费使用copilot服务(bushi)。 首先是按照官网(Getting code suggestions in your IDE with GitHub Copilot - GitHub…

机器学习与金融风控项目篇-day01-风控业务

一. 整体项目介绍 1.风控业务和风控报表 零售金融产品相关的指标风控建模流程 2.特征工程 特征构造特征筛选 3.评分卡模型构建 逻辑回归集成学习 XGBoost LightGBM模型评估 4.样本不均衡问题/异常点检测 二. 信贷与风控介绍 信贷业务 信贷业务,就是贷款业务&#x…

桃子叶片病害分类检测数据集(猫脸码客 第221期)

桃子叶片病害分类检测数据集 一、引言 桃子作为世界上广泛种植的果树之一,其叶片的健康状况直接关系到果实的产量和品质。然而,桃子叶片易受多种病害的侵袭,这些病害不仅影响叶片的光合作用,还可能导致果实减产、品质下降&#…

XPM_CDC_SYNC_RST

免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济…