JavaSE基础(12)——文件、递归、IO流

news2024/9/24 19:20:28

1、IO流

Input:输入,写数据,数据从磁盘加载到内存(程序)中。

Output:输出,读数据,数据从内存(程序)存储到磁盘中。

:不管是读还是写,都要对数据进行传输,传输的方式就是流

2、File类

数据的读写离不开文件,File类是可以对文件和目录(文件夹)级别,而不是内容本身进行增删改查的类。

File类的API

//传递完整路径(文件或目录)
public File(String pathname)
//父级目录(字符串类型)和子级目录创建新File实例
public File(String parent, String child)
//父级目录(File类型)和子级目录创建新File实例
public File(File parent, String child)
//URI类型的路径创建实例
public File(URI uri)

常用方法

1.创建修改删除功能

1、createNewFile() 文件不存在,创建一个新的空文件并返回 true ,文件存在,不创建文件并返回 false 。

2. *static createTempFile() 根据前缀和后缀名在指定目录下生成不重名的临时文件

3. mkdir() 创建一层目录

4. mkdirs() 创建多层目录

5. renameTo(new File("")) 修改文件名

6. delete() 删除文件或空目录

2.判断功能的方法

1. exists() 判断文件是否存在 
2. isFile() 是否是文件
3. isDirectory() 是否是一个目录 
4. canRead() 是否可读
5. canWrite() 是否可写

3.获取功能的方法

1. getAbsolutePath() 获得绝对路径
2. getParentFile() 获得父路径
3. getName() 获得文件名
4. length() 获得文件长度(字节)
5. lastModified() 最后修改时间的毫秒值

4.目录的遍历

1. String[ ] list() 返回一个String数组,表示该File目录中的所有子文件或目录。
2. File[ ] listFiles() 返回一个File数组,表示该File目录中的所有的子文件或目录。

3、递归

方法体内部调用自己本身方法的方法就是递归调用
递归比较适合解决同一段代码需要根据每次执行结果调用多次的情况(大问题化小)
注意:递归方法一定要有结束条件,否则找不到出口会报内存溢出(OOM)异常

import java.io.File;
//递归遍历文件夹下所有的文件
public class RecursionDirectory {
    public static void main(String[] args) {
        File file=new File("D:\\java专属IO测试");
        Recursion(file);
    }
    public static void Recursion(File file){
        //1、判断传入的是否是目录
        if(!file.isDirectory()){
        //不是目录直接退出
        return;
        }
        //已经确保了传入的file是目录
        File[] files = file.listFiles();
        //遍历files
        for (File f: files) {
        //如果该目录下文件还是个文件夹就再进行递归遍历其子目录
            if(f.isDirectory()){
                //递归
                Recursion(f);
            }else {
                //如果该目录下文件是个文件,则打印对应的名字
                    System.out.println(f.getName());
            }
        }
    }
}

4、IO流的分类

