JAVAEE——文件IO

news2024/11/15 8:34:34

文章目录

  • 文件的概念
    • 什么是文件?
    • 树型结构组织 和 目录
    • 文件路径
      • 相对路径
      • 绝对路径
    • 文件的分类
    • 文件的权限
  • 文件读写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.coloradmin.cn/o/1568628.html

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

相关文章

四川尚熠电子商务有限公司靠谱吗?怎么样?

在当下数字化浪潮中&#xff0c;电子商务行业正以前所未有的速度蓬勃发展。四川尚熠电子商务有限公司&#xff0c;作为专注于抖音电商服务的企业&#xff0c;凭借其敏锐的市场洞察力和创新精神&#xff0c;正成为行业内的佼佼者&#xff0c;为众多品牌打开抖音电商市场的大门。…

[技术闲聊]我对电路设计的理解(三)

终于可以独立做项目了&#xff0c;是不是很激动&#xff0c;是不是为自己骄傲和自豪&#xff0c;应该的&#xff0c;奋斗那么久不就是为了站在山巅看看四周的风景嘛&#xff01; 虽说山外还有山&#xff0c;但是此刻就在脚下的山巅上&#xff0c;怡然自得都是不过分的&#xff…

YOLOv8改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络,CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下…

《内心强大比什么都重要》 - 三余书屋 3ysw.net

内心强大比什么都重要 今天我和大家一起分享一本好书&#xff0c;艾米莫林的《内心强大比什么都重要》。这本书中描述了人们如何控制情绪、想法和行动&#xff0c;让自己的内心更强大。书中也列举了一些有用的建议、积极向上的例子和实际解决方法&#xff0c;来帮助读者们克服…

Python搭建编程环境-安装Python3解释器

✅作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1&#x1f3c5; &#x1f525;本文已收录于Python系列专栏&#xff1a;零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书…

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Java源值1.5已过时,将在未来所有发行版中删除

1、背景 确认java项目没问题&#xff0c;但是启动的时候&#xff0c;却报错&#xff1a;java: -source 1.5 中不支持 diamond 运算符 2、解决 2.1 2.2 2.3 2.4 2.5

阿里云PAI-EAS试用-ComfyUI

试用信息 试用地址 PAI-EAS试用 提供资源 其中A10服务器在10元每小时左右&#xff0c;意味着我们可以使用的试用时间在40个小时以上。每天玩4小时&#xff0c;也可以玩10天了&#xff0c;练习完全够用。 具体过程 官方给了一个简单的指导文档&#xff0c;包括领用资源、部…

1688API接口|获取商品详情信息商品列表商品采集API图搜商品API

API调用公共参数 名称类型必须描述keyString是调用key&#xff08;注册账号获取API&secret&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认…

vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下&#xff0c;攻击者可直接构造特定请求开启特定配置&#xff0c;并最终造成SSRF或任意文件读取。 访问http://your-ip:8983即可查看Apache Solr后台 1.访问http://your-ip:8983/solr/admin/cores?indexI…

Windows通过git配置github代码仓库全流程

git git是代码的版本控制工具 git安装和github注册 这个默认弄过了 通过git和github之间的SSH配置 在github上面新建仓库&#xff0c;做好配置 git绑定GitHub账号 先cd到上传的文件所在的目录 git config --global user.name "你的github用户名"git config -…

Linux 文件相关命令

一、查看文件命令 1&#xff09;浏览文件less 默认查看文件的前 10 行。 less /etc/services ##功能说明&#xff1a; #1.默认打开首屏内容 #2.按【回车】按行访问 #3.按【空格】按屏访问 #4.【从上向下】搜索用/111,搜索包含111的内容&#xff0c;此时按n继续向下搜&#x…

Hadoop: word count,并将结果写入到MySQL

一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

Python | Leetcode Python题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:m, n len(s), len(p)dp [False] * (n1)# 初始化dp[0] Truefor j in range(1, n1):if p[j-1] *:dp[j] dp[j-2]# 状态更新for i in range(1, m1):dp2 [False] * (n1) …

python怎么存储数据

在Python开发中&#xff0c;数据存储、读取是必不可少的环节&#xff0c;而且可以采用的存储方式也很多&#xff0c;常用的方法有json文件、csv文件、MySQL数据库、Redis数据库以及Mongdb数据库等。 1. json文件存储数据 json是一种轻量级的数据交换格式&#xff0c;采用完全…

蓝桥-时间显示

目录 题目链接 代码 题目链接 1.时间显示 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std;int main() {long long x;cin>>x;int h,m,s;x x / 1000 % (3600*24); // 毫秒化秒&#xff0c;并且保留最后一天的时间h x / 3600; //求得…

2006-2022年各省研发投入强度数据/研究与试验发展(RD)经费投入强度数据(无缺失)

2006-2022年各省研发投入强度数据/研究与试验发展(R&D)经费投入强度数据(无缺失) 1、时间:2006-2022年 2、范围&#xff1a;31省 3、来源&#xff1a;科技年鉴 4、指标&#xff1a;研发投入强度/研究与试验发展(R&D)经费投入强度 5、指标解释&#xff1a;研发投入…

面试篇:杂乱篇

String s " "; 1. String类的常用方法有哪些&#xff1f; s.length()&#xff1a; 返回字符串长度s.substring()&#xff1a; 截取字符串s.split()&#xff1a; 分割字符串s.equlas()&#xff1a; 字符串比…

主干网络篇 | YOLOv5/v7 更换骨干网络之 HGNetv2 | 百度新一代超强主干网络

本改进已融入到 YOLOv5-Magic 框架。 论文地址:https://arxiv.org/abs/2304.08069 代码地址:https://github.com/PaddlePaddle/PaddleDetection 中文翻译:https://blog.csdn.net/weixin_43694096/article/details/131353118 文章目录 HGNetv2网络结构1.1 主干网络1.2 颈部…

Redis监控方案以及相关黄金指标提升稳定性和可靠性

Redis监控方案以及相关黄金指标提升稳定性和可靠性 1. 需要了解的词2. 「基准性能」相关指标2.1 Latency2.2 最大响应延迟2.3 平均响应延迟2.4 OPS(instantaneous_ops_per_sec)2.5 Hit Rate 3. 「内存」相关指标3.1 内存使用量(used_memory)3.2 内存碎片率(mem_fragmentation_r…