Java字节流基础详解(InputStream/OutputStream)

news2024/11/23 8:37:09

文章目录

  • 概念
  • InputStream字节输入流
    • FileInputStream文件字节输入流
  • FileOutputStream字节输出流
    • 相关的方法(write)和构造器
    • 构造器注意事项
  • 文件拷贝

概念

在Java中,字节流一般适用于处理字节数据(诸如图片、视频),InputStream/OutPutStream为字节流基类(超类或父类),字节流的类通常以stream结尾。它们的子类都是字节流,主要用在按字节来处理二进制数据。字节流是最基本的,采用ASCII编码

如果对输入流和输出流有疑问,可查看此博客或自行百度!
Java IO流(基础详解,快速上手!)

如有疑问,欢迎评论区留言私信。


InputStream字节输入流

InputStream是抽象类,无法实例化,需要实现子类。

是所有类字节输入流的超类(父类)

InputStream常用的子类

  1. FileInputStream:文件字节输入流
  2. BufferedInputStream:缓冲字节输入流
  3. ObjectInputStream:对象字节输入流

在这里插入图片描述

注意:其中BufferedInputStream的直接父类是FilterInputStream

FileInputStream文件字节输入流

FileInputStream 是 Java 语言中抽象类 InputStream 用来具体实现类的创建对象。

FileInputStream 流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等。

构造器和方法
在这里插入图片描述
基本常用方法

  • 读取文件(文本)中的数据 read(按字节读取)
    如果返回-1,表示读取结束
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.IOException;

@Test
public void readFile02() throws FileNotFoundException {
    String filePath = "E:\\hello.txt";
    int readData = 0;
    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream(filePath);
        //如果返回-1,表示读取完毕
        while ((readData = fileInputStream.read()) != -1) {
            System.out.print((char) readData + " ");
        }
    } catch (IOException e) {
        e.getMessage();//输出异常信息
    } finally {//表示finally表示try执行完毕之后,必须执行的,catch是用来捕获异常的
        try {
            fileInputStream.close();//关闭流,释放连接
        } catch (IOException e) {
            e.getMessage();
        }
    }
}
  • read(按字节数组读取)
    如果读取正常返回,返回实际读取的字节数(返回的最大字节数为字符数据容量);如果返回-1,表示读取完毕

    这里使用了String的构造器用于将buf转换为字符串
    在这里插入图片描述

import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.IOException

@Test
public void readFile02() throws FileNotFoundException {
    String filePath = "E:\\hello.txt";
    //字节数据
    byte[] buf = new byte[8];//一次读取八个
    int readLen = 0;
    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream(filePath);
        //如果返回-1,表示读取完毕
        while ((readLen = fileInputStream.read(buf)) != -1) {
            System.out.print(new String(buf, 0, readLen));
        }
    } catch (IOException e) {
        e.getMessage();//输出异常信息
    } finally {//表示finally表示try执行完毕之后,必须执行的,catch是用来捕获异常的
        try {
            fileInputStream.close();//关闭流,释放连接
        } catch (IOException e) {
            e.getMessage();
        }
    }
}

读取E盘下的hello.txt文本,此时文本的内容为:h e l l o , w o r l d (这是我文件的内容,可自定义)
如果文件中有汉字可能会造成乱码(字节大小不匹配,可以使用字符流)
读取之后返回的内容是ASCII码值!

注意:操作完之后,需要关闭这个流,否则造成资源浪费,引用close方法即可


FileOutputStream字节输出流

FileOutputStream流是指文件字节输出流,专用于输出原始字节流如图像数据等,其继承OutputStream类,拥有输出流的基本特性

  • OutputStream 抽象类,所有输出字节字节流的父类
  • FileOutputStream 向文件输出数据的输出字节流。
    在这里插入图片描述

使用FileOutputStream步骤:

  1. 找到目标文件
  2. 建立数据的输出通道

相关的方法(write)和构造器

FileOutputStream提供了4个常用构造方法,用于实例化FileOutputStream对象(不同场景使用不同的构造方法)
在这里插入图片描述

  • new FileOutputStream 的时候,如果目标文件不存在,那么会先创建目标文件,然后再写入。(如果目标文件所在的文件夹不存在,则抛出异常)
  • new FileOutputStream(file) 如果目标文件已经存在,那么会先清空 目标文件的数据,然后再写入新的数据
  • 写入数据的时候如果需要以追加的形式写入,那么需要使用new FileOutputStream(file,true) 这个构造函数

操作演示

在这里插入图片描述
根据不同的场景选择方法!

  • 将指定的字节写入该文件输出流中:
  • public void write(int b) throws IOException
import org.junit.jupiter.api.Test;
import java.io.FileOutputStream;
import java.io.IOException;

@Test
public void writeFile() {
    String filePath = "E:\\hello.txt";
    FileOutputStream fileOutput = null;
    try {
        fileOutput = new FileOutputStream(filePath);
        //写入一个字节
        fileOutput.write('a');//char和int可以互用
    } catch (IOException e) {
        e.getMessage();
    } finally {//执行完try,无异常时执行finally,有异常,先执行catch,在执行finally
        try {
            fileOutput.close();
        } catch (IOException e) {
            e.getMessage();//输出异常
        }
    }
}

