java IO流(1)

一. 文件类

java中提供了一个File类来表示一个文件或目录(文件夹),并提供了一些方法可以操作该文件

1. 文件类的常用方法 

File(String pathname)构造方法,里面传一个路径名,用来表示一个文件
boolean canRead()判断文件是否是可读文件
boolean canWrite()判断文件是否是可写文件
boolean exists()判断文件或目录是否存在
String getAbsolutePath()获取文件的绝对路径
String getName()获取文件名
String getParent()获取文件的上级目录
boolean isDirectory()判断是不是文件夹
boolean isFile()判断是不是文件
Long lastModified()返回文件最后一次的修改时间,由于返回值是Long类型,配合Date的构造方法,可观察时间
Long length()返回文件有多少个字节
boolean isHidden()判断文件是不是隐藏文件
boolean delete()删除文件或文件夹,注意删除文件夹时必须保证文件夹是空的,否则删除失败
boolean mkdir()创建单级文件夹
boolean mkdirs()创建多级文件夹

2. 删除整个文件夹

public class FileDemo2 {
    public static void main(String[] args) throws IOException {

        //递归删除文件夹中的文件和文件夹
        File f = new File("E:/download");
     
        DeleteFile(f);
    }


public static void DeleteFile(File files) {

        File[] file = files.listFiles();

        for (File f : file) {
            if (f.isDirectory()) {
                DeleteFile(f);
            } else {
                f.delete();//删除文件
            }
        }

        files.delete();
}

当文件夹不为空时调用delete方法删除是不成功的,要想删除文件夹,必须保证文件夹为空,即要先删除我文件夹中的文件和文件夹,这就要使用递归来删除 

二. 输入输出概念

输入输出是一个相对概念,要有一定的参照物才能说清楚到底是输入还是输出,比如:我们将文件中的内容读到java程序中,对于java程序来讲是输入,但对于硬盘上的文件来讲则是输出,所以我们一般规定,把硬盘上的文件读到java程序中是输入,从java程序中写回硬盘上是输出

三. 流的分类

1.输入流和输出流

按照数据传输的方向,流可以分为输入流输出流

输入流:往程序中读叫输入流

输出流:从程序中往外写叫输出流

2. 字节流和字符流

从读取文件的单位不同分为字节流字符流

字节流:是以一个个字节为单位读取文件,可以读取任意的文件,这是因为,在计算机中任何类型的数据都是以字节存储的

字符流:是以一个个字符为单位读取文件,只能读文本文件

注意:在java中有InputStream和OutputStream,Reader和Writer四个抽象类,只要是以InputStream和OutPutStream结尾的都是字节流,以Reader和Writer结尾的都是字符流

3. 节点流和处理流

根据封装类型不同流分为节点流处理流

节点流:就是直接对数据进行读写操作的流,FileInputStream,FileOutputStream,FileReader等

处理流(包装流):对节点流进行封装,可以提高节点流对数据操作的效率,BufferReader等带Buffer的流

四. 读写文件

1. 用文件输入字节流和文件输出字节流读写文件

1.1 一个一个字节读文件

public class StreamDemo1 {
    public static void main(String[] args) throws IOException {
        //输入,从硬盘上把文件读入到程序
        /*File file = new File("D:/demo.txt");
        FileInputStream inputStream1 = new FileInputStream(file);*/


        //文件输入字节流
        FileInputStream inputStream = new FileInputStream("E:/demo.txt");//输入管道
        //文件输出字节流
        FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");//输出管道
        int b = 0;
        while((b = inputStream.read())!=-1)
        {
            outputStream.write(b);
        }
        inputStream.close();//关闭通道
        outputStream.close();
    }
}

由于上述方法每次是一个一个字节去读文件,效率非常低,所以java还提供每次读一个byte数组个字节大小,数组的长度可以自己定,但不建议太大内存装不下,也不建议太小效率低

2.1 一次读一个byte数组(高效文件读写)

public class StrteamDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream = new FileInputStream("E:/demo.txt");
        FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");
        byte[] bytes = new byte[10];
        int size = 0;
        while((size = inputStream.read(bytes))!=-1)
        {
            outputStream.write(bytes,0,size);
        }
        inputStream.close();
        outputStream.close();
    }
}

注意:当写文件时调用的是write(byte b[], int off, int len),而不是write(byte b[]),调用第二个有可能会导致最后一次数组中还留有上次的元素,导致读完后的文件和原文件不同

2. 用包装流封装节点流读取文件

