文件操作和IO

1.认识文件

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时,往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概念,就类似办公桌上的⼀份份真实的⽂件⼀般。.

什么是输入输出?
靠近cpu就是输入,远离cpu就是输出。
在这里插入图片描述
例如下载一个文件,把文件从网卡下载到硬盘上就是输入,把文件上传到网卡上就是输出

文件夹也是一种文件,我们称为“目录文件”(diectory),这种文件之间的嵌套关系是一种树型结构,n叉树。

文件路径

分为绝对路径和相对路径。
绝对路径:以盘符开头的我们称为绝对路径
相对路径,可以是任意路径。例如:
在D:\qq\program\Bin\qq.exe找一个qq.exe,当我们在program中我们可以用./Bin/qq.exe(’./‘可以省略)。这里的一个.表示当前位置。两个点表示前一级例如我们现在在\Bin\plugins,则用…/qq.exe

在windows中我,可以用‘/’或‘\’来写路径名称。但是linuix,Mac等其他一般都是‘\’所以推荐写正斜杠。

区分文本文件和二进制文件

本质上来说无论是文本文件还是二进制文件都存放的是0101这样的二进制数据。不同的是文本文件存的数据可以构成合法字符。
为什么要区分文本文件和二进制文件?

编译处理的过程,处理方式(写的代码)是不同的

如何区分?用记事本,如果是乱码就是二进制文件,不是乱码就是文本文件

对文件系统进行操作

File类来自于java.io包
方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
mkdir只能创建一个目录文件,而mkdirs可以创建多层目录文件

文件内容操作

在java中通过“流”这样的一组类,进行上述内容操作
分为两组

1.字节流(以字节为单位,读写数据)处理二进制文件

InputStream

方法1:

 public static void main(String[] args)throws IOException {
        InputStream inputStream=new FileInputStream("D:/note/text/123.txt");

        while (true){
            int a=inputStream.read();
            //一次read一个字节,参数是int类型
            if (a==-1){
                break;
            }
            System.out.printf("0x%x ",a);
        }
    }

方法2:

 public static void main(String[] args)throws IOException {
        InputStream inputStream=new FileInputStream("D:/note/text/th.jpg");
        //如果大于1024个字节那么一次读不完,那么while再申请1024个字节,直到小于1024结束时返回-1
        while (true){
            byte[] bytes=new byte[1024];
            int n=inputStream.read(bytes);
            //一次读1024个字节,
            System.out.println("n="+n);
            if(n==-1){
                break;
            }
            for (int i = 0; i < n; i++) {

                System.out.printf("0x%x ",bytes[i]);
            }

        }
    }

相比于方法一,从硬盘读一次打印一次方法二直接将硬盘内容读到数组中效率更高
read完之后要关闭文件,因为再你打开文件的时候,会在pcb结构体中,给文件描述符表添加一个元素,因为文件描述符表是有上限的,一旦你重复打开而不关闭就会占满文件描述符表,下次打开文件就会打开失败。

如何避免这种错误发生?

1.读完操作后加上close方法
2.利用try{}finally{}

  public static void main(String[] args)throws IOException {
        InputStream inputStream=null;
        try{
             inputStream=new FileInputStream("D:/note/text/th.jpg");
            while (true){
                byte[] bytes=new byte[1024];
                int n=inputStream.read(bytes);
                System.out.println("n="+n);
                if(n==-1){
                    break;
                }
                for (int i = 0; i < n; i++) {

                    System.out.printf("0x%x ",bytes[i]);
                }
            }
        }finally{
            assert inputStream != null;
            inputStream.close();
        }
    }

3.把流对象创建,写到try()里之后,此时,代码执行出了try{}时,就会自动调用inputStream的close了,此语法称try with resource

注意:只能是实现Closeable接口的类,才能放到try()里

public static void main(String[] args) throws IOException {
        try (InputStream inputStream=new FileInputStream("D:/note/text/123.txt")){
            while (true){
                byte[] bytes=new byte[1024];
                int n=inputStream.read(bytes);
                if(n==-1){
                    break;
                }
                for (int i = 0; i <n ; i++) {
                    System.out.printf("0x%x ",bytes[i]);

                }
            }
        }
    }

总结,字节流通过对字节的读取或写的方式进行操作,

OutputStream

  public static void main(String[] args) throws IOException {
        try(OutputStream outputStream=new FileOutputStream("D:/note/text/123.txt")){
            outputStream.write(97);
            outputStream.write(98);

        }
    }

通过二进制写,将二进制数据存入文件中
按照这样写会将文本中原有数据清空,不是write清空,而是打开操作清空的。使用追加写的方式可以避免此情况

 public static void main(String[] args) throws IOException {
 //这里后面的true就是是否要append(追加)
        try(OutputStream outputStream=new FileOutputStream("D:/note/text/123.txt",true)){
            outputStream.write(97);
            outputStream.write(98);

        }
    }

2.字符流(以字符为单位,读写数据)处理文本文件

Reader

一次读取一个字符

//这个地址里面放的时“你好世界”
 public static void main(String[] args) throws IOException {
        try(Reader reader=new FileReader("D:/note/text/147.txt")){
            while (true){
                int n=reader.read();
                if (n==-1){
                    break;
                }
                char b=(char) n;
                System.out.println(b);
            }
        }
    }

