【文件操作和IO】

文件操作和IO

  • 1.文件
  • 2. 硬盘上文件的目录结构
  • 3. 文件路径
  • 4. 文件重要分类:
  • 5. Java中操作文件
    • 5.1 Java对于文件操作的API
    • 5.2 Java中使用File类来进行文件操作
    • 5.3 File类属性
    • 5.4 构造方法
    • 5.5 方法:
  • 6. 文件内容的读写 -- 文件流(数据流)
    • 6.1 InputStream
    • 6.2 使用InputStream读文件
    • 6.3 使用OutputStream写文件
  • 7. Reader和Writer字符流
    • 7.1 Reader读文件
    • 7.2 Writer写文件
  • 8. 使用Scanner接收intputStream

1.文件

文件指的是 存储在硬盘上的文件。文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,这部分信息可以视为文件的元信息。

2. 硬盘上文件的目录结构

硬盘上文件的目录结构为树形结构

3. 文件路径

  1. 绝对路径:指的就是从树根节点出发(Windows是盘符)一层一层最终到达目标文件
  2. 相对路径:先指定一个 当前目录、工作目录、基准目录,从当前目录出发,找到目标文件。

4. 文件重要分类:

  • 文本文件 :是按照 文本/字符串 方式来理解文本内容(文件里面的二进制内容,都是表示的字符串),进一步可以认为二进制文件的内容都是合法的字符(如普通英文字母、使用ascii汉字、使用gbk/utf8)。
  • 二进制文件:这里的内容任何数据都可以(图片、音频、可执行程序、动态库都属于二进制文件.class也是二进制)。
  • 用记事本的方式来判定是文本文件还是二进制文件;使用记事本打开一个文件,如果看到的是正常内容,不是乱码,说明这是文本文件,乱码则是二进制文件

5. Java中操作文件

5.1 Java对于文件操作的API

  1. 针对文件系统的操作,创建文件、删除文件、重命名文件、列出目录内容等
  2. 针对文件内容的操作:读文件和写文件

5.2 Java中使用File类来进行文件操作

File类所在包 为java.io。这里的io即输入input和输入output,数据从硬盘到cpu为输入,反之则输出。

5.3 File类属性

  • static String(修饰符及类型) – pathSeparator :依赖于系统的路径分隔符,String类型的表示;
  • static char – pathSeparator :依赖于系统的路径分隔符,char类型

5.4 构造方法

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

5.5 方法:

  • 获取路径、文件名、绝对路径
    如下代码:
// File 常见的方法
import java.io.File;
import java.io.IOException;

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        //File f = new File("E:/user/1/test.txt");
        File f = new File("./test.txt");
        // 返回 File 对象的父目录文件路径
        System.out.println(f.getParent());
        // 返回 FIle 对象的纯文件名称
        System.out.println(f.getName());
        //返回 File 对象的文件路径
        System.out.println(f.getPath());
        // 返回 File 对象的绝对路径
        System.out.println(f.getAbsolutePath());
        //返回 File 对象的修饰过的绝对路径
        System.out.println(f.getCanonicalPath());
    }
}
  • 创建文件、查看文件是否存在、是否是文件、是否是目录
import java.io.File;
import java.io.IOException;

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        File f = new File("./test.txt");
        System.out.println(f.exists());
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());

        // 创建文件,创建完之后不会重复创建,
        boolean ret = f.createNewFile();
        System.out.println("ret = "+ret);
    }
}

  • 删除文件
import java.io.File;

public class IODemo3 {
    public static void main(String[] args) throws InterruptedException {
        File file = new File("./test.txt");
        // 删除文件
        //boolean ret = file.delete();
        //System.out.println(ret);

        // 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行
        file.deleteOnExit();
        Thread.sleep(5000);
    }
}
  • 获取目录下所有文件名
import java.io.File;
import java.util.Arrays;

public class IODemo4 {
    public static void main(String[] args) {
        File file = new File(".");
        // 返回File对象代表的目录下的所有文件名
        //String[] files = file.list();

        // 返回File对象代表的目录下的所有文件,以File对象表示
        File[] files = file.listFiles();
        //System.out.println(files);  // 打印的是哈希值,不是地址
        System.out.println(Arrays.toString(files));
    }
}
  • 创建目录(多层目录)
import java.io.File;

public class IODemo5 {
    public static void main(String[] args) {
        File file = new File("./aaa/bbb/ccc");
        // 创建单个目录
        //boolean ret = file.mkdir();

        boolean ret = file.mkdirs();
        System.out.println(ret);
    }
}
  • 重命名
import java.io.File;

public class IODemo6 {
    public static void main(String[] args) {
        File src = new File("./test2.txt");
        File dest = new File("./aaa/test2.txt");
        // 重命名 还可以移动文件
        System.out.println(src.renameTo(dest));
    }
}

