【文件IO】JavaIO详解

news2024/11/27 0:35:36

一.文件的相关概念

    1. 什么是文件?
      文件是计算机中存储信息的基本单位。文件通常指的是存储在计算机或其他数字存储设备上的一段信息的集合,这些信息可以是文本、图片、音频、视频等不同格式的数据。
    1. 文件路径: 文件的路径可以分为两类
    • 相对路径:先指定一个"当前目录"/工作目录/基准目录,从该位置出发,找到目标文件.例如:./text.txt其中**.表示当前目录~如果有.**表示上层目录.
    • 绝对路径:指的就是从树跟节点出发,一层一层最终到达目标文件.例如D:\IOTest\TestDemo1
    1. 文件的分类:
    • 文本文件:此处的文本文件是按照文本/字符串来理解文本内容(即文件里面的二进制内容,都被表示为字符串).进一步理解可以认为二进制内容都是合法的字符串(文件存储的数据都是在指定的码表上可以查到~例如gbk/uft8/ascii).
    • 二进制文件:二进制文件可能包含任何类型的数据,包括图像、音频、视频或其他非文本信息。
    1. 如何判断一个文件是文本文件还是二进制文件?
      一个简单粗暴的办法就是用记事本打开,看到的内容是否是乱码,如果是乱码,则为二进制文件word / excel / power point<富文本> / exe / dll / 图片 / 音频 / 视频 / .class.如果不是乱码,是你能看懂的内容,则为文本文件(.c / .java / .cpp).

二.针对文件系统的操作.

包括不限于(创建文件 , 删除文件 , 重命名文件 , 列出目录内容… 就是右键能够进行的操作)

java.io.File类是文件和目录路径名称的抽象表示,主要用于文件和目录的创建、查找和删除等操作

File类详解.

