文件IO知识(一)

作者:爱塔居

专栏:JavaEE

作者简介:大三学生,希望和大家一起进步。

文章目录

目录

文章目录

前言

一、路径

二、文本文件和二进制文件

三、文件系统操作

四、“字符流”和“字节流”

五、utf8和unicode


前言

平时谈到的“文件”,指的都是硬盘上的文件。

硬盘(外存)和内存相比:

速度:内存比硬盘快很多。

空间:内存空间比硬盘小。

成本:内存比硬盘贵一点。 

之前的代码绝大部分都是围绕内存展开的。JavaSE+数据结构。定义个变量,其实就是内存上申请空间。

MySQL主要就是操作硬盘

文件IO也是操作硬盘。

为什么C语言没有介绍文件操作系统?

C的标准库东西特别少,不支持文件系统操作。即使C++,也是2017(C++17)才支持的。


一、路径

这是我们文件系统上一个文件/目录,具体位置。 

计算机的目录是有层级结构的。

文件系统是以树型结构来组织文件和目录的。N叉树。

文件路径就是以树根节点出发,沿着树杈,一路往下走,到达目标文件,此时这中间经过的内容、

Windows都是以“此电脑”起头的。表示路径的时候,可以把“此电脑”省略,直接从盘符开始表示。

实际表示路径,是通过一个字符串表示,每个目录之间使用斜杠/来分割

从盘符开始,一层一层往下找,这个过程,得到的路径,绝对路径。以“此电脑”为工作路径。

从给定的某个目录出发,一层一层往下找,这个过程得到的路径,相对路径。一定要明确基准目录是啥。

.相对路径中,是一个特殊符号,代表当前目录,

..也是特殊符号,表示当前目录的上级目录 。

文件系统上,任何一个文件,对应的路径是唯一的。不会存在,两个路径相同,但是文件不同的情况。

在Linux,可能存在一个文件,有两个不同的路径能找到它。在Windows上不存在。

在Windows上,可以认为,路径和文件是一一对应的,路径就相当于是一个文件的“身份标识”。

二、文本文件和二进制文件

文本文件,存储的是文本。文本文件的内容都是由ASCII字符构成的。对于ASCII来说,表示范围0-127。后来,由搞出了一些其他的编码方式,utf8之类的,就可以针对其他的语言文字符号进行编码了。

utf8,就可以想象成一个更大的表,但终究是有限的。

文本文件里存储的数据,就是遵守ASCII或者其他字符集编码,所得到的文件。

二进制文件里面存储的是二进制数据,则没有任何字符集的限制(存啥都行)。

简单粗暴的判定方式: 直接使用记事本打开某个文件,如果看得懂就是文本文件(因为记事本就是按照文本的方式来解析显示的),看不懂就是二进制文件。 

txt:文本文件

.java/.c:文本文件

.class: 二进制文件

.exe :二进制文件

jpg,mp3:二进制文件

记事本出现乱码的原因:

二进制都是一个一个的字节,记事本尝试着把当前若干个字节的数据往utf8码表里套,套出来的是啥就是啥。

word编辑的docx和excel编辑的表格都是二进制文件。

三、文件系统操作

Java标准库,给我们提供了File这个类。File对象是硬盘上的一个文件的“抽象”表示。

文件是存储在硬盘上的,直接通过代码操作硬盘,不太方便,就在内存中创建一个对应的对象。操作这个内存中的对象,就可以间接地影响到硬盘的文件情况了。

1.构造File对象

构造的过程中,可以使用绝对路径/相对路径来进行初始化。这个路径指向的文件,可以是真实存在的,也可以不是真实存在的。

import java.io.File;

public class IODemo1 {
    public static void main(String[] args) {
        File file=new File("d:/chen.jpg");
    }
}

属性 

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String类型的表示
static charpathSeparator

依赖于系统的路径分隔符,char类型的表示

构造方法

