java IO流(1)

news2024/11/23 18:39:48

一. 文件类

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)直接将数据以字符串形式写出,不用自己将字节数组转换成字符串

 

 

 

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

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

相关文章

18_特征金字塔网络FPN结构详解

1.1 简介 在深度学习领域&#xff0c;尤其是计算机视觉和目标检测任务中&#xff0c;Feature Pyramid Networks (FPN) 是一种革命性的架构设计&#xff0c;它解决了多尺度特征检测和融合的关键问题。FPN最初由何凯明等人在2017年的论文《Feature Pyramid Networks for Object …

阿里云ecs服务器,nginx多域名多项目部署教程,含本地部署教程

nginx多域名部署项目 本地部署线上部署一、本地部署 第一步:win+r 输入drivers 打开hosts文件,编辑 加行 127.0.0.1 自定义域名 … 第二步:下载 nginx 安装好以后 打开ngin安装目录,选择nginx.conf 打开 #user Administrator; worker_processes

【python技巧】parser传入参数

参考网址: https://lightning.ai/docs/pytorch/LTS/api/pytorch_lightning.utilities.argparse.html#pytorch_lightning.utilities.argparse.add_argparse_args 1. 简单传入参数. parse_known_args()方法的作用就是把不在预设属性里的参数也返回,比如下面这个例子, 执行pytho…

前端技术(三)—— javasctipt 介绍:jQuery方法和点击事件介绍(补充)

6. 常用方法 ● addClass() 为jQuery对象添加一个或多个class <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&…

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

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

【UML用户指南】-30-对体系结构建模-模式和框架

目录 1、机制 2、框架 3、常用建模技术 3.1、对设计模式建模 3.2、对体系结构模式建模 用模式来详述形成系统体系结构的机制和框架。通过清晰地标识模式的槽、标签、按钮和刻度盘 在UML中&#xff0c; 对设计模式&#xff08;也叫做机制&#xff09;建模&#xff0c;将它…

前端必修技能:高手进阶核心知识分享 - CSS 阴影属性详解

CSS 涉及设计到阴影的相关内容包括三个方面&#xff1a;box-shadow属性&#xff08;盒子阴影&#xff09;、 text-shadow属性&#xff08;文本阴影&#xff09;、drop-shadow滤镜。 本篇文章旨在详细介绍和分析三种阴影的具体参数设置和典型用例。 box-shadow属性&#xff08;…

1958.力扣每日一题7/7 Java(100%解)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

【ubuntu中关于驱动得问题】—— 如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动总结 前言 NVIDIA显卡驱动是用于支持和优化NVIDIA显卡在计算机系统中运行的关键软件组件。该驱动程序能…

2024 WAIC|第四范式胡时伟分享通往AGI之路:行业大模型汇聚成海

7月4日&#xff0c;2024世界人工智能大会&#xff08;WAIC&#xff09;正式开幕。此次大会围绕核心技术、智能终端、应用赋能等板块展开&#xff0c;展览规模、参展企业数均达历史最高。第四范式受邀参展&#xff0c;集中展示公司十年来在行业大模型产业应用方面的实践。在当天…

Django 查询数据

模型参考上一章内容&#xff1a; Django QuerySet对象&#xff0c;filter()方法-CSDN博客 查询数据可以通过以下方法&#xff1a; Book.objects.all() Book.objects.filter() Book.objects.get() 1&#xff0c;添加视图函数 Test/app11/views.py from django.shortcuts im…

【QT中堆栈布局的实现】

学习分享 1、环境设置&#xff0c;头文件2、.h文件2.1、主界面.h文件2.2、对话界面1.h文件2.3、对话界面2.h文件 3、.cpp文件3.1、对话界面1.cpp3.2、对话界面2.cpp3.3、主界面.cpp3.4、main.cpp 1、环境设置&#xff0c;头文件 该示例使用C14实现&#xff0c;因此在QT项目pro文…

实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)

目录 文章目录 目录docusaurus简介效果专题链接&#x1f44f;环境源码1、安装基础环境2、拉取代码3、安装坚果云并同步md核心文件4、构建运行5、配置脚本环境1.配置vscode终端到ecs的免密2.配置win10 vscode终端环境变量 6、构建并推送静态文件到ecs关于我最后最后 docusaurus简…

基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启

1. erlang与RabbitMQ对应版本参考&#xff1a;https://www.rabbitmq.com/which-erlang.html 2. 安装erlang 官网&#xff1a;https://www.erlang.org/downloads GitHub: https://github.com/rabbitmq/erlang-rpm/releases 2.1 安装依赖&#xff1a; yum -y install gcc glib…

BigDecimal(double)和BigDecimal(String)有什么区别?BigDecimal如何精确计数?

BigDecimal(double)和BigDecimal(String)的区别 double是不精确的&#xff0c;所以使用一个不精确的数字来创建BigDecimal&#xff0c;得到的数字也是不精确的。如0.1这个数字&#xff0c;double只能表示他的近似值。所以&#xff0c;当我们使用new BigDecimal(0.1)创建一个Bi…

算法简介:什么是算法?——定义、历史与应用详解

引言 在现代计算机科学中&#xff0c;算法是一个核心概念。无论是编程还是数据分析&#xff0c;算法都扮演着至关重要的角色。在这篇博客中&#xff0c;我们将深入探讨算法的定义、历史背景以及它在计算机科学中的地位和实际应用。 什么是算法&#xff1f; 算法是解决特定问题…

STM32基础篇:GPIO

GPIO简介 GPIO&#xff1a;即General Purpose Input/Output&#xff0c;通用目的输入/输出。就是一种片上外设&#xff08;内部模块&#xff09;。 对于STM32的芯片来说&#xff0c;周围有一圈引脚&#xff0c;有时需要对引脚进行读写&#xff08;读&#xff1a;从外部输入一…

数字信号处理及MATLAB仿真(3)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

51单片机-第一节-LED和独立按键

一、点亮LED&#xff1a; 首先包含头文件 <REGX52.H> 随后令P2为0xFE。(此时二进制对应1111 1110&#xff0c;为0 的LED亮&#xff0c;故八个灯中的最后一个亮起)。 注&#xff1a;P2为控制LED的8位寄存器。 void main() {P2 0xFE;//1111 1110while(1){} } 二、L…

非同步升压转换器,效率95%你信吗?ETA1611输出电流2A, 22V DCDC

前言&#xff1a; 截止24年7月7日某创报价&#xff1a;500&#xff1a; &#xffe5;0.7856 / 个 建议使用前同时了解下方器件。 2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片 描述 ETA1611 SOT23-6封装 丝印GVYW&#xff0…