6. 文件内容的读写 – 文件流(数据流)

  • 字节流:每次读写的最小单位就是一个字符。 InputStream和OutputStream
  • 字符流:每次读写的最小单位是一个字符(一个字符可能由多个字节构成)。字符流可以内部处理字符编码。Reader 和 Writer。

6.1 InputStream

由于inputStream 是抽象类,不能实例化。所以new的是一个 FileInputStream。
在这里插入图片描述
在这里插入图片描述

inputStream 是抽象类,不能实例化。有些类我们不希望它能够创建出实例的,使用abstract来描述,编译器就可以进行更严格的检查(如单例模式,数据库约束)所谓 面向对象 就是通过代码抽象的表示实际事物的一种方式

  • read()方法:返回类型为int,读取一个字节的数据,返回-1代表读完了。

  • read(byte[] b) :最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表已经读完了

  • read(byte[] b,int off, int len):最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
    read的参数版本,传入的字节数参数,是一个输出型参数,byte[]是引用类型,方法内部针对数组内容进行修改,方法执行结束之后,方法外部也能生效

  • close() :返回类型为void,关闭字节流。

使用try() 代码块会自动调用inputStream的close方法

public class IODemo7 {
    public static void main(String[] args) throws IOException { // FileNotFoundException也是一种特殊的IOException
        /*InputStream inputStream = null;
        try {
            // 打开文件
            inputStream = new FileInputStream("./test.txt");

            // 中间还有很多逻辑,所有得使用try finally,最后执行inputStream.close()以免没执行
        } finally {
            // 关闭文件
            inputStream.close();
        }*/

        // 使用try模块 ,此时try自动调用inputStream得close,但前提得FileInputStream实现了Closeable接口得类,才能放到try()里面
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            // 读取文件,也不知道文件有多少个字节,使用while来完成
            while (true) {
                /*int b = inputStream.read();
                if (b == -1) {
                    // 读到文件末尾为-1,文件读取完毕
                    break;
                }
                //打印这个字节的数据 文件内容是abcde 以16进制打印它的ASCII码
                // 如果内容是中文,此时打印出的就是每个字节,就是对应到utf8编码的值
                System.out.printf("%x ", b);*/

                //
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x ",buffer[i]);
                }
            }
        }
    }
}

6.2 使用InputStream读文件

读文件:就是把硬盘数据读取到内存中。

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

public class IODemo8 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if (n == -1) {
                    break;
                }
                String s = new String(buffer,0,n);
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

6.3 使用OutputStream写文件

