【文件IO】JavaIO详解

一.文件的相关概念

    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

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

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

相关文章

批量把GBK文本编码换成UTF-8

因为工作团队协作原因,有的同事使用gbk,有的使用utf-8,不方便,于是商量便统一换成utf-8,但是项目文件太多,所以百度搜索于是有了用python脚本一键实现的方案,以下为步骤. 本人亲测可用!!!(只在win11上亲测可用) 以下代码只实现对.c和.h文件的编码转换 1.电脑安装python脚本: …

css文字颜色渐变

background: linear-gradient(to top, #C3F8B3, #66FFFF);-webkit-background-clip: text;-webkit-text-fill-color: transparent; 效果

户外骑行存档(图新地球与运动健康App)经验分享

0序 之前天天加班熬夜&#xff0c;身体素质有些下降&#xff0c;在锻炼的过程中喜欢上了骑行&#xff0c;周周骑、天天骑。 骑行会产生很多的轨迹&#xff08;有很多朋友不喜欢装很多app&#xff0c;就用手机自带的运动健康&#xff0c;也有喜欢专业运动app的&#xff0c;道理…

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(四)

本篇内容对应 “2.5 开发登录、退出功能” 小节 “4.7 优化登陆模块” 小节 2.6 显示登录信息 2.7 账号设置 2.8 检查登录状态 登录功能的流程是什么&#xff1f; UUID为什么不会重复&#xff1f; 因为UUID是基于mac物理地址、时间戳、随机数等信息生成。因此UUID居于极高的唯…

在B站看课的进度助手

效果 代码 BilibiliVideoDurationCrawler import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; imp…

【教程】混淆Dart 代码

什么是代码混淆&#xff1f; 代码混淆是一种将应用程序二进制文件转换为功能上等价&#xff0c;但人类难于阅读和理解的行为。在编译 Dart 代码时&#xff0c;混淆会隐藏函数和类的名称&#xff0c;并用其他符号替代每个符号&#xff0c;从而使攻击者难以进行逆向工程。 Flut…

每日一题:有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

教你构建一个优秀的SD Prompt

构建一个优秀的Prompt 在使用Stable Diffusion AI时,构建一个有效的提示(Prompt)是至关重要的第一步。这个过程涉及到创造性的尝试和对AI行为的理解。这里我会对如何构建一个好的Prompt进行一个总结。 什么是一个好的提示词 构建有效的提示是使用Stable Diffusion AI或其…

职场商务英语口语柯桥外语培训之“手机欠费”用英文怎么说?

大家天天玩手机&#xff0c; 肯定会碰到 “欠费”“没电”“关机” 这些情况&#xff0c; 那么问题来了&#xff0c; 你知道用英语怎么说&#xff1f; 一起来和小编来学习下吧 今天&#xff0c;一起来学习一下吧。 ● 手机欠费 英语怎么说&#xff1f; ● 肯定有同学要…

二手车商的套路

https://www.dongchedi.com/article/7126394624675578405 https://www.dongchedi.com/article/7126394624675578405 现在&#xff0c;有越来越多的人去了解二手车&#xff0c;二手车相对于新车来说&#xff0c;更加的亲民划算。很多新车需要四五十万&#xff0c;而二手车有可…

信息素养与终身学习解锁题目搜索之道的新引擎【文末送书】

文章目录 信息素养&#xff1a;搜索前的准备终身学习&#xff1a;搜索后的深化新引擎的构建与运行 搜索之道&#xff1a;信息素养与终身学习的新引擎【文末送书】 随着互联网的快速发展和信息技术的日益成熟&#xff0c;搜索已经成为获取知识和信息的主要途径之一。然而&#x…

浙大恩特客户资源管理系统 RegulatePriceAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 RegulatePriceAction接口存在 SQL 注入漏洞,攻击者可通过输入恶意 SQL …

47 转置卷积【李沐动手学深度学习v2课程笔记】

1. 转置卷积 卷积层和汇聚层通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;&#xff0c;卷积通常来说不会增大输入的高和宽&#xff0c;要么保持高和宽不变&#xff0c;要么会将高宽减半&#xff0c;很少会有卷积将高宽变大的。可以通过 padding 来增加高…

layui复选框勾选取消勾选事件监听

监听事件放置位置&#xff1a; form.on(checkbox(equipInputClick), function(data){var a data.elem.checked;var val data.value;if(a true){}else{}});html部分 <input lay-filter"equipInputClick" type"checkbox" lay-skin"primary&quo…

Leetcode 23.合并K个升序链表

心路历程&#xff1a; 第一反应是直接暴力求解出来&#xff0c;因为题中也没有关于复杂度的要求。写完发现竟然也通过了&#xff0c;后来发现这道题本来考察的是分治算法&#xff0c;不过能解决问题就行吧。 从评论区看到了一句话很有意思&#xff1a;链表的题能暴力做出来的…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive简单使用

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

优先级队列

优先级队列的基本使用 模拟实现上面的接口函数&#xff0c;优先级队列不是队列&#xff0c;而是类似一个堆一样的东西&#xff0c;我们先来试试它的接口函数是怎么个样子的。 需要包含的头文件是queue。 #include<iostream> #include<queue> using namespace std;…

2024/4/5—力扣—字符串相乘

代码实现&#xff1a; 方法一&#xff1a;常规解法——超出整数表示范围 long long char_to_num(char *str) {long long num 0;for (int i 0; i < strlen(str); i) {num num * 10 (str[i] - 0);}return num; }char* multiply(char *num1, char *num2) {long long a cha…

拥抱智能,IT运维将有哪些变化?

Gartner数据显示&#xff0c;2023年AIOps在中国市场渗透率只达到目标受众的5%-20%。这一数据意味着仍有大量企业还未进行AIOps建设&#xff0c;未来AIOps市场前景广阔。目前&#xff0c;已经开始应用AIOps的企业&#xff0c;智能运维水平普遍还处于辅助智能化运维阶段&#xff…

linux-docker安装nginx

1.拉取镜像&#xff1a; docker pull nginx2.创建挂在路径&#xff1a; mkdir -p /usr/local/nginx/conf mkdir -p /usr/local/nginx/logs mkdir -p /usr/local/nginx/www mkdir -p /usr/local/nginx/conf.d 3.启动镜像:为了拿到位置文件&#xff0c;先启动下 docker run -…