【文件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");//需要在构造方法中把路径创建好,再通过mkdirboolean 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.mzph.cn/news/804815.shtml

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

相关文章

武汉星起航:成功挂牌,董事长张振邦:将持续为创业者提供支持

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司来说&#xff0c;是一个值得铭记的历史时刻。这一天&#xff0c;公司在上海股权托管交易中心成功挂牌展示&#xff0c;这不仅是公司发展历程中的一个重要里程碑&#xff0c;更是对其不懈努力和卓越成就的肯定。 武汉…

求三角形面积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double a, b, c, s, area;//赋值&#xff1b;a 3.67;b 5.43;c 6.21;//运算求s&#xff1b…

阿里云ECS服务器上如何白嫖一年的腾讯云的SSL证书(详细保姆教程)

有的时候&#xff0c;我们在阿里云上有一个ECS备案的服务器&#xff0c;而且也有域名&#xff0c;但是现在很多场景下是需要Https协议的&#xff0c;如果用宝塔搭建网站系统的话&#xff0c;就需要一个SSL证书&#xff0c;目前阿里云上SSL证书购买要么是付费的&#xff0c;要么…

Leetcode算法训练日记 | day21

一、二叉搜索树的最小绝对差 1.题目 Leetcode&#xff1a;第 530 题 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

mapv修改源码实现图标和管道到统一页面显示,图标和管道和点击

一、效果图 二、背景 map 地图添加marker&#xff0c;是操作的dom&#xff0c;而mapv是使用的canvas方式&#xff0c;所以性能要好 三、Mapv和MapVGL的区别 百度地图 JavaScript API GL快速升级 和mapVGL的使用 Mapv 是一款基于百度地图的大数据可视化开源库&#xff0c;可以…

【Linux】socket编程2

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;客户端代码Makefile(生成目标文件)UdpClient.cc(客户端代码)服务端代码部分优化1&#xff08;接受客户端时显示客…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

淘宝扭蛋机小程序源码搭建:打造专属电商娱乐新平台

在数字化浪潮的推动下&#xff0c;电商平台不断创新&#xff0c;以满足消费者日益多样化的需求。淘宝扭蛋机小程序作为一种创新的电商娱乐形式&#xff0c;受到了广大用户的热烈追捧。为了满足市场需求&#xff0c;许多企业和开发者开始关注淘宝扭蛋机小程序的源码搭建&#xf…

Spring6-单元测试:JUnit

1. 概念 在进行单元测试时&#xff0c;特别是针对使用了Spring框架的应用程序&#xff0c;我们通常需要与Spring容器交互以获取被测试对象及其依赖。传统做法是在每个测试方法中手动创建Spring容器并从中获取所需的Bean。以下面的两行常见代码为例&#xff1a; ApplicationCo…

[C语言][数据结构][链表] 单链表的从零实现!

目录 零.必备知识 1.一级指针 && 二级指针 2. 节点的成员列表 a.数据 b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…

挑错罐头=“害猫”!猫咪主食罐到底应该怎么选?

猫咪罐头已经成为众多猫奴们的喂养首选。它富含水分&#xff0c;有助于猫咪保持良好的泌尿系统健康&#xff0c;尤其对于那些不太喜欢饮水的猫咪来说&#xff0c;罐头无疑是补充水分的理想方式。罐头的口感极佳&#xff0c;肉质细腻&#xff0c;能够激发猫咪的食欲&#xff0c;…

C语言—每日选择题—Day65

前言 我们的刷题专栏又又又开始了&#xff0c;本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图&#xff0c;一方面可以使作者加深理解&#xff0c;一方面可以给大家提供思路&#xff0c;希望大家多多支持哦&#xff5e; 第一题 1、如下代码输出的是什么…

深入理解LRU缓存算法:原理、应用与优化

LRU算法&#xff08;Least Recently Used&#xff0c;最近最少使用算法&#xff09;的思想是基于"时间局部性"原理&#xff0c;即在一段时间内&#xff0c;被访问过的数据在未来仍然会被频繁访问的概率较高。 LRU 原理 LRU算法的主要思想是将最近被使用的数据保留在…

UEditor编辑器自动将div标签转换成p标签应该如何解决 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4

首先在ueditor的文件夹下找到ueditor.all.js文件&#xff0c;然后搜索allowDivTransToP找到这段代码&#xff0c;把后面的true设置为false 接着在ueditor.config.js文件内搜索allowDivTransToP找到如下的代码&#xff0c;将注释去掉并且改为false //默认过滤规则相关配置项目/…

MPT - 原理及应用

前文回顾 Merkle原理及应用Merkle代码实现Patricia原理及应用Patricia代码实现 什么是MPT&#xff08;Merkle Patricia Tree&#xff09;树 MPT树是一种数据结构&#xff0c;用于在以太坊区块链中高效地存储和检索账户状态、交易历史和其他重要数据。MPT树的设计旨在结合Merk…

sqlmap(四)案例

一、注入DB2 http://124.70.71.251:49431/new_list.php?id1 这是墨者学院里的靶机&#xff0c;地址&#xff1a;https://www.mozhe.cn/ 1.1 测试数据库类型 python sqlmap.py -u "http://124.70.71.251:49431/new_list.php?id1" 1.2 测试用户权限类型 查询选…

常见深度学习之十二大激活函数【函数定义、性质、数学公式、代码实现】

目录 前言 1、激活函数的定义与作用 2、激活函数的性质 二、常见的激活函数 2.1 Sigmoid函数&#xff1a; 1. 作用 2. 优点 3. 缺点 4. 数学公式 5.Sigmoid函数实现及可视化图像 2.2 Tanh函数 1. 函数定义 2.优点 3.缺点 4.Tanh函数实现及可视化图像 2.3ReLU 函数 &#xff1a;…

物联网实战--驱动篇之(二)Modbus协议

目录 一、modbus简介 二、功能码01、02 三、modbus解析 四、功能码03、04 五、功能码05 六、功能码06 七、功能码16 一、modbus简介 我们在网上查阅modbus的资料发现很多很杂&#xff0c;modbus-RTU ASCII TCP等等&#xff0c;还有跟PLC结合的&#xff0c;地址还分1开…

C语言进阶课程学习记录-第29课 - 指针和数组分析(下)

C语言进阶课程学习记录-第29课 - 指针和数组分析&#xff08;下&#xff09; 数组名与指针实验-数组形式转换实验-数组名与指针的差异实验-转化后数组名加一的比较实验-数组名作为函数形参小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课…

【JavaWeb】Day39.MySQL概述——数据库设计-DQL(二)

数据库设计-DQL 聚合函数 聚合函数查询就是纵向查询&#xff0c;它是对一列的值进行计算&#xff0c;然后返回一个结果值。&#xff08;将一列数据作为一个整体&#xff0c;进行纵向计算&#xff09; 语法&#xff1a; select 聚合函数(字段列表) from 表名 ; 注意 : 聚合…