首页 > 其他分享 >IO文件流

IO文件流

时间:2024-07-20 10:30:03浏览次数:13  
标签:文件 java 字节 io int IO byte 读取

IO

IO的基本概念:
什么是输入?输入是一个从外界进入程序的方向,通常当我们需要使用读取“外界”的数据时候,使用输入。所以输入是用来读取数据。
什么是输出?输出是一个从程序发送到外界的方向,通常当我们需要输出到外界时候,使用输出,所以输出是用来写出数据的。
java将IO比作流,就像水流一样。但是流动的是二进制数据,所以在IO中有输入和输出之分。

InputStream和OutStream

java.io.InputStream:所有字节输入流的超类,其中定义了数据读取的方法,因此不管是什么设备我们都可以调用相同的方法来读取不同的设备。

int read()
读取一个字节,以int形式返回,该int值的低八位有效,若返回值为-1则表示EOF(读取完毕)。
int read(byte[] d)
尝试最多读取byte数组长度的字节数存入该数组,返回值为实际读取到的字节量。

java.io.OutStream:所有字节输出流的超类,其中定义了写出数据的方法。

void write(int d)
写出一个字节,写出的是int值得低8位
void write(byte[])
写出数组中的所有字节

文件流

文件流的作用

  • 文件流实际是链接程序与硬盘中文件的"管道",用于读写文件的流
  • 文件流以字节为单位读写数据
  • 文件输出流:可将数据从内存写入到硬盘之中。以实现永久存储。
  • 文件输入流:可以将硬盘中内容读到内存中使程序恢复到原有状态

常用构造器

构造器

  • FileOutputStream(String FileName) 创建一个指向文件名称的文件中写出数据的文件输出流
  • FileOutputStream(File file) 创建一个指向文件对象的文件输出流
  • 如果创建时候文件不存在会自动创建文件
  • 如果文件所在的目录不存在就会抛出异常FileNotFoundException
  • 如果指定的文件已经存在且包含内容时候,创建流时候会将原有数据全部清除

写出字节数据

写出字节数据使用FileOutputStream,该类继承了java.io.OutputStream,该类提供了超类中要求写出的字节相关方法。

void write(int d)//只能写出低八位,如果超过八位也只写低八位
void write(byte[] data)//块写操作,一次性将byte数组内的所有内容写出
void write(byte[] data,int offset,int len)//块写操作,一次性将byte数组内从下标offset处开始连续n个字节写出。

关闭流 colse()

读取字节数据

读取字节数据使用FileInputStream,继承至java.io.InputStream,文件输入流提供了超类中要求的读取字节的相关方法。

int read()
读取一个字节,其返回值为读取的一个字节内容,其二进制的低八位有效,如果返回值为整数-1,则说明文件已经读到了末尾。
int read(byte[])
块读写操作,一次性读取byte[]长度的字节并存入到数组中,返回值为实际读取到的字节量。

复制文件

单字节复制

通过文件字节输入流和字节输出流实现单字节复制。


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

public class CopyDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("jsd/jsd2406/翡翠.webp");
        FileOutputStream fos=new FileOutputStream("jsd/jsd2406/翡翠3.webp");
        int n = 0;
        while((n = fis.read()) != -1){
            fos.write(n);
        }
        fis.close();
        fos.close();
    }



}

单字节复制的读写效率很差,原因是硬盘的机械特性决定着单字节的读写性能是极其低效的,这里涉及到磁盘很多机械特性,马达带动,电与磁的转换等等。越频繁的磁盘交互效率越低。

块读写

public int read(byte[] b)

从流中最多读取b.lengrh个字节并存入到数组b中,返回值为实际读取的字节数,若返回值为-1则读到了末尾。
块读写复制实例:


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

public class CopyDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("jsd/jsd2406/翡翠.webp");
        FileOutputStream fos=new FileOutputStream("jsd/jsd2406/翡翠3.webp");
        int n = 0;
        byte[] data=new byte[1024];
        while((n = fis.read(data)) != -1){
            fos.write(data);
        }
        fis.close();
        fos.close();
    }



}