在FileOutputStream()添加true参数,是在源文件里的内容进行追加

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class IODemo9 {
    public static void main(String[] args) {
        // append参数是追加
        try (OutputStream outputStream = new FileOutputStream("./test.txt",true)) {
        //此处写入的是二进制,
            byte[] buffer = new byte[] {97,98,99,100,101};
            outputStream.write(buffer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

7. Reader和Writer字符流

使用方式和InputStream、OutputStream差不多。

7.1 Reader读文件

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class IODemo10 {
    public static void main(String[] args) {
        // 使用字符流读取文件内容
        try (Reader reader = new FileReader("./test.txt")) {
            // 读取文件
            while (true) {
                char[] buffer = new char[1024];
                int n = reader.read(buffer);
                if (n == -1) {
                    break;
                }
                String s = new String(buffer,0,n);
                System.out.println(s);
                /*for (int i = 0;i < n;i++) {
                    System.out.print(buffer[i]);
                    System.out.println(" ");
                }*/
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

7.2 Writer写文件

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class IODemo11 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("./test.txt",true)) {
            String str = "你好帅哥";
            writer.write(str);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

8. 使用Scanner接收intputStream

Scanner(System.in)本质就是一个inputStream

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class IODemo12 {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNext()) {
                String s = scanner.next();
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

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

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

相关文章

C++ List底层实现

文章目录 前言成员变量成员函数迭代器self& operator()前置self operator(int)后置self operator--()前置--self operator--(int)后置--bool operator!(const self & tmp)判断是否相等T* operator*() 解引用操作 list()初始化iterator begin()iterator end()const_iter…

视频无水印批量下载软件|抖音视频提取工具

视频无水印批量下载软件 在当今社交媒体充斥着大量优质视频内容的时代&#xff0c;很多用户都希望能够轻松下载自己喜爱的视频进行收藏或分享。为了满足用户的需求&#xff0c;我们特别推出了一款专业的视频无水印批量下载软件&#xff0c;让您可以方便快捷地获取喜爱的视频内容…

鸿蒙Harmony应用开发—ArkTS-转场动画(共享元素转场)

当路由进行切换时&#xff0c;可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 属性 名称参数参数描述…

springboot企业级抽奖项目业务二(用户模块)

书接上回&#xff0c;梅开二度 开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口…

练习 9 Web [SUCTF 2019]CheckIn (未拿到flag)

上传图片格式的木马文件&#xff1a; 返回 <? in contents!,存在PHP代码检测 上传非图片格式文件&#xff1a; 返回 不允许非image 修改木马PHP代码规避检测 <? ?> 改为 < script language“php”>< /script ><?php eval($_POST[shell]);?>…

鸿蒙实战开发:【相机和媒体库】

介绍 在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。本示例用到了 权限管理能力相机模块能力接口图片处理接口音视频相关媒体业务能力接口媒体库管理接口设备信息能力接口文件存储管理能力接口弹窗能力接口 效果预览 首…

virtualBox镜像复制

镜像复制 有一个镜像后&#xff0c;图方便&#xff0c;想直接使用这个vdi文件&#xff0c;但vdi有个uuid值&#xff0c;同一个虚拟机中不能同时存在两个同样的uuid的介质的&#xff0c;普通的复制文件所得到的uuid是一样的 &#xff0c;所以需要用到自带的方法复制vdi文件&…

SpringCloud中的@EnableDiscoceryClient和@EnableFeignClients注解的作用解析、RPC远程过程调用

目录 EnableDiscoveryClient 服务发现的核心概念 服务注册中心 EnableDiscoveryClient注解的作用 服务心跳健康检查 使用示例 EnableFeignClients Feign简介 EnableFeignClients注解的作用 RPC&#xff08;Remote Procedure Call&#xff09; 参考链接 Spring Cloud…

Cache缓存:HTTP缓存策略解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…

Gateway新一代网关

Gateway新一代网关 1、概述 ​ Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff1b; ​ 但在2.x版本中&#xff0c;zuul的升级一直跳票&#xff0c;SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul。 ​ 官网&…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc&#xff08;HarmonyOS Device Connector&#xff09;是 HarmonyOS 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取&#xff0c;存放于 /Huawei/Sdk/openhar…

责任链模式(处理逻辑解耦)

前言 使用设计模式的主要目的之一就是解耦&#xff0c;让程序易于维护和更好扩展。 责任链则是将处理逻辑进行解耦&#xff0c;将独立的处理逻辑抽取到不同的处理者中&#xff0c;每个处理者都能够单独修改而不影响其他处理者。 使用时&#xff0c;依次调用链上的处理者处理…

RK3399 android10 移植SiS-USB触摸驱动

一&#xff0c;SiS USB触摸简介 SiS USB 触摸屏通常是一种外接式触摸屏设备&#xff0c;通过 USB 接口连接到计算机或其他设备上。这种触摸屏设备可以提供触摸输入功能&#xff0c;用户可以通过手指或触控笔在屏幕上进行操作&#xff0c;实现点击、拖动、缩放等操作。 SiS USB…

双向链表增删改查、遍历、倒置、销毁等——数据结构——day3

首先&#xff0c;我先把我的头节点写出来&#xff0c;里面有整理好的结构体 #ifndef __DOULINK_H__ #define __DOULINK_H__#include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct student {int id;char name[50];int score; }DATA_TYPE; …

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

负数,小数转换二进制

负数转换二进制 例&#xff1a;在带符号整数signed char的情况下&#xff0c;-57如何被表示成负数呢&#xff1f;在计算机中又是如何计算66-57呢&#xff1f; 解析 考虑int占有32位太长&#xff0c;因此使用只占8位的signed char类型来举例。57用二进制表示位00111001&#…

28-5 文件上传漏洞 - 图片马

一、文件内容检测 解析漏洞定义 控制文件是否被当做后端脚本处理 二、图片马绕过 图片马;在图片中包含一句话木马。利用解析漏洞如.htaccess 或文件包含漏洞,对图片马进行解析,执行其中的恶意代码。优势在于可以绕过多种防护机制。 三、图片马制作方法: # 一句话马示例…

nRF Sniffer在wireshark下的环境搭建

一、准备 nRF Sinffer 安装包&#xff1a; 直接下载&#xff1a;https://nsscprodmedia.blob.core.windows.net/prod/software-and-other-downloads/desktop-software/nrf-sniffer/sw/nrf_sniffer_for_bluetooth_le_4.1.1.zip 官网下载&#xff1a; nRF Sniffer for Bluetooth…

Elasticsearch - Docker安装Elasticsearch8.12.2

前言 最近在学习 ES&#xff0c;所以需要在服务器上装一个单节点的 ES 服务器环境&#xff1a;centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2创建配置 新增配置文件 elasticsearch.yml http.host…