此时E盘下的hello.txt文件中的内容为a

  • 将多个字节写入到此文件输出流(字节数组)
    这里使用了String中的 getByres 方法(可以将字符串转换为一个字节byte数组)
  • public void write(byte[] b) throws IOException
@Test
public void writeFile() {
    String filePath = "E:\\hello.txt";
    FileOutputStream fileOutput = null;
    try {
        fileOutput = new FileOutputStream(filePath);
        //写入多个字节
        String str = "hello,world";
        fileOutput.write(str.getBytes());
    } catch (IOException e) {
        e.getMessage();
    } finally {//执行完try,无异常时执行finally,有异常,先执行catch,在执行finally
        try {
            fileOutput.close();
        } catch (IOException e) {
            e.getMessage();//输出异常
        }
    }
}

此时E盘下的hello.txt文件中的内容为:hello,world

  • 该方法将len个字节的数据,并从数组b的off位置开始写入到输出流
  • public void write(byte[] b, int off, int len) throws IOException
@Test
public void writeFile() {
    String filePath = "E:\\hello.txt";
    FileOutputStream fileOutput = null;
    try {
        fileOutput = new FileOutputStream(filePath);
        //写入多个字节
        String str = "hello,world";
        fileOutput.write(str.getBytes(), 2, str.length()-5);
    } catch (IOException e) {
        e.getMessage();
    } finally {//执行完try,无异常时执行finally,有异常,先执行catch,在执行finally
        try {
            fileOutput.close();
        } catch (IOException e) {
            e.getMessage();//输出异常
        }
    }
}

此时E盘下的hello.txt的内容为 llo,wo

构造器注意事项

  1. 如果使用的是这种的创建方式,当写入内容时,会覆盖原来的内容
public FileOutputStream(File file)

创建一个文件输出流写入指定的 File对象表示的文件。一个新的 FileDescriptor对象来表示这个文件连接

  • 参数:file -要打开以进行写入的文件
  • 异常
    • FileNotFoundException -如果文件存在,但是是一个目录而不是常规文件,不存在但不能被创造,也不能打开任何其他原因
    • SecurityException -如果存在一个安全管理及其 checkWrite方法拒绝写访问文件
  1. 不覆盖原来的内容,在结尾后面追加
public FileOutputStream(File file,boolean append)

创建一个文件输出流写入指定的 File对象表示的文件。如果第二 true,然后字节将被写入到文件的末尾而不是开头。一个新的 FileDescriptor对象来表示这个文件连接。

  • 参数
    • file:要打开以进行写入的文件
    • append -如果 true,然后字节将被写入到文件的末尾而不是开头
  • 异常
    • FileNotFoundException -如果文件存在,但是是一个目录而不是常规文件,不存在但不能被创造,也不能打开任何其他原因
    • SecurityException -如果存在一个安全管理及其 checkWrite方法拒绝写访问文件。

文件拷贝

D盘下的test.txt文件拷贝到E盘目录下

在这里插入图片描述

  • 创建文件的输入流,将文件读入到Java的程序(内存)
  • 创建文件的输出流,将读入到的文件数据写入到指定的文件

在完成程序时,应该是读取部分数据,就写入到程序(防止文件过大),所以使用循环操作

以下代码为基础知识(有其他方案),也可以拷贝视频、图片等

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

public class FileCopy {
    public static void main(String[] args) {
        String srcFilePath = "D:\\test.txt";//要拷贝的文件路径
        String destFilePath = "E:\\test.txt";//拷贝到的路径,文件名可以自定义
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath);
            //定义一个字节数组提高效率
            byte[] bytes = new byte[1024];
            int readLen = 0;//一次读取多少个
            while ((readLen = fileInputStream.read(bytes)) == -1) {
                //写入文件,边读边写
                fileOutputStream.write(bytes,0,readLen);
            }
            System.out.println("拷贝成功");
        } catch (IOException e) {
            e.getMessage();//输出异常
        } finally {
            try {//关闭输入流和输出流,释放资源
                if (fileInputStream!=null){
                    fileInputStream.close();
                }
                if (fileOutputStream!=null){
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.getMessage();//输出异常
            }
        }
    }
}

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

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

相关文章

Netty入门笔记(一)BIO、NIO、AIO

一.Netty简介 Netty是由JBOSS提供的一个java开源框架Netty是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序Netty主要针对在TCP协议下,面向Client端的高并发应用,或者peer-to-peer场…

裁剪图片原理

FileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 创建实例 const reader new FileReader(); 方法 事件 Blod Blob是用来支持文件操作的。简单的…

牛客每日一题(1/12)

233的字符串题目描述 读入一个正整数n,代表将字符串"abc"重复n次,形成一个长度为3n的字符串。例如n3时,形成的字符串为"abcabcabc"。请你计算该字符串中有多少个"acb"子序列。答案对10^97取模。输入描述:一个正…

【计算机网络-数据链路层】局域网(LAN)