但是运行之后发现一个问题,块读写复制之后的文件要比原来的文件大一点,原因是传入的byte[]数组长度较大,将多余内容也写入进去,因此我们应该使用write的重载方法,加入参数offset和len,这样当我们在读取最后的内容时候我们可以只写入读取的内容。

写入文本数据

使用字符串的getBytes()将字符串转换为一组字节
使用文件输出流的块写方法write(byte[] data)

追加模式

当我们在构造方法时候加入一个boolean的值true,那么写入的数据将会在原文件末尾添加。

标签:文件,java,字节,io,int,IO,byte,读取
From: https://blog.csdn.net/qq2259583140/article/details/140473842

相关文章

  • Windows平台生成dump文件
    目录一.前言二.什么是dump文件三.为什么要生成dump四.修改注册表生成dump五.其他一.前言1.windows下的dump文件包括内核模式dump和用户模式dump两种,本文讨论用户模式dump。2.windows平台下生成用户模式dump有三种方式:用任务管理器手动生成/修改注册表/通过代码注册......
  • Java NIO 快速入门:Java 非阻塞 IO 编程详解
    一、NIO简介1.概述介绍:JavaNIO(NewInput/Output)是从Java1.4开始引入的一组新的IO库,旨在替代传统的阻塞式IO。NIO提供了更高效的IO操作,支持非阻塞模式和多路复用,适用于高并发场景。概述:NIO中通过Buffer作为缓存区,Channel作为数据通道来传输数据进行数据通讯,通过S......
  • Win11系统提示找不到LocationWinPalMisc.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LocationWinPalMisc.dll文件(挑选合适的版本......
  • Win11系统提示找不到LogCollector.Resources.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LogCollector.Resources.dll文件(挑选合适的......
  • 预处理知识库文件
    在载入知识库文件的时候,直接上传文档虽然能实现基础的问答,但是,其效果并不能发挥到最佳水平。因此,我们建议开发者对知识库文件做出以下的预处理。以下方式的预处理如果执行了,有概率提升模型的召回率。1.使用TXT/Markdown 等格式化文件,并按照要点排版例如,以下段落应该被处......
  • Self Attention
    先前的一些文章简单介绍了一些点云检测和分割的文献资料,可以看出近些年越来越多的方法结合了Transformer,因此有必要说明一下Transformer的结构,在介绍之前需要了解一些知识点:比如SelfAttention、LayerNormalization等等,这一篇先简单了解下SelfAttention,后续再介绍其他相关内容。......
  • Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4
    报错信息:Error:Assertionfailed(nimages>0)incv::calibrateCameraRO,fileD:\opencv4\opencv\opencv-4.1.0\modules\calib3d\src\calibration.cpp,line3691  原因:①图片路径问题,没有指向包含棋盘格的图片②图片中不包含棋盘格或者图片模糊等问题,导致查找棋盘......
  • 将Json格式的文件转为Excel格式文件的python代码
    importpandasaspdimportosfromopenpyxlimportWorkbook'''pandas是Python中用于数据分析的一个非常强大的库,它提供了快速、灵活和表达式丰富的数据结构,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。pandas非常适合于处理表格数据,如CSV文件、SQL查询结......
  • 理解IO多路复用
    I/O多路复用是什么?I/O多路复用是用户程序通过复用一个线程来服务多个I/O事件的机制,我们也可以将他说成是一个线程服务多个文件描述符fd,而I/O多路复用是在操作系统层面实现提供的,举个例子:Linux平台下常见的I/O多路复用有:select、poll、epoll刚刚提到文件描述符fd,......
  • Jmeter实现本地文件的读写操作-将响应结果写入到本地Excel中
    一、环境准备1、引入操作EXcel文件的包2、安装JMeter:确保已安装JMeter。Java环境:确保系统中已安装JDK,并配置了JAVA_HOME环境变量。二、脚本准备1.配置JMeter测试计划创建线程组添加线程组:右键点击“测试计划(TestPlan)”,选择“添加(Add)”->“线程(Threads(Use......