签名说明
File(File parent,String chiled)根据父目录+孩子文件路径,创建一个新的
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径
File(String parent,String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示

方法

修饰符及返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanifFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件。成功创建后返回true
booleandelete()根据File对象,删除该文件。成功删除后返回true
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行
String[]list()返回File对象代表的目录下的所有文件,以File对象表示
File[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()返回File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间的目录
booleanrenameTo(Filedest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

示例:

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

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        File file=new File("d:/chen.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.list());
        System.out.println(file.exists());
        file.delete();
        System.out.println(file.exists());
        file.createNewFile();
        System.out.println(file.exists());
        file.mkdir();
        file.mkdirs();
       
    }
}

四、“字符流”和“字节流”

针对文本文件,提供了一组类,统称为“字符流”(典型代表,Reader,Writer)

针对二进制文件,提供了一组类,统称为“字节流”(典型代表,InputStream,OutputStream)

每个流对象,又分成两种:

输入的:Reader,inputStream

输出的;Writer,OutputStream

 Java有GC,内存一般不用手动释放。但是文件的资源,则需要手动释放。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class IODemo1{
    public static void main(String[] args) throws IOException {
        InputStream file = new FileInputStream("d:/helloworld.txt");
        file.close();//有打开就要有关闭。非常重要,必须写!!!
    }
}

进程是使用PCB这样的结构来表示:

1.pid

2.内存指针

3.文件描述符表

记载了当前进程都打开了哪些文件,每次打开一个文件,就会在这个表里,申请到一个位置。

这个表可以当成一个数组,数组下标就是文件描述符,数组元素就是这个文件在内核中的结构体的表示。

而这个表长度是有限制的,不能无休止地打开,又不释放。一旦满了,继续打开,就会打开失败。

这种情况,属于文件资源泄露,十分严重。

五、utf8和unicode

udt8和unicode可以视作两个不同的表,这里的编号是不同的,即使是同一个符号(汉字)得到的数值都是不一样的。

utf8是基于unicode演化出来的。

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

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

相关文章

Spring 源码解析 - BeanPostProcessor 扩展接口

一、BeanPostProcessor 扩展接口 BeanPostProcessor是Spring中的一个扩展接口,它可以在Spring容器实例化bean之后,在执行 bean的初始化方法前后,允许我们自定义修改新的 bean实例。比如修改 bean 的属性,将 bean 替换为动态代理等…

《Effective Objective-C 2.0 》 阅读笔记 item6

第6条:理解“属性”这一概念 1. 属性的概念 “属性”(property)是Objective-C的一项特性,用于封装对象中的数据。 Objective-C对象通常会把所需要的数据保存为各种实例变量,实例变量一般通过“存取方法”&#xff08…

GPT-4 免费体验方法

POE 在Quora上非常受欢迎的手机聊天机器人Poe App已经集成ChatGPT助手!除了最初集成的三个聊天机器人Sage、Claude和Dragonfly外,Poe现在还加入了第四位ChatGPT。由于使用了ChatGPT API,因此Poe拥有真正的ChatGPT。 现在更是第一批集成了GP…

JDK1.8去除永久代引入元空间的原因您知道吗

之前写了一篇文章 JVM中的堆和栈到底存储了什么 重点介绍了Java虚拟机运行时数据区中堆、栈以及方法区存储数据的相关知识很受大家欢迎,今天来介绍一下jdk 1.8开始引入的元空间,元空间的引入也是与Java虚拟机运行时存储数据有关。 元空间 JDK8之后就没…

02-Maven高级-分模块开发、依赖传递、聚合、继承(SpringBoot的部分底层原理)、多模块开发(环境切换)、Nexus私服搭建与使用

文章目录学习目标一、分模块开发与设计1. 分模块开发的意义问题导入模块拆分原则2. 分模块开发(模块拆分)问题导入2.1 创建Maven模块2.2 书写模块代码2.3 通过maven指令安装模块到本地仓库(install指令)2.4 代码演示二、依赖管理1…

高低温真空磁场探针台T8-EM5的技术参数

高低温真空磁场探针台是具备提供高低温、真空以及磁场环境的高精度实验台,它的诸多设计都是专用的。因此,高低温磁场探针台的配置主要是根据需求进行选配及设计。例如,要求的磁场值,均匀区大小、均匀度大小、样品台的尺寸等&#…

OJ系统刷题 第三篇

11202 - 任意两个数的和 时间限制 : 1 秒 内存限制 : 128 MB 编程序,电脑任意输入两个整数,计算出他们的和。 输入 a b(a b为整数,范围是-2,147,483,648~2,147,483,647) 输出 ab的和 样例 输入 1 1 输出 2 答案&a…

含分布式电源的配电网可靠性评估研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

外网访问本地Tomcat服务器【cpolar内网穿透】

文章目录前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置3.公网访问测试4.结语前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣(让…

第二届ACC(AcWing Cup)全国联赛 C4943. 方格迷宫

题意 题目大意就是给定一个地图,给定一个起点和终点,要求我们以最小步数到达终点,其中不可以落入陷阱并且每步可以走1−−k步题目大意就是给定一个地图,给定一个起点和终点,要求我们以最小步数到达终点,其中…

基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

crud删除(1.5小时)

一、servlet删除 页面效果 删除一个重复的韩非,可以看到无论是list显示还是navicate全都删除成功了 编写servlet页面时一定要注意,我们不光要在list页面开辟一个新的单元格以及加上超链接,还要给它传入当前行的id参数,这样delete…

企业如何利用大数据精准获客

打造大数据硬核组织 运营商大数据精准获客,助力企业高效获客 导语 获客难、成本高一直是困扰各个企业的一大难点。在大数据获客弥漫的今天,我们仿佛看见了眼前影影绰绰的都是客户,但当伸手去抓,却发现寥寥无几,什么…

Web-Http基本概念(请求与响应)

目录 1、http请求 (1)get (2)host (3)accept (4)referer (5)accept-language (6)user-agent 2、http响应 (1&…

Linux 文件系统是怎么工作的?

同 CPU、内存一样,磁盘和文件系统的管理,也是操作系统最核心的功能。 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。 那么,磁盘和文件系统是怎么工作的呢?又有…

毕业设计源码基于springboot的旧物置换系统的实现

摘 要 随着时代在一步一步在进步,旧物也成人们的烦恼,许多平台网站都在推广自已的产品像天猫、咸鱼、京东。所以开发出一套关于旧物置换网站成为必需。旧物置换网站主要是借助计算机,通过对用户进行管理。为减少管理员的工作,同…

WEB前端作业——banner的切换

实现banner的左右切换按钮 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>div,ul,li,a,span,img{margin:0;padding:0;}#banner { overflow:hidden; width:100%; height:400px; position:rela…

火速上线zkSync Era主网,盘点SpaceFi的Web3布局

最近zkSync Era主网的上线引发了市场对Layer2的和零知识证明技术的关注&#xff0c;而作为Web3跨链应用平台的SpaceFi也在第一时间对zkSync Era进行了支持&#xff0c;并与3月28日上线DEX、Farm、Plant NFT等多个产品&#xff0c;一时间成为zkSync上的热门生态项目。打造一站式…

银行数字化转型导师坚鹏:数字化转型背景下的银行柜员提升之道

数字化转型背景下的银行柜员提升之道 课程背景&#xff1a; 很多银行都在开展银行数字化运营工作&#xff0c;目前存在以下问题急需解决&#xff1a; l 不清楚银行数字化运营包括哪些关键工作&#xff1f; l 不清楚银行数字化运营工作的核心方法论&#xff1f; l 不清楚银行数字…

【新2023Q2模拟题JAVA】华为OD机试 - 不含 101 的数

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:不含 101 的数 题目 橡皮擦…