public class StreamDemo3 {
    public static void main(String[] args) throws IOException {
        //FileInputStream 直接封装数据,称为节点流(最基础去读数据的流)
        FileInputStream inputStream = new FileInputStream("E:/demo.txt");

        //BufferedInputSteam封装的是一个节点流对象,可以提供缓冲功能,称为处理流/包装流
        //缓冲字节输入流 默认缓冲区大小是8192个字节,可以自定义缓冲区大小
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

        FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

        byte[] bytes = new byte[10];
        int size = 0;
        while((size = bufferedInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,size);
        }

        //包装流一定要关闭,否则有可能导致数据停留在底层缓冲区
        //没有真正刷新缓冲区写入到文件中
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }
}

2.1 BufferedInputStream和BufferedOutputStream读写文件底层

在包装流的底层也提供了一个缓冲数组默认长度是8192个字节,当我们去读文件时,如果一次读的字节个数比底层的缓冲数组少,那么他不会直接将读到的内容写入到文件中,而是先放到缓冲数组中,等到底层缓冲数组满时,才会写入到文件中,这样可以大大提高效率,这也是包装流的作用,但如果我们自己定义的byte数组比底层缓冲数组大,那么不会用到底层的缓冲数组,而是直接将读到的内容写入到文件中,下面是源码

注意:

1. 包装流使用完毕后一定要关闭,否则有可能导致数据停留在底层缓冲区,没有真正刷新缓冲区写入到文件中,因为真正写入文件中是flushBuffer()方法中的write,而close()方法中调用了这个方法,如果仅仅只是上述源码,当我们最后一次读取数据时,如果缓冲数组没装满是不会调用flushBuffer(0方法,所以为了确保一定调用了flushBuffer(0方法,使用完必须调用close()方法来关闭包装流

2.底层缓冲数组可以自定义大小,在构造方法的第二个参数中

五. 对文件进行分割与合并

/*

  写一个方法,将feige.exe文件分割为每份1MB大小的若干份(最后一份可以不满1MB),
  存储在一个temp的文件夹中(每份文件名自己定义,例如1.temp 2.temp), 
  
  然后再写一个方法,将temp文件夹中的若干份合并为一个文件fg.exe
*/
public class HomeWork4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("E:/feige.exe");
        File file2 = new File("E:/temp");
        SplitFile(file1);
        MergeFile(file2);
    }

    public static void SplitFile(File file) throws IOException {
        File file1 = new File("E:/temp");
        if(!file1.exists())
        {
            file1.mkdir();
        }
        FileInputStream inputStream = new FileInputStream(file);
        int length = (int)Math.ceil(file.length()/(1024*1024*1.0));
        int size = 0;
        byte[] bytes = new byte[1024];
        for (int i = 0; i < length; i++) {
            FileOutputStream outputStream = new FileOutputStream("E:/temp/"+(i+1)+".temp");
            for (int j = 0; j <1024; j++) {
                if((size = inputStream.read(bytes))!=-1)
                {
                    outputStream.write(bytes,0,size);
                }
            }
            outputStream.close();
        }
        inputStream.close();
    }

    public static void MergeFile(File file) throws IOException {
        File file1 = new File("E:/Merge");
        if(!file1.exists()){
            file1.mkdir();
        }
        File[] files = file.listFiles();
        int size = 0;
        byte[] bytes = new byte[1024];
        FileOutputStream outputStream = new FileOutputStream("E:/Merge/fg.exe");
        for(File file2 : files){
            FileInputStream inputStream = new FileInputStream(file2);
            while((size = inputStream.read(bytes))!=-1)
            {
                outputStream.write(bytes,0,size);
            }
            inputStream.close();
        }
        outputStream.close();
    }
}

六. 数据输入输出字节流

数据输入输出字节流即:DataInputStream和DataOutputStream,他们除了是字节流,同时也是包装流(处理流),用于对节点流进行便捷处理的流

DataInputStreamreadUTF()直接将读到的数据转为字符串形式,不用自己将字节数组转换成字符串
DataOutputStreamwriteUFT(String s)直接将数据以字符串形式写出,不用自己将字节数组转换成字符串

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot读取yml配置注意点记录

问题1&#xff1a;yml中配置的值加载到代码后值变了。 现场yml配置如下&#xff1a; type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…

【论文通读】RuleR: Improving LLM Controllability by Rule-based Data Recycling

RuleR: Improving LLM Controllability by Rule-based Data Recycling 前言AbstractMotivationSolutionMethodExperimentsConclusion 前言 一篇关于提升LLMs输出可控性的短文&#xff0c;对SFT数据以规则的方式进行增强&#xff0c;从而提升SFT数据的质量&#xff0c;进而间接帮…

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

