Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝

news2024/12/25 9:31:21

Java-FileInputStream和FileOutputStream的使用

  • 什么是IO流?流是什么?
  • IO流的类图
  • 流的分类
    • 字符与字节的区别
  • FileInputStream的使用
    • 1.构造器
    • 2.常用方法
    • 3.使用FileInputStream来读取txt文件
  • FileOutputStream的使用
    • 1.构造器
    • 2.常用方法
    • 3.使用FileOutputStream写入字符到txt文件
  • 图片文件拷贝

什么是IO流?流是什么?

流是一种抽象概念,它代表了数据的无结构化传递。

按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

IO流的类图

java.io 下的类的关系图:
在这里插入图片描述

流的分类

  • 按照操作的数据的单位的不同可以分为 字符流(按字符)和 字节流 (bit)二进制文件.
  • 输入和输出的流向不同 输入流,输出流
  • 根据流的角色不同分为:节点流,处理流/包装流

根据上图也可以观察到,流的类有好多个,但是都是由四个基类派生出来的。

抽象基类类名类型
InputStream字节输入流
OutputStream字节输出流
Reader字符输入流
Writer字节输出流

字符与字节的区别

字节 (Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。

字符 (Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、‘$’、'&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。

总的来说,字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件(二进制文件)。 字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。 用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。 字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。 而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。

FileInputStream的使用

在这里插入图片描述

1.构造器

构造方法描述
FileInputStream​(File file)通过File对象来获取一个FileInputStream的对象
FileInputStream​(FileDescriptor fdObj)通过使用文件描述符 fdObj创建 FileInputStream
FileInputStream​(File file)通过File对象来获取一个FileInputStream的对象
FileInputStream​(String name)通过文件路径字符串来获取一个FileInputStream的对象

2.常用方法

方法名描述
void close​()关闭此文件输入流并释放与流相关联的任何系统资源。
int read​()从该输入流读取一个字节的数据。
int read​(byte[] b)从该输入流读取最多 b.length个字节的数据到一个字节数组
int read​(byte[] b, int off, int len)从该输入流读取最多 len个字节的数据到字节数组,off限定了读取的起始地址

3.使用FileInputStream来读取txt文件

使用read() ,读取单个字节的数据,效率较低,且中文不可读取:

package re;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStream_01 {


    public static void main(String[] args)  {

        // 1.确定文件路径 注意 windows 的路径,需要使用双斜杠,因为java中的转义字符....
        String filePath = "D:\\a.txt";

        // 2.读取到的数据
        int readLine = 0;
        FileInputStream fis = null;

        // 使用try-catch来捕获异常
        try {

            fis = new FileInputStream(filePath);
            // 因为字节流不可能是一次性的将txt文件中的内容读取
            // 所以使用 while 循环来读取 ,
            // read方法如果读取到 末尾的话则会返回 -1
            while((readLine = fis.read())!=-1){
                System.out.print((char)readLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                // 关闭流,释放资源
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

使用多个字节读取 int read(byte[] b) 从该输入流读取最多 b.length个字节的数据到一个字节数组:

读取中文文本时,如果该中文文本有空格,中文字符还会乱码,因为中文空格和字符都是按照半个字节计算的。解决中文乱码的问题使用字符流即可

package re;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStream_02 {


    public static void main(String[] args) {

        // 1.文件路径
        String filePath = "D:\\b.txt";
        // 2.字节数组 定义一个字节长度为8的字节数组
        byte[] buf = new byte[8];
        // 读取长度
        int readLen = 0;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(filePath);
            // 如果读取正常,返回读取的字节数
            // 到达文件末尾,返回-1
            while ((readLen=fis.read(buf))!=-1){
                // 控制台打印显示
                System.out.print(new String(buf,0,readLen));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }  finally {
            // 关闭释放流
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

FileOutputStream的使用

在这里插入图片描述
FileOutputStream用于写入诸如图像数据的原始字节流。 对于写入字符流,应该使用FileWriter 。

1.构造器

构造器描述
FileOutputStream(File file)创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file, boolean append)创建文件输出流以写入由指定的 File对象表示的文件,其中append用来决定该输出流的写出模式,是从头开始覆盖(false)还是末尾追加写出的方式(true)
FileOutputStream(FileDescriptor fdObj)创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。
FileOutputStream(String name)创建文件输出流以指定的名称写入文件。
FileOutputStream(String name, boolean append)创建文件输出流以指定的名称写入文件,append为true表示末尾追加,append为false表示从头开始覆盖。

2.常用方法

方法名及返回值类型功能
void write(byte[] b)将 b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len)将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
void write(int b)将指定的字节写入此文件输出流。
void close()关闭此文件输出流并释放与此流相关联的任何系统资源。

3.使用FileOutputStream写入字符到txt文件

需要注意的是
1.使用fileOutputStream = new FileOutputStream(filePath);创建方式,写入文件是覆盖写的模式
2.使用 fileOutputStream = new FileOutputStream(filePath,true); 创建方式,则写入文件是末尾追加。—>查看相关的构造器即可


package re;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

// 字符输出流
public class FileOutputStream_01 {

    public static void main(String[] args) {
        // 1.写入文件路径
        String filePath = "D:\\c.txt";
        // 2.获取 fileOutputStream 对象
        FileOutputStream  fos = null;
        try {
            fos = new FileOutputStream(filePath);
            // 简单的写入一段英文字符串
            String str = "hello!txt";
            // 读取指定长度的字节  void write(byte[] b, int off, int len) 
            // 将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。
            fos.write(str.getBytes(),0,str.length());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 关闭流,释放资源
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}


图片文件拷贝

1.使用fileInputStream流读取文件
2.使用fileOutPutStream流输出文件
3.采用边读边写的方式

package com.gothic.outputStream_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {

    //文件拷贝
    public static void main(String[] args) {

        // 1.使用fileInputStream流读取文件
        // 2.使用fileOutPutStream流输出文件
        // 3.采用边读边写的方式

        //源文件目录
        String srcFilePath = "D:\\雷神.jpg";
        //目的文件目录
        String destFilePath = "D:\\LS.jpg";

        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;

        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath);
            // 每次读取1024个字节
            byte[] buf = new byte[1024];
            int readLen = 0;
            while ((readLen=fileInputStream.read(buf))!=-1){
                // 边读边写
                fileOutputStream.write(buf,0,readLen);
            }
            System.out.println("ok,拷贝成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 关闭流,释放资源
            try {
                if(fileInputStream!=null){
                    fileInputStream.close();
                }
                if(fileOutputStream!=null){
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }
}

用到的图片:
在这里插入图片描述

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

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

相关文章

(11)go-micro微服务雪花算法

文章目录一 雪花算法介绍二 雪花算法优缺点三 雪花算法实现四 最后一 雪花算法介绍 雪花算法是推特开源的分布式ID生成算法,用于在不同的机器上生成唯一的ID的算法。 该算法生成一个64bit的数字作为分布式ID,保证这个ID自增并且全局唯一。 1.第一位占用…

【嘉立创EDA】构建自己的元件库,绘制符号、封装的方法

器件问题 先选择需要的元器件,然后查看其数据手册,找到官方提供的元件封装进行绘制。 器件 选择一款卧贴式双排排针进行绘制。 器件模型 主要用到的就是 Recommended P.C.B Layout 前期资料准备完毕,下面开始绘制自己的元件库。 元件库制作…

微服务多模块feign更新数据问题

文章目录问题测试1.bill模块抛异常,data模块正常2.bill模块抛异常,data模块正常解决方案1.分布式事务2.复制data的dao mapper到bill中3.判断feign返回值,抛异常做回滚最近在做一个财务系统,用到了两个模块bill账单模块和data数据模…

C语言文件补充笔记1:EOF与feof

1 关于EOF 可以查看EOF的宏定义 函数fgetc如果读取失败就返回-1&#xff0c;对于文本文件而言&#xff0c;以为着读取结束&#xff0c;因此-1可以作为结束的标志。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {FILE* fp fopen("a.txt"…

IvyPdf 1.64.1 .NET library Crack

IvyPdf 帮助您快速轻松地从非结构化 PDF 文档中提取有价值的信息。它可以提取无限的单个值和表格&#xff0c;并提供强大的后处理机制来进一步清理和格式化数据。 虽然 PDF 是图书馆的主要目标&#xff0c;但它们也可用于解析 Excel、文本、HTML 和其他文件格式&#xff0c;从…

基于python机器学习深度学习实现股市评论情感分析 (完整代码+数据集可直接运行)

结果展示: 情绪与股市 情绪与股市关系的研究由来已久,情绪是市场的一个重要影响因素已成为共识。 15年股灾时,亲历了一次交易灾难,眼见朋友的数千万在一周不到的时间内灰飞烟灭。那段时间市场的疯狂,让人深刻地明白:某些时候,股票市场这个抽象、复杂的系统,反映的不再是…

Vue 基础之过滤器

Vue 基础之过滤器描述过滤器capitalize 过滤器过滤器函数的参数私有过滤器与全局过滤器私有过滤器全局过滤器Vue.filter()capitalize 全局过滤器全局过滤器 VS 私有过滤器描述 项目描述IDEVScode操作系统Windows 10 专业版Vue.js2.6.12 过滤器 Vue.js 允许你自定义过滤器&…

程序员面试,能不能不考“八股文”?

学过初中历史的小伙伴们都知道&#xff0c;明清的科举考试形式&#xff0c;是一种名为“八股文”的文体形式。这种考试形式给考生们带来了极大的限制&#xff0c;考生只能在严格的规则内进行发挥。在新的时代&#xff0c;真正的八股文已经成为了历史&#xff0c;然而在程序员行…

【GPU】Nvidia CUDA 编程高级教程——NVSHMEM 内存模型

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【Python学习】字典和集合

前言 往期文章 【Python学习】列表和元组 字典和集合 字典是一系列无序元素的组合&#xff0c;其长度大小可变&#xff0c;元素可以任意地删减和改变。不过要注意&#xff0c;这里的元素&#xff0c;是一对键&#xff08;key&#xff09;和值&#xff08;value&#xff09;…

【nvidia CUDA 高级编程】NVSHMEM 直方图——分布式方法

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Redis基础命令操作五之集合类型ZSET

ZSET 命令举例说明ZADD ZADD [KEY][序号1][序号1的值]集合中添加元素ZREMZREM [KEY][序号的值]移除集合中元素ZRANGEZRANGE [KEY][下标1][下标2]获取指定区间集合元素ZRAGNEBYSCOREZRANGEBYSOCRE [KEY] -INF INF集合中按照序号从小到大排列ZREVRANGEZREVRANGE [key][序…

四,Spring注解开发

Spring day04 1 Spring基于注解的开发 XML方式配置bean存在的问题&#xff1a;开发效率低下。Spring2.x提供了开发效率更高的注解式配置。注解开发替换XML配置的好处&#xff1a;简化编程&#xff0c;提高开发效率。 XML方式&#xff1a;配置繁琐&#xff0c;但功能强大&…

测试开发的一次实践总结

这些年&#xff0c;测开越来越火&#xff0c;火的原因之一就是因为大部分公司都有设测开岗位并有招聘需求。那测试开发到底是做什么&#xff0c;和测试又有什么区别呢&#xff1f;接下来&#xff0c;说说我对测开的理解与实际工作的总结。 01—测试开发的理解 测试分类 从市场…

测试碎碎念(基础篇_1)

一、软件测试1.1 什么是测试测试行为 在生活中是十分常见的~在生活中&#xff0c;我们有许多 "测试" 的行为&#xff0c;比如说&#xff0c;在坐地铁之前&#xff0c;需要用金属探测仪在身上刷一下&#xff0c;需要把身上的背包等物品放在闸机上过一下~比如说&#x…

Rockchip开发系列 - 8. IO电源域配置

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 RK3566 RK3568 IO 电源域配置指南概述第一步:获取硬件原理图并确认硬件电源的设计方案第二步:查找对应的内核dts配置文件第三步:修…

Open3D 网格滤波(Python版本)

文章目录 一、简介二、滤波2.1 均值滤波2.2 Laplacian滤波2.3 Taubin滤波三、实现效果参考资料一、简介 网格数据的滤波其本质上仍是针对点的滤波过程,具体的过程如下所示。 二、滤波 2.1 均值滤波 如下公式所示,均值滤波其实就是该点与其邻近点之间的平均值: Open3D中的相…

在Ubuntu上安装OpenShift并使用

服务器信息 在阿里云买了个抢占式的服务器&#xff0c;地区为华南广州&#xff0c;系统为Ubuntu 20.04&#xff0c;8核16GB。 安装Docker 命令如下&#xff1a; $ apt-get update -y $ apt-get upgrade -y $ apt-get install -y docker.io 安装成功后&#xff0c;检查一下版…

2023 年你应该知道的所有机器学习算法

在过去的几年里&#xff0c;根据自己的工作经验&#xff0c;整理了我认为最重要的机器学习算法。 通过这个&#xff0c;我希望提供一个工具和技术的存储库&#xff0c;以便您可以解决各种数据科学问题&#xff01; 让我们深入研究六种最重要的机器学习算法&#xff1a; 解释…

状态机原理

前言状态机在实际工作开发中应用非常广泛&#xff0c;在刚进入公司的时候&#xff0c;根据公司产品做流程图的时候&#xff0c;发现自己经常会漏了这样或那样的状态&#xff0c;导致整体流程会有问题&#xff0c;后来知道了状态机这样的东西&#xff0c;发现用这幅图就可以很清…