JAVAEE——文件IO

文章目录

  • 文件的概念
    • 什么是文件?
    • 树型结构组织 和 目录
    • 文件路径
      • 相对路径
      • 绝对路径
    • 文件的分类
    • 文件的权限
  • 文件读写IO API
    • 字符流操作API
  • 警告
    • 字节流操作API
      • InputStream
      • OutputStream

文件的概念

什么是文件?

我们先来理解一下什么是文件,那么想要知道什么是文件的话,我们首先要知道文件是干嘛的,文件其实就是用来保存数据的,我们知道我们电脑产生的数据是保存在了硬盘里的,可是那么多的数据如果我们不进行分类保管的话就会导致所有的数据乱作一团,因此就有了文件,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般,那么我们创建了一个文件但是不往里面写东西那么这个文件有内存吗?也就是说创建一个空的文件,那么这个文件真的就是不占内存吗?显然这个答案是不对的,即使这个文件什么东西也没写他也不可能就一些内存没占,这是为什么呢?
因为一个文件需要储存的其实不止他所包含的数据还有他自己的一些属性比如说这个文件的名称还有这个文件的位置这些属性信息同样也是需要储存的。既然需要储存那就一定占了内存。

树型结构组织 和 目录

前面说了文件里面用来保存了文字数字等内容,可是一堆的文件放在那里也不好看啊,怎么办呢?这时候聪明的人类就想到了一个好点子那就是像文件保存数据一样创造一种类型让他能够保存文件,这个类型就是文件夹。当然了我们应该叫做目录。
这些目录是按照什么进行排列的呢?当然是树形了。我们可以看一下下面这个图
在这里插入图片描述
我们可以看到上面的目录和文件的关系其实就是像棵树一样也就是多叉树。

文件路径

既然文件的一个存放是一个多叉树的类型,那么我们应当如何定位一个文件呢?那么这时候就需要文件路径了。
那么文件路径又分为相对路径和绝对路径

相对路径

从任意节点出发到达目标节点的路径称为相对路径。

绝对路径

从根节点出发到达目的节点的方式成为绝对路径。

文件的分类

那么文件分为哪几类呢?文件分为二进制文件和文本文件,那么什么是二进制文件,什么是文本文件呢?二进制文件是指文件中的内容是二进制的形式,这些文件我们人是看不懂的,二进制文件常见的是以bin为结尾,而文本文件常见的是以txt形式为结尾。

文件的权限

关于文件的权限其实windows上体验的其实不是很明显,因为windows中自带的就是管理员权限,但是Linux中感觉就很明显了,那么文件权限的意义是什么呢?文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读、可写、可执行权限。
Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文
件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念,例如,软链接(soft link)等。

文件读写IO API

关于文件的操作可以分为两大类,如下图
在这里插入图片描述
那么什么是字符流什么又是字节流呢?他们两个区分其实很简单,字符流操作中的基本单位是字符,字节流操作的基本单位是字节。
那么我们来分别进行操作。

字符流操作API

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class test_byte {public static void main(String[] args) throws IOException {Reader reader=new FileReader("d:/test.txt");char[] arr=new char[1024];reader.read(arr);System.out.println(arr);}
}