1、按照方向分:   输入流(数据从其他设备读取/加载到内存

                              输出流(数据从内存存储到其他设备中)

2、按照传输内容分:字节(byte)流、字符(char)流,1字节(byte)=8位(bit)

3、按照功能分为:节点流()、增强流(具有额外功能的增强流)

3、四个顶层的流(节点流)
        1. InputStream 字节输入流
        2. OutputStream 字节输出流
        3. Reader 字符输入流
        4. Writer 字符输出流

5、字节流—用于处理任意文件

        一切文件数据(文本、图片、视频等)都是以二进制形式存储,数据传输时一样以二进制形式传输。字节流可以传输任意文件数据。无论使用什么样的流对象,底层传输的始终为二进制数据。

字节流读取中文字符时,可能不会显示完整的字符,那是因为一个中文字符占用多个字节存储。

字节输出流(OutputStream)

以下方法是字节输出流都具有的方法,由父类OutputStream定义提供,子类都会共享这些方法

//将 b.length个字节从指定的字节数组写入此输出流。
public void write(byte[] b)
//从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
//也就是说从off个字节数开始读取一直到len个字节结束
public void write(byte[] b, int off, int len)
//将指定的字节输出流。
public abstract void write(int b)
//刷新此输出流并强制任何缓冲的输出字节被写出。
public void flush()
//关闭此输出流并释放与此流相关联的任何系统资源。
public void close()
 FileOutputStream

写出字节的 write 方法

public void write(int b)        //写出一个字节的数据
public void write(byte[] b)    //写出字节数组中的数据
public void write(byte[] b,int off,int len) //写出从 off 索引开始,len 个字节的数据

追加内容和换行

    // 回车符(\r):回到一行的开头(return)。
    // 换行符(\n):下一行(newline)
    FileOutputStream fos = new FileOutputStream("fos.txt");
    fos.write("\r\n".getBytes());
字节输入流(InputStream)

java.io.InputStream 抽象类是表示字节输入流的所有类的超类(父类),可以读取字节信息到
内存中。它定义了字节输入流的基本共性功能方法。

FileInputStream

读字节数据 read 的方法

    //可以读取一个字节的数据,读取到文件末尾,返回-1(int)
    public void read()
    //读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1    
    public void read(byte[] b)    
    //读出从 off 索引开始,len 个字节的数据
    public void read(byte[] b,int off,int len)

示例代码:以字节数组读取文本内容 

public class FISRead {
    public static void main(String[] args) throws IOException{
    // 使用文件名称创建流对象.
        FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde
    // 定义变量,作为有效个数
        int len ;
    // 定义字节数组,作为装字节数据的容器
        byte[] b = new byte[2];
    // 循环读取
        while (( len= fis.read(b))!=-1) {
    // 每次读取后,把数组的有效字节部分,变成字符串打印
            System.out.println(new String(b,0,len));// len 每次读取的有效字节个数
        }
    // 关闭资源
        fis.close();
    }
}
/*读取结果:
ab
cd
e
*/

字节流复制图片/音频/视频等文件 

public class Copy {
    public static void main(String[] args) throws IOException {
// 1.创建流对象
// 1.1 指定数据源
    FileInputStream fis = new FileInputStream("D:\\test.jpg");
// 1.2 指定目的地
    FileOutputStream fos = new FileOutputStream("test_copy.jpg");
// 2.读写数据
// 2.1 定义数组
    byte[] b = new byte[1024];
// 2.2 定义长度
    int len;
// 2.3 循环读取
    while ((len = fis.read(b))!=-1) {
// 2.4 写出数据
        fos.write(b, 0 , len);
    }
// 3.关闭资源
    fos.close();
    fis.close();
    }
}

6、字符流—用于处理文本文件

        因为数据编码(ASCII、Unicode、GBK、UTF-8)的不同,字节流处理字符比较麻烦
字符流本质其实就是基于字节流读取时,去查了指定的码表(字符流 = 字节流 +编码表 )
如果处理纯文本的数据优先考虑字符流,其他情况就只能用字节流了(图片、视频等),而字节流直接读取中文文本数据会有乱码的问题

字符输出流(Writer)

java.io.Writer 抽象类是字符输出流的所有类的超类(父类),将指定的字符信息写出到目的地。它同样定义了字符输出流的基本共性功能方法。

基本共性方法

//写入单个字符。
void write(int c)
//写入字符数组。
void write(char[] cbuf)
//写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
abstract void write(char[] cbuf, int off, int len)
//写入字符串。
void write(String str)
//写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
void write(String str, int off, int len)
//刷新该流的缓冲
void flush()
//关闭此流,但要先刷新它。
void close()
FileWriter 

使用FileWriter进行写文件时,需要使用flush()方法将数据从缓冲区保存到文件

关闭close和刷新flush

        flush :刷新缓冲区,流对象可以继续使用。
        close : 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

        因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们想写出数据,同时继续使用流,就需要 flush 方法。
        flush() 这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用 close() 方法关闭读写流,这时就可能造成数据丢失,为什么呢?因为,读入数据完成时不代表写入数据完成,一部分数据可能会留在缓存区中,这个时候 flush() 方法就格外重要了。

字符输入流(Reader)

        java.io.Reader 抽象类是字符输入流的所有类的超类(父类),可以读取字符信息到内存中。它 定义了字符输入流的基本共性功能方法。

基本共性功能方法

//关闭此流并释放与此流相关联的任何系统资源
public void close()
//从输入流读取一个字符
public int read()
//从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
public int read(char[] cbuf)
FileReader

读取数据的Read方法

        1. 读取字符: read 方法,每次可以读取一个字符的数据,返回为int类型,读取到文件末尾,返回 -1。

        2. 使用字符数组读取: read(Char[] b) ,每次读取b的长度个字符到数组中 返回读取到的有效字符个数,读取到末尾时,返回 -1。

文本复制
字符流,只能操作文本文件,不能操作图片,视频等非文本文件。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile {
    public static void main(String[] args) throws IOException {
//创建输入流对象
    FileReader fr=new FileReader("F:\\新建文件夹\\aa.txt");//文件不存在会抛出java.io.FileNotFoundException
//创建输出流对象
    FileWriter fw=new FileWriter("C:\\copyaa.txt");
/*创建输出流做的工作:
* 1、调用系统资源创建了一个文件
* 2、创建输出流对象
* 3、把输出流对象指向文件
* */
//文本文件复制,一次读一个字符
    copyMethod1(fr, fw);
//文本文件复制,一次读一个字符数组
    copyMethod2(fr, fw);
    fr.close();
    fw.close();
    }
    public static void copyMethod1(FileReader fr, FileWriter fw) throws IOException {
        int ch;
        while((ch=fr.read())!=-1) {//读数据
            fw.write(ch);//写数据
        }
        fw.flush();
    }
    public static void copyMethod2(FileReader fr, FileWriter fw) throws IOException {
        char chs[]=new char[1024];
        int len=0;
        while((len=fr.read(chs))!=-1) {//读数据
            fw.write(chs,0,len);//写数据
        }
        fw.flush();
    }
}

7、数组流

        FileInputStream、FileOutputStream、FileReader、FileWriter是操作存储在硬盘上数据的工具类。
        硬盘上的资源java虚拟机是无权直接访问的,必须借助操作系统,java虚拟机借助完了之后要通知操作系统释放资源。
        把操作源头换成电脑上的一块内存(字节数组),java 就可以直接访问,因为是 java 虚拟机的一块内存,不用关闭(释放)。
        转化成字节数组的量要小,否则内存很容易过多。任何数据都可以转化成字节数组。

8、处理流

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

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

相关文章

html一文入门---标签大合集

一、文档结构标签 <!DOCTYPE html>: 声明文档类型和 HTML 版本&#xff0c;告诉浏览器使用 HTML5 解析文档。<html>: HTML 文档的根元素。<head>: 包含文档的元数据&#xff08;如标题、字符集、样式表链接&#xff09;。<title>: 定义文档的标题&…

这本书已经无敌!一本书学懂NLP自然语言(附PDF文档)

自然语言处理被誉为“人工智能皇冠上的明珠”。深度学习等技术的引入为自然语言处理技术带来了一场革命&#xff0c;尤其是近年来出现的基于预训练模型的方法&#xff0c;已成为研究自然语言处理的新范式。而今天给大家推荐的这本《自然语言处理&#xff1a;基于预训练模型的方…

详细的爱剪辑官网免费版下载步骤,还有四款剪辑工具推荐!

在当下这个数字化、自媒体蓬勃发展的时代&#xff0c;视频剪辑已成为大家日常中的一项不可或缺的技能。面对市面上丰富多样的剪辑工具&#xff0c;许多初学者往往感到困惑&#xff0c;不知道该如何选择。今天接这篇文章给大家详细解析五款常用的视频剪辑软件&#xff0c;包括还…

数字工厂管理系统与MES系统集成后有哪些作用

在当今智能制造的浪潮中&#xff0c;数字工厂管理系统与MES管理系统的深度融合与集成&#xff0c;已成为推动企业转型升级、提升生产效率与竞争力的关键路径。两者协同工作&#xff0c;不仅实现了生产过程的透明化、智能化管理&#xff0c;还促进了资源优化配置与决策支持能力的…

Python读取fasta格式数据成为字典形式。

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 Python读取fasta格式数据成为字典形式。 def read_fasta(file_path):"""读取FASTA格式文件&#xff0c;并返回一…

基于vue框架的毕业设计管理系统5n36i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,课题信息,题目分类,选题信息,任务书,中期检查,提交论文,论文成绩,答辩成绩,校园公告,教研主任,申报课题 开题报告内容 基于Vue框架的毕业设计管理系统开题报告 一、引言 随着高等教育的不断发展&#xff0c;毕业设计作为培…

2024年中科院SCI期刊牛顿-拉夫逊优化算法NRBO优化Transformer-LST模型的多变量时间序列预测

matlab R2024a以上 一、数据集 二、2024年中科院SCI期刊牛顿-拉夫逊优化算法NRBO 牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;该成果由Sowmya等人于2024年2月发表在中科院2区Top SC…

OpenHarmony开发实战: 一种应用界面UI自动化测试方法

前言&#xff1a; 随着 OpenHarmony 版本更新&#xff0c;应用生态繁荣&#xff0c;如何对应用界面进行自动化测试成为一个迫切的问题。一般情况&#xff0c;对应用的界面测试都是通过人工进行&#xff0c;效率低&#xff0c;误判率高&#xff0c;本文将介绍一种通过图片对比进…

OpenCV Lesson 2: 如何使用OpenCV扫描图像、查找表和时间测量

How to scan images, lookup tables and time measurement with OpenCV Goal目标Our test case我们的测试用例How is the image matrix stored in memory? Goal We’ll seek answers for the following questions: How to go through each and every pixel of an image? How…

Redis远程字典服务器(8)—— zset类型详解

目录 一&#xff0c;基本情况 二&#xff0c;常用命令 2.1 zadd 2.2 zcard&#xff0c;zcount 2.3 zrange&#xff0c;zrevrange&#xff0c;zrangebyscore 2.4 zpopmax&#xff0c;bzpopmax 2.5 zpopmin&#xff0c;bzpopmin 2.6 zrank&#xff0c;zrevrank&#xff0…

跨界合作:联想拯救者Y9000P《黑神话:悟空》联名版震撼发布

在科技与文化的交汇点&#xff0c;联想拯救者与备受瞩目的国产单机游戏《黑神话&#xff1a;悟空》携手&#xff0c;共同推出了令人瞩目的Y9000P联名定制版笔记本。 这款笔记本不仅承载着联想拯救者对于极致性能的追求&#xff0c;更融入了《黑神话&#xff1a;悟空》深厚的文…

CAN总线/CAN应用层协议设计,理解并实践仲裁段位域定义

文章目录 概述位序和字节序驱动层CAN帧数据结构待发送数据的结构待接收数据的结构仲裁段使用U32的低位&#xff1f; 位段结构和寄存器位的映射数据段的发送顺序CAN协议定义协议文档中的定义仲裁段定义数据段定义跨平台CAN通信 概述 我们已然明确地知道&#xff0c;CAN仲裁段的…

全自动监控主机掉线或录像回放异常

支持浏览器的cookie或者密码进行登录监控主机。 已实现的功能&#xff1a; 1、后台常驻运行 2、支持多主机监测&#xff0c;回放丢失、线路中断 3、支持异常报警通知到企业微信 监控主机已经自带监控异常邮箱报警通知的功能了&#xff0c;为什么还要额外做呢&#xff1f; 1、…

数学生物学-4-混乱系统(Chaotic Systems)

混沌系统&#xff08;Chaotic Systems&#xff09;是一种复杂且非线性的动态系统&#xff0c;其基本概念和特征有&#xff1a; 对初始条件的敏感依赖性&#xff1a; 混沌系统的核心特征之一是对初始条件的极端敏感性&#xff0c;这一特性通常被称为“蝴蝶效应”。这意味着即使是…

NVIDIA超分辨率开启详细教程

NVIDIA超分辨率介绍 参考链接&#xff1a;NVIDIA RTX 视频超分辨率NVIDIA 目前推出的 RTX 视频超分辨率 (VSR) 更新可实现更出色的整体图形保真度&#xff0c;同时保留精美细节&#xff0c;提供对原生视频的上采样技术&#xff0c;并且还支持 GeForce RTX 20 系列 GPU。 RTX V…

unity Standard Assests资源商店无法安装解决方案

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发unity中国 嗨嗨嗨&#xff0c;我来啦。 这几天的川渝之旅已经圆满结束了&#xff0c;今天开始正常给大家更新&#xff1a; Unity…

素数筛选(暴力排除)

前言&#xff1a;写这一题的时候没看到本质&#xff0c;只拿了一半的分&#xff0c;其实这一题就是找最小匹配的素数 而且我还忘记去重导致一半的样例没过 题目地址 法一&#xff1a;直接先去重&#xff0c;后对每一个数作为因子&#xff0c;开一个桶记录 #include<iostre…

前端css溢出属性overflow

overflow: visible;默认是显示溢出 overflow:hidden;溢出隐藏 overflow: scroll; 出现滚动条&#xff0c;就算内容不超过盒子都显示滚动条 overflow: auto;内容多了自动出现滚动条 overflow: inherit;继承父元素效果 <!DOCTYPE html> <html lang"en"&…

推荐 3 款最好用的流程图工具,简单易用,总有一款适合你

Dia Dia是一款开源的流程图绘制软件&#xff0c;是GNU计划的一部分&#xff0c;由Alexander Larsson创立。该软件使用单文档界面&#xff08;CSDI&#xff09;模式&#xff0c;类似于GIMP&#xff0c;并且设计上将多种需求以模块化的方式进行处理&#xff0c;如流程图、网络图、…

【JVM】JVM内存模型与操作系统内存模型(二)

JVM内存模型与操作系统内存模型 本地方法栈 与虚拟机栈发挥的作用是相似的&#xff0c;他们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务&#xff0c;而本地方法栈则为虚拟机使用到的Native方法服务。在虚拟机规范中对本地方法栈中使用、使用方式与数据结…