数学系C++ 排序算法简述(八)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

一.2.(4)放大电路静态工作点的稳定;(未完待续)

1.Rb对Q点及Au的影响 输入特性曲线&#xff1a;Rb减少&#xff0c;IBQ&#xff0c;UBEQ增大 输出特性曲线&#xff1a;ICQ增大&#xff0c;UCEQ减少 AUUO/Ui分子减少&#xff0c;分母增大&#xff0c;但由于分子带负号&#xff0c;所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

【密码学】什么是密码?什么是密码学?

一、密码的定义 根据《中华人民共和国密码法》对密码的定义如下&#xff1a; 密码是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。 二、密码学的定义 密码学是研究编制密码和破译密码的技术科学。由定义可以知道密码学分为两个主要分支&#x…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3],…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

嵌入式开发SPI基本介绍与应用

目录 #SPI通信协议 #SPI基础概念 #SPI通信模式 #SPI通信时序类型 前言&#xff1a;本篇笔记参考嘉立创的开发文档&#xff0c;连接放在最后。 #SPI通信协议 #SPI基础概念 Serial Peripheral Interface 缩写SPI 翻译&#xff1a;串行外设接口 同步串行通信协议&…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

【笔记】记一次redis将从节点变成主节点 主节点变成从节点

1.连上虚拟机centos7 2.打开finalshell连接虚拟机 将从节点变为主节点 输出redis-cli -p 要变成主节点的从节点 -a此从节点的密码 输入 replicaof no one 查看端口状态 info replication 总结&#xff1a; redis-cli -p 端口号 -a 密码 replicaof no one info replicati…

STM32第十七课:连接云平台进行数据传输

目录 需求一、云平台项目创建二、代码编写1.导入MQTT包2.连接阿里云3.发布数据 三、关键代码总结 需求 1.通过生活物联网平台设计一个空气质量检测仪app。 2.连接阿里云平台将硬件数据传输到云端&#xff0c;使手机端能够实时收到。 一、云平台项目创建 先进入阿里云生活服务…

cs231n 作业3

使用普通RNN进行图像标注 单个RNN神经元行为 前向传播&#xff1a; 反向传播&#xff1a; def rnn_step_backward(dnext_h, cache):dx, dprev_h, dWx, dWh, db None, None, None, None, Nonex, Wx, Wh, prev_h, next_h cachedtanh 1 - next_h**2dx (dnext_h*dtanh).dot(…

打造属于你的私人云盘:在 OrangePi AIpro 上搭建个人云盘

随着数字化时代的到来&#xff0c;数据的存储和管理变得愈发重要。相比于公共云存储服务&#xff0c;搭建一个属于自己的个人云盘不仅能够更好地保护隐私&#xff0c;还可以更灵活地管理数据。 近期刚好收到了一个 香橙派 AIpro 的开发板&#xff0c;借此机会用来搭建一个属于…

人工智能项目论文复现

文章目录 &#xff08;一&#xff09;技术学习任务Ⅰ、机器学习之聚类1、基本介绍概念2、聚类分析基本介绍3、K均值聚类4、K近邻分类模型(KNN)5、均值漂移聚类6、代码实现7、上述三种算法总结 Ⅱ、机器学习其他常用技术1、决策树基本知识2、异常检测概念3、主成分分析4、决策树…

落日余晖映晚霞

落日余晖映晚霞&#xff0c;立于海滨&#xff0c;望夕阳余晖洒于波光粼粼之上&#xff0c;金光跳跃&#xff0c;若繁星闪烁&#xff0c;耀人心目。 海风轻拂&#xff0c;心境宁静&#xff0c;凡尘俗务皆于此刹那消散&#xff0c;思绪万干&#xff0c;或忆往昔点滴&#xff0c;或…

SQL 对一个经常有数据更新和删除操作的表,怎样优化以减少磁盘空间的占用?

文章目录 一、定期清理不再需要的数据二、使用合适的数据类型三、压缩数据四、删除重复数据五、分区表六、索引优化七、碎片整理八、归档历史数据九、监控和评估 在数据库管理中&#xff0c;当面对一个经常进行数据更新和删除操作的表时&#xff0c;磁盘空间的有效利用是一个重…

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…

赋值运算符重载和const成员函数和 const函数

文章目录 1.运算符重载(1)(2)运算符重载的语法&#xff1a;(3)运算符重载的注意事项&#xff1a;(4)前置和后置重载区别 2.const成员函数3.取地址及const取地址操作符重载4.总结 1.运算符重载 (1) 我们知道内置类型(整形&#xff0c;字符型&#xff0c;浮点型…)可以进行一系…