文章目录1 局域网的概念1.1 局域网的拓扑结构1.2 局域网的传输介质1.3 局域网的介质访问控制方式(MAC)1.4 局域网的分类2 以太网(Ethernet,IEEE 802.3 标准)2.1 以太网的传输介质2.2 以太网的网卡2.3 以太网的 MAC 地址…

flutter apk 加固引发的问题

背景:Apk 加固,防止动态调试啥的,用的是 腾讯家的加固方案:应用加固,这个加固完之后 因为破壳了,所以需要重写签名;今天发现一个这样的问题:最早加固完毕安装不了提示:Failure IINST…

C语言从入门到放弃——静态通讯录实现

目录 一.功能实现 1.打印开始菜单 2.实现选择 3.初始化通讯录 4.添加、删除等功能实现 (1)添加联系人 (2)删除联系人 (3)查找联系人 (4)修改联系人 (5&#xff…

【C++】基于EasyX库的2048小游戏

文章目录0 前言1 先看一下最终的效果图2 2048核心2 EasyX库2.1 配色2.2 文字2.3 填充3 总结0 前言 最近比较迷2048小游戏,于是想自己写代码实现出来,恰好也在网上找到一个现成的2048的VS工程,但是界面做得很难看,且运行逻辑存在一…

研究发现,大多数长期 COVID 影响在感染后一年内消退

英国医学杂志今天发表的一项来自以色列的大型研究发现,轻度 COVID-19 感染后出现的大多数症状或病症会持续数月,但在一年内恢复正常。 特别是接种过疫苗的人,呼吸困难的风险较低。这通常也是轻度感染后最常见的影响。相比之下,比未…

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ977有序数组的平方暴力排序双指针法209长度最小的子数组暴力解法滑动窗口法59螺旋矩阵Ⅱ977有序数组的平方 题目链接:977 题目:给你一个按 非递减顺序 排序的整数数组 nums,返…

Linux常用命令——xargs命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xargs 给其他命令传递参数的一个过滤器 补充说明 xargs 命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道…

python--城堡保卫战

实现功能: 1:敌人的绵绵不断的前进,拿着各种各样的武器(叉子,斧头,宝剑),挥动武器攻击我方城堡,对我方城堡造成伤害! 2:我方城堡发现敌人可手动…

Linux-文件系统

Windows文件系统 在Windows下,打开“计算机”,我们看到的是一个个驱动盘符。 注意:盘符与硬件不是对应的,比如说电脑有有一块硬盘,到Windows下可以将其切成C、D、E盘,也就是一个硬盘可以放多个盘符。 Lin…

maple-example简单操作示例

好久都没写博客了,今天学习到一点新知识,在这里小编和大家分享,欢迎大家指点,这篇文章是关于 maple-example的简单操作示例,具体软件下载不做讲解,谢谢!

浅谈分辨率带宽RBW

频谱仪是射频工程师最常用的设备之一,信号的频率、功率、谐波、相位噪声等诸多射频参数都需要使用频谱仪测试。使用频谱仪时,有一个参数需要经常设置,就是分辨率带宽(Resolution BW,简称RBW)。RBW是指中频链路上最小的中频滤波器带…

Enhance the Visual Representation via Discrete Adversarial Training

在自然语言处理NLP中,AT可以从泛化中受益,我们注意到AT在NLP任务中的有优点可能来自于离散和符号输入空间。为了借鉴NLP风格AT的优势,我们提出了离散对抗训练(DAT)。DAT利用VQGAN将图像数据改为离散的类似文本的输入&a…

Vuex的学习内容

本教程使用的是vue3 1.核心概念 官网地址:https://vuex.vuejs.org/安装(固定)配置项(固定) 2. 图示关系 单一定义store对象,里面5个配置项,在任意组件可以使用. 3.案例准备 准备两个组件AddItem.vue、SubItem.vue、Main.vue 展示效果如下: AddItem代码 <template&…

STL - String容器

1. string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char *的区别&#xff1a; char *是一个指针 string是一个类&#xff0c;类内部封装了char *,管理这个字符串&#xff0c;是一个char *型的容…

本地小说阅读网站打造

目录 一、本地小说网站总体组织框架 1、所需的VUE库和elementLib以及JQ库 2、本地目录设计 3、整体代码样式 二、正文核心代码 1、引入element 样式&#xff0c;和自定义的样式 2、引入JS 3、自定义Header组件 1&#xff09;vue 定义MyHeader组件 2&#xff09;MyHead…

Mapstruct的具体介绍与使用

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。 如果小伙伴们觉得我的文章不错&#xff0c;记得一键三连哦 文章目录一、mapstruct简介二、mapstruct与其他映射对比三、mapstruct底层原理解析1、Java动态编译四、具体使用1、依赖导入2、…

Linux开发工具的使用(三)

文章目录Linux开发工具的使用&#xff08;三&#xff09;1. 缓冲区1.1 理解\r和\n1.2 缓冲区的初步理解1.3 倒计时小程序实现1.4 进度条小程序实现2. 分布式版本控制系统-git使用2.1 git历史2.2 git版本控制理解2.3 git使用2.3.1 gitee搭建远程仓库2.3.2 开始配置3. Linux调试器…