构造方法:

  • public File(String pathname):通过将给定的路径名 字符串转换为抽象类路径 来创建新的实例

  • public File(String parent,String child):从父路径字符串 和 子路径字符串创建新的File实例

  • public File(File parent,String child):从父抽象路径名 和 子路径名字符串创建新的File实例
    其他常用方法:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class Test8 {
    public static void main(String[] args) throws IOException {
        //File file = new File("C:/IOTest/yt/test.txt");
        File file = new File("./test.txt");
        System.out.println(file.getParent()); //获取父路径
        System.out.println(file.getName());   //获取文件名
        System.out.println(file.getPath());   //获取文件路径
        System.out.println(file.getAbsolutePath());   //获取文件的绝对路径
        System.out.println(file.getCanonicalPath());
        //其中.表示当前路径,此处是先一层一层找到IO这一级目录,然后再找.
        //相当于原地踏步一下,此处的.就是IO这一级目录~~而后面哪一种就是绝对路径整理化简之后的结果.
        System.out.println(file.exists());   //判断文件是否存在
        System.out.println(file.isFile());   //判断是否是一个文件
        System.out.println(file.isDirectory()); //判断是不是目录
        boolean ret = file.createNewFile();
        System.out.println("ret = "+ret);
        //boolean ret = file.delete();
        file.deleteOnExit();    //程序结束后删除文件
        //程序结束之后再删除
        //System.out.println(ret);
        String[] files = file.list();
        File[] files1 = file.listFiles();   //当前目录下的文件
        System.out.println(Arrays.toString(files));
        File file1 = new File("./aaa");
        File file2 = new File("./aa/bb/cc");
        //需要在构造方法中把路径创建好,再通过mkdir
        boolean ret1 = file.mkdir();
        boolean ret2 =file1.mkdirs();
        System.out.println(ret1);
        System.out.println(ret2);
        File begin = new File("./test2.txt");
        File dest = new File("./aaa/test.txt");
        begin.renameTo(dest);
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.针对文件内容的操作.

IO流的核心概念是将不同的输入/输出源(如键盘、文件、网络连接等)抽象表述为“流”(stream)。这些流是从起源(source)到接收的(sink)的有序数据。在Java中,传统的流类型都放置在java io包下,用于实现各种输入和输出功能。

具体来说,IO流可以根据不同的分类方式分为多种类型:

  • 按照流的流向:可以分为输入流和输出流。输入流用于从中读取数据,而不能向其写入数据;输出流则相反,只能向其写入数据,而不能从中读取数据。
  • 按照处理数据单位的不同:分为字节流和字符流。字节流每次读取或写出一个字节,而字符流每次操作两个字节,适用于传输包含中文等字符的数据。
  • 按照流的角色划分:节点流和处理流。节点流直接从或向一个特定的地方(节点)读写数据,而处理流则是对节点流的封装,提供了更高级的功能,如缓冲和格式化。
    读写文件内容在各种编程语言中都是固定套路:①打开文件 ②关闭文件 ③读文件 ④.写文件
文件资源资源泄露:

关闭文件—>释放了文件的相关资源—>进程pcb中文件描述符表,记录了当前进程都打开了哪些文件—顺序表/数组 数组中每一个元素都是一个结构体这个结构体就是具体描述了你打开这个文件在文件系统上的一些属性.每次打开一个文件,都是需要在文件描述符表中占据一个位置的. 如果不关闭的话,还一直打开~~就会导致文件描述符表被耗尽.也叫做文件资源泄露

字节流:

Java IO包中以字节流进行读取文件的类是FileInputStream,它是InputStream(字节输入流)抽象类的子类。
代码示例:(有带缓冲区的和不带缓冲区的)
字节输入流

import java.io.*;

public class ioDemo7 {
    public static void main(String[] args) throws IOException {
        InputStream in = null;
        try(InputStream in1 = new FileInputStream("./Test.txt")){
//            //读文件
//            //不知道文件有多少字节,使用while循环.
//            while(true){
//                int b = in1.read();
//                if(b==-1){
//                    break;
//                }
//                //如果是中文,则打印的是utf8编码对应的值
//                System.out.printf("%x ",b);
//            }
            while(true) {
                byte[] buffer = new byte[1024];
                //buffer是一个缓冲区,往往是一个内存空间
                int n = in1.read(buffer);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x ",buffer[i]);
                }
            }
        }

    }
}

字节输出流:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class ioDemo9 {
    public static void main(String[] args) throws IOException {
        //append末尾添加
        try (OutputStream out = new FileOutputStream("./Test.txt",true)){
            byte[] buffer = new byte[]{97,98,99,100,101,102};
            out.write(buffer);
        }
    }
}
字符流

字符输入流:
代码示例:

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ioDemo10 {
    public static void main(String[] args) throws IOException {
        try (Reader in = new FileReader("./Test.txt")){
            while(true) {
                char[] buffer = new char[1024];
                int n = in.read(buffer);
                if(n==-1){
                    break;
                }
                String str = new String(buffer,0,n);
                System.out.println(str);
                for (int i = 0; i < n ; i++) {
                    System.out.print(buffer[i]);
                    System.out.print(" ");
                }
            }
        }
    }
}

字符输出流:
代码示例:

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class ioDemo11 {
    public static void main(String[] args) throws IOException {
        try (Writer writer = new FileWriter("./Test.txt",true)){
            String str = "团子真帅";
            writer.write(str);
        }
    }
}

注:

  • read()无参数的版本.每次调用读取一个字节.返回值就表示读取到这个字节的值~~看起来是int实际上是byte实际取值是0-255,如果读取到文件末尾,继续读取,读取的值为-1.
  • read(byte[] b) 一个参数版本,传入的字节数组参数,是一个输出型参数.byte[] 是引用类型.方法内部针对数组内容进行修改,方法执行结束后,方法外部也能生效.使用read的时候,往往就是定义一个内容为空的数组(不是努力了),把空数组交给read ,read内部对数组内容进行填充.
  • read的第二三个版本返回的int表示实际读取的自己个数,默认情况下,read会尝试把数组填满但是文件的实际剩余长度可能不足以填满, 此时返回值就是告诉你实际填充了多少个字节
  • OutputStream 默认的情况下,会把之前文件的内容清空掉(不是write引起的,而是打开操作引起的),然后从头重新写.
  • 使用字符流读取汉字的时候,一个char占两个字节,一个汉字(utf8编码)占三个字节,此时按字符打印汉字就会出现问题,汉字打印不出来. 相当于在读取的时候,把文件中的utf8在按照字符读取的时候,先转成Unicode,每个char中存的是Unicode的值~~如果基于Unicode最终还可以构造回utf8的String
  • Scanner 也可以使用Scanner来辅助咱们读取文件~~Scanner(System.in) 本质上是一个inputStream

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

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

相关文章

c++的STL(8) -- queue

queue容器概述 queue容器实现了实现了和队列相同结构的容器。 如图&#xff0c;队列这种结构有两端: 队首和队尾。 对于队列&#xff0c;我们添加数据只能从队尾添加&#xff0c;删除数据和获取数据只能从队首删除。是一种先进先出的结构。 -- 当然读取数据也只能从队首或者…

方案分享 | 嵌入式指纹方案

随着智能设备的持续发展&#xff0c;指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势&#xff0c;被广泛地运用在智能门锁、智能手机、智能家居等设备上。 我们推荐的品牌早已在2015年进入指纹识别应用领域&#xff…

MUNK电源维修GmbH高频电源E230 G60/45 WRG-TFMYCT24

德国MUNK电源维修主要系列&#xff1a;ΡKA2&#xff0c;DCAC100&#xff0c;AS100&#xff0c;HS100&#xff0c;ESA2000&#xff0c; HSG2000&#xff0c;E230 G60/45&#xff1b;E230 G100&#xff0c;D400 G100全系列型号。 常见维修型号包括&#xff1a;D400 G100/75WRG-…

【四十一】【算法分析与设计】floodfill(2),130. 被围绕的区域,417. 太平洋大西洋水流问题

目录 130. 被围绕的区域 417. 太平洋大西洋水流问题 结尾 130. 被围绕的区域 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&#xff1a;board …

长基线大高差RTK定位效果分析

为了评估基于GNSS参考站网的实时高精度滑坡监测算法效果&#xff0c;如图2所示&#xff0c;本文共收集了中国西北2019年年积日第271&#xff5e;277共7天的4个CORS站数据&#xff0c;分别为LZLC、BYBY、LXDX、LXJS&#xff0c; 2个黑方台滑坡监测站数据HF01和HF06&#xff0c;其…

算法:多重背包问题dp

文章目录 一、多重背包问题特点1.1、多重背包问题的特征1.2、解决多重背包问题的基本方法典型例题&#xff1a;AcWing——多重背包问题I 1.3、二进制优化1.3.1、二进制优化的思想1.3.2、多重背包问题的二进制优化 一、多重背包问题特点 多重背包问题是背包问题的又一变种&…

大厂设计师倾心推荐的在线作图免费网站

在当今数字时代&#xff0c;绘画已经成为各行各业的必备技能。无论你是设计师、学生、创作者还是业余爱好者&#xff0c;免费的在线绘图软件都是发挥创造力和表达想法的理想选择。本文将介绍七款强大免费的在线绘图软件&#xff0c;让你轻松实现自己的创作梦想。你可以在不安装…

功能测试_验证qq账号的合法性

案例&#xff1a;验证qq账号的合法性&#xff08;要求&#xff1a;6-10位的自然数&#xff09; 使用等价类设计用例案例&#xff1a; 步骤&#xff1a; 1:明确需求&#xff1a;qq账号的合法性 2:划分等价类&#xff1a;有效等价类、有效取值、无效等价类、无效取值 3&…

docker搭建EFK

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败&#xff0c;提示目录挂载失败&#xff0c;可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

LeetCode-冗余连接(并查集)

每日一题&#xff0c;今天又刷到一道使用并查集来解决的问题&#xff0c;再次加深了一遍自己对并查集的印象和使用。 题目要求 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1…

Windows11下Docker使用记录(一)

Docker使用记录&#xff08;一&#xff09; 简单介绍Docker安装Docker 常用命令Docker 可视化Docker 使用GPU可视化rviz、gazebo 在进行ROS项目开发时&#xff0c;如果只有一台Windows电脑&#xff0c;我们可以考虑使用WSL或Docker来搭建ROS环境。在尝试了两种方式后&#xff0…

【静态分析】静态分析笔记01 - Introduction

参考&#xff1a; BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…

Python实现滑块验证码识别,最简单的一种,没有任何加密

网址链接&#xff1a;衣丰 & 2010-聚衣网(juyi5.cn) - 常熟市聚衣网&#xff0c;聚衣网女装&#xff0c;江苏省女装批发&#xff0c;苏州市女装批发&#xff0c;常熟市女装批发&#xff0c;网销女装一件代发&#xff0c;全国最低价 平时采集数据&#xff0c;频率过快&…

ai伪原创文案,快速生成文案的方法!

在当今数字化时代&#xff0c;文案写作成为广告、营销等领域中不可或缺的一环。然而&#xff0c;随着互联网的发展&#xff0c;市场上的竞争愈发激烈&#xff0c;传统的文案写作方式已经无法满足大家的需求。ai伪原创文案的出现&#xff0c;便成为一种快速的写作文案的方法。本…

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob&#xff08;原OhMyScheduler&…

中国500米分辨率年最大EVI数据集

增强型植被指数&#xff08;EVI&#xff09;是在归一化植被指数&#xff08;NDVI&#xff09;改善出来的&#xff0c;根据大气校正所包含的影像因子大气分子、气溶胶、薄云、水汽和臭氧等因素进行全面的大气校正&#xff0c;EVI大气校正分三步&#xff0c;第一步是去云处理。第…

基于SpringBoot+Vue网上医院预约挂号系统+jsp(源码+部署说明+演示视频+源码介绍+lw)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

python使用uiautomator2操作雷电模拟器9

之前写过一篇文章 python使用uiautomator2操作雷电模拟器_uiautomator2 雷电模拟器-CSDN博客 上面这篇文章用的是雷电模拟器4&#xff0c;雷电模拟器4.0.78&#xff0c;android版本7.1.2。 今天有空&#xff0c;再使用雷电模拟器9&#xff0c;android版本9来测试一下 uiauto…

绝地求生29.1版本更新后进不去 绝地求生更新后进不去游戏怎么办

绝地求生游戏共有两种主要模式&#xff1a;第一人称模式和第三人称模式。在这两种模式下玩家可以分别进行单排&#xff0c;双排&#xff0c;四人组队或单人匹配四人团队模式。在进入游戏的时候&#xff0c;玩家可以在面板选择第一人称以及第三人称。在双排或四排等组队多人游戏…

【学习】软件测试需求分析要从哪些方面入手

软件测试需求分析是软件测试过程中非常重要的一个环节&#xff0c;它是为了明确软件测试的目标、范围、资源和时间等要素&#xff0c;以确保软件测试的有效性和全面性。本文将从以下几个方面对软件测试需求分析进行详细的阐述&#xff1a; 一、软件测试目标 软件测试目标是指…