FileInputStream 和 FileOutputStream

2023-11-04

1、什么是流

        流是一连串流动的字符, 是一组有序的数据序列,是以先进先出方式发送信息的通道,将数据从一个地方带到另一个地方,在 java 中所有数据都是使用流读写的。同时可以通过流进行文件的读写操作。

2、流的分类

        按照流向,可以分为输入流和输出流两大类

        简单来说,可以理解为将磁盘中的数据读入到内存中即为输入流;相反,将内存中的数据存入磁盘中即为输出流

        按处理数据的单元,可以将流分为字节流和字符流两大类

        字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

3、文件读写操作

        文件分为文本文件和二进制文件,对不同类型的文件,我们需要的操作也不尽相同

  • FileInpitStream

FileInputStream类常用方法

  • int read( )

  • int read(byte[] b)

  • int read(byte[] b,int off,int len)

  • void close( )

  • int available()

 子类FileInputStream常用的构造方法

  • FileInputStream(File file)

  • FileInputStream(String name)

FileInputStream读取文本文件操作步骤:

  1. 创建文件文件输入流对象

    FileInputStream fis= new FileInputStream(File类或String类文件路径);
  2. 读取文本文件的数据

    fis.read(); 
  3. 关闭文件流

    fis.read(); 

参考代码:

public class TestFileInputStream {
    public static void main(String[] args) {
        String path = "D:\\aa.txt";
        File file = new File(path);
        // 需先判断文件是否存在,若不存在,创建
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileInputStream fileInputStream = null;
        try {
            // 创建输入流对象(一般参数使用File类型,也可以跟路径path)
            fileInputStream = new FileInputStream(file);
            // 进行文件的操作,若读到文件末尾,将返回一个-1
            int read = -1;
            while (true) {
                // fileInputStream读取到的是字节,并非字符型
                // 需要经过强转(char)才能显示字符
                read = fileInputStream.read();
                if (read == -1) {
                    break;
                }
                System.out.print((char) read);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源,释放前,需要先确认文件是否存在
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

        在以上代码中,我们会存在两个问题:一是手动关闭资源比较麻烦,二是一个字节一个字节的读取不够高效,对此,我们进行优化

参考代码:

/**
 * @author Nil
 * @create 2021-11-21-14:32
 * @description 如果觉得手动关闭资源比较麻烦,可以使用jdk1.7引入的自动关闭资源的写法
 */

public class TestFileInputStream2 {
    public static void main(String[] args) {
        String path = "D:\\aa.txt";
        // 在try中创建流后会自动释放资源:fileInputStream.close()
        try(FileInputStream fileInputStream = new FileInputStream(path)) {
            while (true) {
                // 创建缓冲区,用字符数组读取内容
                byte[] datas = new byte[3];
                int read = fileInputStream.read(datas);
                System.out.println(read);
                // 获取数据
                for (int i = 0; i < datas.length; i++) {
                    System.out.print((char)datas[i]+"");
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • FileOutputStream

FileOutputStream类常用方法

  • void write(int c)

  • void write(byte[] buf)

  • void write(byte[] b,int off,int len)

  • void close( )

 子类FileOutputStream常用的构造方法

  • FileOutputStream (File file)

  • FileOutputStream(String name)

  • FileOutputStream(String name,boolean append)

FileOutputStream写入文本文件操作步骤:

  1. 创建文件文件输出流对象

    OutputStream os = new FileOutputStream("D:\\hello.txt");
  2. 把数据写入文本文件中

    String str ="content";
    byte[] words = str.getBytes();
    os.write(words, 0, words.length); 
  3. 关闭文件流

    os.close();

参考代码:

public class TestFileOutputStream {
    public static void main(String[] args) {
        String path = "d:\\info.txt";
        OutputStream outputStream = null;
        try {
            // 1.先判断是否存在该文件
            File file = new File(path);
            boolean ret = false;
            if (!file.exists()) {
                // 2.创建文件
                ret = file.createNewFile();
            }
            // 有文件
            if (ret) {
                // 3、创建输出流
                outputStream = new FileOutputStream(file);
                // 4、进行写入操作,写入字符
                outputStream.write('a');
                System.out.println("写入成功!");
            } else {
                System.out.println("文件不存在!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

        上述代码存在几个问题:一个是该写入方式只会覆盖,而不是追加;二是存在编码混乱的问题,对此,我们进行优化

public class TestFileOutputStream2 {
    public static void main(String[] args) {
        String path = "d:\\info.txt";
        OutputStream outputStream = null;
        try {
            // 1.先判断是否存在该文件
            File file = new File(path);
            if (!file.exists()) {
                // 2.创建文件
                if (!file.createNewFile()) {
                    System.out.println("文件创建失败!");
                    return;
                }
            }
            // 3、指定编码
            String word = "888";
            byte[] bytes = word.getBytes(StandardCharsets.UTF_8);
            // 4、创建输出流,追加方式
            outputStream = new FileOutputStream(file,true);
            // 5、进行写入操作
            outputStream.write(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileInputStream 和 FileOutputStream 的相关文章

随机推荐

  • DataPipeline如何实现数据质量管理

    数据质量管理已经成为数据治理的重要组成部分 高质量的数据是企业进行决策的重要依据 DataPipeline数据质量平台整合了数据质量分析 质量校验 质量监控等多方面特性 以保证数据质量的完整性 一致性 准确性及唯一性 帮助企业解决在数据集成
  • vue+webpack实现异步组件加载

    8 9更新 之前想搬迁到csdn的时候由于邀请码问题迟迟没把博客转过来 所以跑去博客园了 今天发现csdn已经帮我把文章搬过来 有必要修正一下这篇文章 写这篇文章的时候因为刚接触vue 所以捣鼓的时候有些迷糊 以下可以跳过 本来很简单的事情
  • Centos8 Failed to download metadata for repo ‘AppStream‘解决

    1 这个问题主要原因是 CentOs Linux 8 从 2021 10 31 号后已经停止维护 CentOS 8 将不再从 CentOS 官方项目获得开发资源 所以之后更新镜像需要通过 vault centos org来获取更新 2 进入
  • 无向图的表示:邻接矩阵和邻接表

    这里将一个无向图用邻接表和邻接矩阵表示 输入 顶底个数n 图中的各个边 用两个顶点表示 输出 这个无线图的邻接矩阵和邻接表 其中邻接表中的链接按元素大小升序排列 先给出一个例子说明 假设有无向图如下 则其邻接矩阵和邻接表如提示框中所示 其实
  • javaweb项目实战(附有源码)

    这个代码是我做微信小程序的时候 专门用java做的web项目 主要是为前端提供接口 便于前端调用数据 如果有想要参考javaweb项目如何做的小伙伴 可以到github上下载 github上有前端和后端代码 在wiki上还有表结构和接口文档
  • VIM 点滴积累

    删除列 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式 选取这一列操作多少行 3 d 删除 插入列 插入操作的话知识稍有区别 例如我们在每一行前都插入 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式
  • java stream SONObject和JSONArray操作

    转自 https zhuanlan zhihu com p 36865573 1 取最后一条数据 stream对象存在方法findFirst 我们可以很方便的取到第一条数据 但它却没有findLast方法 需要取到最后一条数据 我们可以将数
  • 模型微调(Finetune)

    参考 https zhuanlan zhihu com p 35890660 ppt下载地址 https github com jiangzhubo What is Fine tuning 一 什么是模型微调 给定预训练模型 Pre tra
  • IDDPM论文阅读

    论文链接 Improved Denoising Diffusion Probabilistic Models 文章目录 摘要 引言 去噪扩散概率模型 定义 实际训练 对数似然改善 可学习的
  • Linux-Shell技巧-参数化alias

    shell脚本提供了改写命令方式 alias 但是alias改写常用的是直接改写方式 比如如下操作 alias ll ls alt alias g gvim 但通常情况下 有的明林需要传递参数 或者用户可以自定义话一些常用的路径 但有些文件
  • docker-/var/lib/docker数据迁移

    docker默认目录是 var lib docker 位于系统盘上 占用空间比较大 计划迁移到新挂在的盘上 第一步 在新盘上创建文件夹 mkdir p data docker lib 第二步 复制文件到新目录 rsync avz var l
  • 数据结构与算法(二十)快速排序、堆排序(四)

    数据结构与算法 三 软件设计 十九 https blog csdn net ke1ying article details 129252205 排序 分为 稳定排序 和 不稳定排序 内排序 和 外排序 内排序指在内存里 外排序指在外部存储空
  • electron-vue工程创建

    创建工程 创建一个工作文件夹用于存放所有Electron工程 设为 D work 打开CMD cd到 D work 文件夹下 然后执行命令 创建 electron vue 工程 创建过程会多次提示输入信息 vue init simulate
  • 【2011集训队出题】Digit

    Description 在数学课上 小T又被老师发现上课睡觉了 为了向全班同学证明小T刚才没有好好听课 数学老师决定出一道题目刁难一下小T 如果小T答不出 那么 情节就按照俗套的路线发展下去了 小T显然无法解决这么复杂的问题 可怜的小T只能
  • 联想拯救者系统重装?不求人教程

    前阵子帮人重装了联想原装系统 今天总结一下步骤 造福那些想给女同志装联想原装系统而无从下手的工具人 哈哈哈哈哈 进入正题 既然要重装系统 就绕不开做启动盘 要做一个玉洁冰清 小声BB 纯净无插件 的启动盘 U盘启动盘制作工具的选择就很关键
  • 爬虫毕设(三):爬取动态网页

    动态网页分析 按照上一篇的分析 直接使用XPath找到该标签 然后通过parse提取出数据 在写入到item中就完事了 但是 当信心满满的写完代码后却发现 控制台输入了一个简简单单的 小问号你是否有很多朋友 一顿操作猛如虎 一看输出数据无
  • 在Arduino中使用DS18B20温度传感器(基于OneWire和DallasTemperature库)

    文章目录 目的 快速使用 相关库引入 使用步骤 使用演示 演示一 演示二 演示三 相关库说明 OneWire库 DallasTemperature库 总结 目的 DS18B20是常用的温度传感器 功能够用 使用简单 本文将用Arduino第
  • 一周Hard (2021.12.20-2021.12.26)

    由于除了刷题外还有些个人的事情 所以大概本周的安排是这样的 本周前两天先研究下关于在周赛272中遇到的问题 打算思考明白并给出一个详细的证明 对于周赛272让我重新拎起LIS 打算对相应的题目进行学习 LC 673 另外大概是要重新学习DP
  • php 基于ICMP协议实现一个ping命令

    php 基于ICMP协议实现一个ping命令 网络协议是什么 ICMP 协议 什么是ICMP ICMP 的主要功能 ICMP 在 IPv4 和 IPv6 的封装 Wireshark抓包 ICMP 请求包分析 PHP构建 ICMP 数据包 p
  • FileInputStream 和 FileOutputStream

    1 什么是流 流是一连串流动的字符 是一组有序的数据序列 是以先进先出方式发送信息的通道 将数据从一个地方带到另一个地方 在 java 中所有数据都是使用流读写的 同时可以通过流进行文件的读写操作 2 流的分类 按照流向 可以分为输入流和输