一次读取1024个字符

 public static void main(String[] args) throws FileNotFoundException {
        try(Reader reader=new FileReader("D:/note/text/147.txt")){
            while (true){
                char[] a=new char[1024];
                int n=reader.read(a);
                if(n==-1){
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.println(a[i]);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

Writer
(一个字符对应几个字节取决于编码方式,jdk2个,utf8是3个)
一次写一个

public static void main(String[] args) {
        try(Writer writer=new FileWriter("D:/note/text/147.txt",true)) {
            writer.write("xxx");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } ;
    }

一次写多个

  public static void main(String[] args) throws IOException {
        try(Writer writer=new FileWriter("D:/note/text/147.txt",true)){
                char[] a=new char[1024];
            for (int i = 0; i < 4; i++) {
                a[i]='w';
            }
                writer.write(a);

        }
    }

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

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

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;三&#xff09;注册中心 Eureka&#xff08;2&#xff09; 段子手168 1、搭建 EurekaServer 注册中心&#xff0c;使用 Eureka 的步骤&#xff1a; 1&#xff09;搭建 EurekaServer 创建工程&#xff0c;导入依赖坐标&…

Python-VBA函数之旅-globals函数

目录 一、globals函数的常见应用场景&#xff1a; 二、globals函数与locals函数对比分析&#xff1a; 1、globals函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm101…

基于springboot+vue+Mysql的广场舞团管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

牛客小白月赛91

A.Bingbong的化学世界 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 &#x1f319;“上…

AndroidStudio右下角显示内存使用情况

目录 一.具体效果 二.4.0以下版本 三.4.0以上版本 四.增加内存配置 一.具体效果 二.4.0以下版本 1.打开 Android Studio. 2.进入设置界面。点击 Android Studio 左上角的“File”&#xff0c;然后选择“Settings” 3.在设置界面中&#xff0c;选择“Appearance & Beha…

关于图像YUV格式分类和排布方式的全学习

【学习笔记】关于图像YUV格式分类和排布方式的全学习_yuv图像-CSDN博客 下图是将多个yuv420p图像(A和B)&#xff0c;拼接成一个画面的思路 A大小:416*64 B大小:416*208 将A和B合并到一个416*416的尺寸上&#xff0c;代码如下 //整合char * ptd;ptd (char * ) malloc (416*41…

手把手教你实现 C 语言的函数多参默认值 「下」

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/ifnDcV7AKrh6eVihVK9l5A 本文上接《手把手教你实现 C 语言的函数多参默认值 上》&#xff0c;下文提及的一些概念来源于上文&#xff0c;为方便阅…

使用LLM-API开发应用-DataWhale笔记

调用API 先使用一个例子 from openai import OpenAI ​ client OpenAI(# This is the default and can be omittedapi_keyos.environ.get("OPENAI_API_KEY"), //这个在环境env中 ) ​ completion client.chat.completions.create(# 调用模型&#xff1a;ChatGPT-…

【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

为方便大家理解YOLO的原理&#xff0c;这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述&#xff0c;为后续大家学习YOLO作为铺垫。 1、模型所干的活 工作中&#xff0c;大家经常将 Word 文档 上传到某转换器&#xff0c;然后转换输出为PDF文档。目标检测中我…

单点登录实现:一次登录,到处运行

单点登录&#xff1a;一次登录&#xff0c;到处运行 举个场景&#xff0c;假设我们的系统被切割为N个部分&#xff1a;商城、论坛、直播、社交…… 如果用户每访问一个模块都要登录一次&#xff0c;那么用户将会疯掉&#xff0c; 为了优化用户体验&#xff0c;我们急需一套机制…

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

23-代码随想录第202题快乐数

202. 快乐数 简单 相关标签 相关企业 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈&#xff0c;马斯克点赞&#xff0c;英伟达高级科学家Jim Fan直言&#xff0c;Llama 3将成为AI大模型发展历程的“分水岭”&#xff0c;AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日&#xff0c;AI圈再迎重磅消息&a…

一例Mozi僵尸网络的挖矿蠕虫分析(workminer)

概述 这是一个Linux平台的挖矿蠕虫&#xff0c;使用了go和C混合编译而成&#xff0c;主要通过爆破SSH口令进行传播&#xff0c;属于Mozi僵尸网络。其中GO代码负责SSH相关的爆破传播&#xff0c;以及对Config的处理&#xff0c;C代码则负责处理加入Mozi P2P网络&#xff0c;拉取…

【游戏专区】贪吃蛇

1&#xff0c;游戏背景 贪吃蛇&#xff08;Snake&#xff09;是一款经典的电子游戏&#xff0c;最初在1976年由 Gremlin 公司开发。它的游戏背景相对简单&#xff0c;但具有高度的成瘾性。 1. **游戏场景**&#xff1a;通常在一个有界的矩形区域内进行&#xff0c;可以是一个…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…

【Gradio】Could not create share link

【Gradio】Could not create share link 写在最前面在服务器端一直运行一个Python脚本解决&#xff1a;下载frpc_linux_amd64文件&#xff0c;并添加权限原理 完整过程&#xff1a;先找gradio库位置&#xff0c;然后发现缺失文件1. 打开终端2. 使用 find 命令查找 gradio 目录3…
最新文章