首先我们先来看一下这个代码假如说我的d盘中没有test.txt那么这个代码可以执行吗?答案是可以的 但是会抛出异常
在这里插入图片描述
这里我们可以看到这里的异常说明系统找不到指定文件那么我们将其创建出来。然后我们向里面写一些东西来进行测试
在这里插入图片描述
这里我们发现我们输出的东西很奇怪因为他输出了我们写的内容之后有输出了一个很奇怪的字符这是为什么呢?因为我们刚刚对这个字符串类型初始化的是1024个字节,但是这里面的内容很明显没有1024这时候还有一些没被初始化的地方就变成了现在这样了。那么这时候怎么解决呢?
其实很简单我们的render方法是有返回值的他的返回值其实就是,该文件中字符的个数,因为我们是字符流操作的因此他返回的内容就是文件中字符的个数。因此我们只需要对代码进行稍稍的改动即可

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class test_byte {public static void main(String[] args) throws IOException {Reader reader=new FileReader("d:/test.txt");char[] arr=new char[1024];int n=reader.read(arr);for(int i=0;i<n;i++){System.out.println(arr[i]);}//System.out.println(arr);}
}

但是这样就没问题了吗?当然不是我们这里是讲arr的长度设置的比文件中的字符个数要大因此才可以正常打印可是如果更小呢?如果更小的话很明显我们的代码时不行 的那么怎么办呢?这里就要讲解一下read的工作原理他的工作原理其实时讲文件中的内容尽可能的写到传入的数组中如果一次不行就多传几次因此我们可以加个while循环多次写入,并且当文件中的内容全部写到了数组中之后就会返回-1。代码如下

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class test_byte {public static void main(String[] args) throws IOException {Reader reader=new FileReader("d:/test.txt");char[] arr=new char[2];while(true){int n=reader.read(arr);if(n==-1){break;}for(int i=0;i<n;i++){System.out.println(arr[i]);}}//System.out.println(arr);}
}

那么如何写入呢?其实跟上面的方式是差别不大的。我们直接来看看代码就可以了。

import java.io.*;public class test_byte {public static void main(String[] args) throws IOException {Writer writer=new FileWriter("d:/test.txt");String string=new String("JAVA你好");writer.write(string);writer.flush();//System.out.println(arr);}
}

这里可能会有困惑的地方应该就是flush这里,那么为什么要加个flush呢?其实是因为我们在进行写的时候其实不是直接写进文件中的而是先写进一个缓冲区里,这是为什么呢?
我们可以想一下一个人嗑瓜子,那么这个人嗑瓜子需要扔瓜子皮,垃圾桶此时又不在他身边,那么这时候他是磕一个瓜子然后去扔一个瓜子皮方便呢?还是把嗑下来的瓜子皮先用纸巾包着然后嗑够了后再去把这些嗑下的瓜子皮一下子全扔掉更好呢?很明显是第二种更好,此时这个纸巾其实就是缓冲区,那么如何告诉缓冲区我已经写好了赶紧把缓冲区中的数据刷新到内存中把,很简单其实就是用这个flush方法。

警告

但是上面的代码是一个有很严重bug那就是当我们进行读写操作后没有进行close,这是一个很严重的问题,我们在进行文件操作的时候必须要进行close,因为我们打开的文件其实都有一个数字去代表这个文件而这个数字时保存在了一个顺序表中的,这个顺序表如果被占满的话就会导致代码崩溃。那么为了防止这样的事件发生我们有什么办法呢?有的那就是将我们实例化出的对象放在try的小括号中

import java.io.*;public class test_char {public static void main(String[] args) throws FileNotFoundException {try(Reader reader=new FileReader("d:/test.txt")){char[] arr=new char[1024];reader.read(arr);System.out.println(arr);}catch (IOException e){e.printStackTrace();}}
}

字节流操作API

首先是字节流的类是什么呢?字节流的类有两个一个是InputStream,还有一个是OutputStream关于这两个类我们的分析如下

InputStream

import java.io.*;public class test_char {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream=new FileInputStream("d:/test.txt")) {byte[]arr=new byte[1024];int n=inputStream.read(arr);for(int i=0;i<n;i++){System.out.printf("%x ",arr[i]);}}catch (IOException e){e.printStackTrace();}}
}

在这里插入图片描述
那么此时的n就是这个文件中的字节数,而输出的数字就是这个文件中每个字符的ASCII码
此外呢我们读取文件还有一个办法那就是使用scanner代码如下

import java.io.*;
import java.util.Scanner;public class test_char {public static void main(String[] args) throws FileNotFoundException {
//        try(OutputStream outputStream=new FileOutputStream("d:/test.txt")){
//            String s="你好IO";
//            outputStream.write(s.getBytes());
//        }catch (IOException e){
//            e.printStackTrace();
//        }try (InputStream inputStream=new FileInputStream("d:/test.txt")){Scanner scanner=new Scanner(inputStream);String s=scanner.nextLine();System.out.println(s);}catch (IOException e){e.printStackTrace();}}
}

在这里呢我们的scanner初始化的时候传入我们的字节流对象即可完成。

OutputStream

那么如何向文件中写呢?那就是用outputStream这个类使用方法和上面其实大同小异

import java.io.*;public class test_char {public static void main(String[] args) throws FileNotFoundException {try(OutputStream outputStream=new FileOutputStream("d:/test.txt")){String s="你好IO";outputStream.write(s.getBytes());}catch (IOException e){e.printStackTrace();}}
}

这里我们要注意几点那就是因为我们此时时字节流,因此我们输入按道理来说也得是字节流但是因为我们无法去记住每个字符他的ASCII码因此java中边封装了getBytes()因此我们在写入的时候需要调用这个方法将我们想要写的内容转化为字节码。

当然除此之外还有没有别的办法呢?当然也有。代码如下

import java.io.*;
import java.util.Scanner;public class test_char {public static void main(String[] args) throws FileNotFoundException {try(OutputStream outputStream=new FileOutputStream("d:/test.txt")){PrintWriter printWriter=new PrintWriter(outputStream);printWriter.print("我爱你");printWriter.flush();}catch (IOException e){e.printStackTrace();}
//        try (InputStream inputStream=new FileInputStream("d:/test.txt")){
//            Scanner scanner=new Scanner(inputStream);
//            String s=scanner.nextLine();
//            System.out.println(s);
//        }catch (IOException e){
//            e.printStackTrace();
//        }}
}

我们只需要创建一个PrintWriter 然后再new的时候将OutputStream 对象传进去就可以完成字节流向字符流的转换了。

想要和你并肩看夕阳我心之所向。

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

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

相关文章

软件安全评估之设计评审入门(上)

壹 基础概念 在软件开发生命周期&#xff08;Software Development Life Cycle&#xff0c;简称SDLC&#xff09;中&#xff0c;设计评审&#xff08;Design Review&#xff09;是一个关键的阶段&#xff0c;旨在确保软件设计满足项目需求和目标&#xff0c;并且能够高效、可靠…

01 _ 分布式缘何而起:从单兵,到游击队,到集团军

这里先来聊聊什么是分布式。 与其直接用些抽象、晦涩的技术名词去给分布式下一个定义&#xff0c;还不如从理解分布式的发展驱动因素开始&#xff0c;我们一起去探寻它的本质&#xff0c;自然而然地也就清楚它的定义了。 这里将介绍分布式的起源&#xff0c;是如何从单台计算…

聚道云连接器打通红圈CRM和金蝶云星辰,赋能环境科技公司数字化转型

一、客户介绍 某环境科技有限公司是一家专注于环保科技领域的领先企业&#xff0c;致力于为客户提供全方位的环境解决方案。公司拥有一支经验丰富、技术精湛的团队&#xff0c;不断推动环保技术的创新与应用。作为业内的佼佼者&#xff0c;该公司在环境治理、资源回收和节能减…

深度学习理论基础(四)Parser命令行参数模块

学习目录&#xff1a; 深度学习理论基础&#xff08;一&#xff09;Python及Torch基础篇 深度学习理论基础&#xff08;二&#xff09;深度神经网络DNN 深度学习理论基础&#xff08;三&#xff09;封装数据集及手写数字识别 深度学习理论基础&#xff08;四&#xff09;Parse…

Datax,hbase与mysql数据相互同步

参考文章&#xff1a;datax mysql 和hbase的 相互导入 目录 0、软件版本说明 1、hbase数据同步至mysql 1.1、hbase数据 1.2、mysql数据 1.3、json脚本&#xff08;hbase2mysql.json&#xff09; 1.4、同步成功日志 2、mysql数据同步至hbase 1.1、hbase数据 1.2、mysql…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架&#xff0c;安装 npm i element-ui -S 建议查看官方文档 Element组件&#xff0c;这里是Vue2搭配elementUI&#xff0c;如果是vue3就搭配elementPlus&#xff0c;这里初学就以Vue2为例子…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

合并主分支到子分支

参考&#xff1a;【Git】合并分支出现 Please enter a commit message to explain why this merge is necessary.-CSDN博客 git 如何将主分支(master)合并到子分支上_git 将主分支合并到子分支-CSDN博客 1、先切换到主分支master git checkout master 2、把主分支代码拉到本地…

RankCSE

前置知识复习 https://www.cnblogs.com/Allen-rg/p/13958508.htmlword2vec详解&#xff1a;https://zhuanlan.zhihu.com/p/114538417 Word2Vec和GloVe都是用于将词与向量相关联的流行词嵌入模型。 相同点&#xff1a; 目标&#xff1a;Word2Vec和GloVe的共同目标是将词汇映射…

Windows/Jerry

Jerry Enumeration nmap 扫描系统发现对外开放了 8080 端口&#xff0c;再次使用 nmap 扫描端口详细信息&#xff0c;发现运行着 Apache Tomcat ┌──(kali㉿kali)-[~/vegetable/HTB/Jerry] └─$ nmap -sV -sC -p 8080 -oA nmap 10.10.10.95 -Pn Starting Nmap 7.93 ( htt…

【QT学习】Graphics View框架(进阶篇)- 派生QGraphicsItem类创建自定义图元item

【QT学习】Graphics View框架&#xff08;进阶篇&#xff09;- 派生QGraphicsItem类创建自定义图元item-CSDN博客 前言 本篇&#xff0c;我们将通过对QGraphicsItem类进行派生&#xff0c;创建自定义图元item并显示在窗口中。我们将以创建一张从文件读取的图片item为例进行分…

使用Nodejs + express连接数据库mongodb

文章目录 先创建一个js文档安装 MongoDB 驱动程序&#xff1a;引入 MongoDB 模块&#xff1a;设置数据库连接&#xff1a;新建一个表试试执行数据库操作&#xff1a;关闭数据库连接&#xff1a; 前面需要准备的内容可看前面的文章&#xff1a; Express框架搭建项目 node.js 简单…

轻松上手Jackjson(珍藏版)

写在前面 虽然现在市面上有很多优秀的json解析库&#xff0c;但 Spring默认采用Jackson解析Json。 本文将通过一系列通俗易懂的代码示例&#xff0c;带你逐步掌握 Jackson 的基础用法、进阶技巧以及在实际项目中的应用场景。 一、Jackjson简介 Jackson 是当前用的比较广泛的&a…

idea开发 java web 疫情信息查询系统bootstrap框架web结构java编程计算机网页接口查询

一、源码特点 java 疫情信息查询系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css j…

The Closest Pair Problem

Problem Let S be a set of n points ((xi,yi), 1≤i≤n) in the plane, finding a pair of points p and q in S whose mutual distance is minimum. Algorithm 1: Θ ( n 2 ) The brute-force algorithm simply examines all the possible n(n−1)/2 distances and returns t…

CentOS部署Apache Superset大数据可视化BI分析工具并实现无公网IP远程访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

模具行业项目管理系统哪家好?模具项目管理系统找企智汇!

模具行业是一个对项目管理要求非常高的领域&#xff0c;涉及到复杂的制造流程、精细的工艺要求以及紧密的供应链协作。因此&#xff0c;选择一款适合模具行业的项目管理系统至关重要。 企智汇作为一款专注于企业数字一体化项目管理的软件&#xff0c;为模具行业提供了全面的项…

解决Xshell连接不上虚拟机

相信有很多同学和我一样遇到这个问题&#xff0c;在网上看了很多教程基本上都先让在虚拟机输入ifconfig命令查看ip地址&#xff0c;弄来弄去最后还是解决不了&#x1f62d;&#x1f62d;&#xff0c;其实问题根本就不在命令上&#xff0c;很大概率是我们的虚拟机没有开启网卡&a…

CSS实现热门创作者排行榜(毛玻璃效果)

CSS实现热门创作者排行榜&#xff08;毛玻璃效果&#xff09; 效果展示 CSS 知识点 CSS 基础知识回顾filter 属性运用回顾 整体页面布局实现 <div class"container"><h3>Popular Creator Rank List</h3><!-- 用户列表容器 --><div cl…

【剪映专业版】02软件快捷键

视频课程&#xff1a;有知公开课【剪映电脑版教程】 快捷键 苹果电脑选择Final Cut Pro X Windows电脑选择Premiere Pro 常用快捷键 更改快捷键