(Java学习)File类与IO流

File类与IO流

文章目录

  • File类与IO流
    • 1. File类
      • 1.1 File类理解
      • 1.2 构造器
      • 1.3 常用方法
      • 1.4 练习
    • 2. IO流概述
      • 2.1 IO流理解
      • 2.2 流的分类
      • 2.3 基础IO流的框架
    • 3. FileReader/FileWriter
      • 3.1 执行步骤
      • 3.2 注意
    • 4. FileInputStream / FileOutputStream
    • 5. 缓冲流
    • 6. 转换流的使用
    • 7. 对象流的使用
    • 8. 其它流

1. File类

1.1 File类理解

  • File类位于java.io包下
  • File类对象,对应操作系统下一个文件或一个文件夹(目录)
  • 文件内容的读写——使用IO流

1.2 构造器

package file.fileTest;

import org.junit.Test;
import java.io.File;

public class FileTest {

    @Test
    public void test1(){
        //1. public File(String pathname)
        File file1 = new File("E:\\Java\\JavaU\\JavaSE\\src\\file\\file_exer\\hello.txt");
        File file2 = new File("abc");
        System.out.println(file2.getAbsolutePath());
    }

    @Test
    public void test2(){
        //2. public File(String parent, String child)
        //参数一:一定是一个文件目录
        //参数二:可以是文件目录,可以是文件
        File file1 = new File("E:\\Java\\JavaU\\JavaSE\\src\\file\\file_exer","abc_txt");
        File file2 = new File("abc","abc0");

        //3. public File(File parent, String child)
        //参数一:一定是一个文件目录
        //参数二:可以是文件目录,可以是文件
        File file3 = new File(file2,"abc1");
    }
}

1.3 常用方法

  • 列出目录的下一级

    	//列出目录的下一级	
    	@Test
        public void test1(){
            File file = new File("E:\\Java_learning\\JavaSE");
            
            //String[] list()返回的是相对路径
            String[] list = file.list();
            for(String s : list){
                System.out.print(s+" ");
            }
    
            System.out.println();
    
            //File[] listFiles()返回的是绝对路径
            File[] files = file.listFiles();
            for(File f : files){
                System.out.println(f);
            }
        }
    
  • File类重命名

    public boolean renameTo(File dest)
    -- file1.renameTo(file2):file1必须存在,file2必须不存在,且file2所在文件目录需存在
    
  • 判断功能方法

    -- public boolean exists():File表示的文件或目录是否实际存在
    -- public boolean isDirectory():File表示的是否是目录
    -- public boolean isFile():File表示的是否是文件
    -- public boolean canRead()
    -- public boolean canWriter()
    -- public boolean isHidden()
    
  • 创建、删除功能

    -- public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
    -- public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建。如果此文件的上层目录不存在,也不创建
    -- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
    -- public boolean delete():删除文件或文件夹
    
    • 删除注意:(1)Java中删除不走回收站 (2)要删除一个文件目录,该文件目录里不能包含文件或文件目录

1.4 练习

  • 判断指定目录下是否有后缀名为.jpg的文件,如果有,输出该文件名称

    import org.junit.Test;
    import java.io.File;
    
    public class Pra2 {
        @Test
        public void test(){
            File file = new File("C:\\Users\\cmf\\Pictures");
    
            String[] list = file.list();
            for(String s : list){
                if(s.endsWith(".jpg")){  //endsWith(String s)判断后缀
                    System.out.println(s);
                }
            }
        }
    }
    
  • 遍历指定目录下的所有文件的名称,包括子文件目录中的文件

    //遍历指定目录下的所有文件的名称,包括子文件目录中的文件
        public void printFileName(File file){
            if(file.isFile()){ //如果是一个文件
                System.out.println(file.getName());//打印文件本身的名字
            }else if(file.isDirectory()){ //如果是目录
                File[] files = file.listFiles();
                for(File f : files){ //遍历每个文件或目录
                    printFileName(f); //进行递归,判断接下来的文件或目录
                }
            }
        }
    
  • 删除指定目录及其下所有文件

    // 删除指定目录及其下所有文件
        public void deleteDirectory(File file){
            //如果file是文件减,直接delete
            //如果file是目录,先把它的下一级删除,再删除自己
            if(file.isDirectory()){
                File[] files = file.listFiles();
                //循环删除file的下一级
                for(File f : files){
                    deleteDirectory(f);
                }
            }
            //删除自己
            file.delete();
        }
    

2. IO流概述

2.1 IO流理解

  • 输入input:读取外部数据到程序(内存)中
  • 输出output:将程序(内存)输出到磁盘、光盘等存储设备中

2.2 流的分类

  • 流向不同
    • 输入流:InputStream、Reader
    • 输出流:OutputStream、Writer
  • 数据单位不同
    • 字节流:InputStream、OutputStream
    • 字符流:Reader、Writer
  • 角色不同
    • 节点流:直接连接到数据源或目的地
    • 处理流

2.3 基础IO流的框架

抽象基类4个节点流(文件流)
InputStreamFileInputStream
OutputStreamFileOutputStream
ReaderFileReader
WriterFileWriter

3. FileReader/FileWriter

3.1 执行步骤

  • 1)创建读取或写出的File类对象
  • 2)创建输入流或输出流
  • 3)具体的读入或写出过程
    • 读入:read(char[] cbuffer)
    • 写出:writer(String str) / writer(char[] cbuffer, 0, len)
  • 4)关闭流资源,避免内存泄漏
import org.junit.Test;
import java.io.*;

public class FrfwTest {
    /* 读取hello.txt文件中内容,并输出
    * */
    @Test
    public void test1() {
        FileReader fr = null;
        try {
            //1.创建File类的对象,对应着hello.txt文件
            File file = new File("hello.txt");

            //2.创建输入的字符流,用于读取数据
            fr = new FileReader(file);

            //3.读取数据,并显示在控制台上
            char[] cbuffer = new char[5];
            int len;
            while((len = fr.read(cbuffer))!= -1){
                //遍历数组
                for(int i = 0; i < len; i++){
                    System.out.print(cbuffer[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            //4.流资源关闭(必须关闭,否则会内存泄漏)
            try {
                if(fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /* 将内存中的数据写到指定文件中
    * */
    @Test
    public void test2() {
        FileWriter fw = null;
        try {
            //1.创建File类对象,指明要写出的文件名称
            File file = new File("info.txt");

            //2.创建输出流
            //覆盖文件使用
            fw = new FileWriter(file);
            //fw = new FileWriter(file,false);

            //在现有文件基础上,末尾追加
            //fw = new FileWriter(file,true);

            //3.写出具体过程
            fw.write("I am happy!\n");
            System.out.println("输出成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //4.关闭输出流
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

3.2 注意

  • 涉及到流资源关闭操作,出现异常要使用thry-catch-finally方式处理

  • 对于输入流,File类对象对应的物理磁盘上文件必须存在

    对于输出流,File类对象对应的物理磁盘上文件可以不存在

    ​ > 不存在时,在输出过程中,会自动创建此文件

    ​ > 存在时,FileWriter(File file) 或 FileWriter(File file, false):会对现有文件进行覆盖

    ​ FileWriter(File file, true):在现有文件基础上,末尾追加

4. FileInputStream / FileOutputStream

  • 复制一份 sky.jpg 到 sky_copy.jpg

    import org.junit.Test;
    import java.io.*;
    
    public class FileStreamTest {
        //复制一份sky.jpg到sky_copy.jpg
        @Test
        public void test1(){
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                // 1. 创建File类对象
                File src = new File("sky.jpg");
                File dest = new File("sky_copy.jpg");
    
                // 2. 创建相关字节流
                fis = new FileInputStream(src);
                fos = new FileOutputStream(dest);
    
                // 3. 具体读入和写出操作
                byte[] b = new byte[1024];
                int len;
                while((len = fis.read(b)) != -1){
                    for(int i = 0; i < len; i++){
                        fos.write(buffer, 0, len);
                    }
                }
                System.out.println("复制成功!");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 4. 关闭流资源
                try {
                    fos.close();
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    
  • 注意:

    • 字符流:用于处理文本文件,不能处理非文本文件

    • 字节流:主要用于处理文本文件,如果涉及文本文件复制操作,可以使用字节流

    • 文本文件(末尾不能自动换行,只会一直写下去):.txt .java .c .cpp .py

      非文本文件:.doc .xls .jpg .mp3 .mp4 .avi等

5. 缓冲流

  • 缓冲流是处理流中的一种

  • 作用:提升文件读取效率(通过减少与磁盘的交互

  • 处理非文本文件的字节流:

    使用的字节流使用方法
    BufferedInputStreamread(byte[ ] buffer)
    BufferedOutputStreamwrite(byte[ ] buffer, 0, len)

    处理文本文件的字符流:

    使用的字符流使用方法
    BufferedReaderread(char[ ] cBuffer) / readLine( )
    BufferedWriterwrite(char[ ] cBuffer, 0, len)
  • 实现步骤

    • 1)创建File的对象、流的对象(包括文件流、缓冲流)
    • 2)使用缓冲流实现读取数据 或 写出数据的过程
    • 3)关闭资源
  • 注意

    • readLine( ):每次读取一行文本数据,返回的字符串不包含换行符
    • flush( ):刷新方法,每当调用此方法时,就会主动将内存中数据写到磁盘文件中

6. 转换流的使用

  • 要想读取时不出现乱码:解码时使用的字符集与编码时使用的字符集相同

  • 作用:实现字节与字符之间的转换

  • API

    InputStreamReader: 将一个输入型的字节流转换为输入型的字符流
    OutputStreamWriter: 将一个输出型的字符流转换为输出型的字节流
    

    解码:字节 ——》字符 编码:字符 ——》字节

  • 1)存储在文件中的字符

    ascii:主要用来存储a、b、c等英文字符和1、2、3、常用标点符号。每个字符占1个字节
    iso-8859-1:每个字符占1个字节。向下兼容ascii
    gbk:用来存储中文简体繁体、a、b、c等英文字符和1、2、3、常用标点符号等字符
    	中文字符使用2个字节存储。向下兼容ascii,意味着英文字符、1、2、3、常用标点符号仍使用1个字节
    utf-8:可以用来存储世界范围内主要语言的所有字符。使用1-4个不等的字节表示一个字符。
    	中文字符使用3个字节存储。向下兼容ascii.
    

    2)在内存中的字符:

    一个字符(char)占用2个字节。在内存中使用的字符集称为Unicode字符集
    

7. 对象流的使用

  • 数据流

    DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写到具体的文件中
    DataInputStream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量对象流
    
  • 对象流

    • API

      ObjectOutputStream
      ObjectInputStream
      
    • 作用:可读写基本数据类型应用数据类型

    • 对象的序列化机制

      指允许把内存中的Java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上或通过网络将这种二进制流传输到另一个网络节点。

      ​ —> 当其他程序获取了这种二进制流,就可以恢复成原来的 Java 对象。

    • 序列化过程(写出):ObjectOutputStream —— 把内存中的Java对象保存在文件或通过网络传播出去

      反序列化过程(读):ObjectInputStream ——将文件中的数据或网络传输来的数据还原为内存中的Java 对象

    import java.io.*;
    
    public class ObjectStreamTest {
    
        /* **序列化过程**(写出):ObjectOutputStream
        —— 把内存中的Java对象保存在文件或通过网络传播出去
        * */
        @Test
        public void test1() throws IOException {
            //1. 创建对象
            File file = new File("object.txt");//把内存中的Java对象保存在的文件名
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
    
            //2. 写出数据
            oos.writeUTF("我爱中国!");
            oos.flush();
    
            //3. 关闭资源
            oos.close();
        }
    
        /* **反序列化过程**(读):ObjectInputStream
        ——将文件中的数据或网络传输来的数据==还原==为内存中的==Java 对象==
        *
        * */
    
        @Test
        public void test2() throws IOException {
            File file = new File("object.txt");
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
    
            System.out.println(ois.readUTF());
    
            ois.close();
        }
    }
    
  • 自定义类要想实现序列化机制,需要满足:

    • 自定义类需要实现接口:Serializable(表示接口)

    • 要求自定义声明一个全局常量:static final long serialVersionUID = 42L;

      —> 如果不声明全局常量serialVersionUID,系统会自动生成一个针对当前类的serialVersionUID。如果修改当前的自定义类,会导致serialVersionUID发生改变,进而导致反序列化时,出现InvailedClassException异常

    • 要求自定义类的各个属性都是可序列化

      • 基本数据类型:本身就是可序列化的
      • 引用数据类型:也需要实现序列化机制
    • 注意:

      • 类中的属性如果声明为transientstatic,则不会实现序列化

8. 其它流

  • 标准输入流、输出流

    • System.in:标准输入流
    • System.out:标准输出流
  • 打印流

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

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

相关文章

初识C++之命名空间(namespace)

初识C之入门 命名空间(namespace) 文章目录 初识C之入门 命名空间(namespace)1.为什么要有命名空间2. 命名空间 namespace使用方法3. 作用域限定符(::&#xff09;和 命名空间(namespace)4. 命名空间的定义5. 命名空间的嵌套6. 命名空间的使用7. 总结 1.为什么要有命名空间 在C…

FLStudio多少钱FL Studio中文版软件序列号-激活码购买

fl studio是一款编曲软件&#xff0c;接触这款软件的大多都是做音乐的小伙伴吧&#xff0c;对于初学者想了解这款软件在意的应该就是它的价格。很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#xff1a;哪个版本的FL Studio更适合我&#xff0c;到底应该入手哪一款FL …

HarmonyOS 应用开发之显式Want与隐式Want匹配规则

在启动目标应用组件时&#xff0c;会通过显式 Want 或者隐式 Want 进行目标应用组件的匹配&#xff0c;这里说的匹配规则就是调用方传入的 want 参数中设置的参数如何与目标应用组件声明的配置文件进行匹配。 显式Want匹配原理 显式 Want 匹配原理如下表所示。 名称类型匹配…

C++基础之虚函数(十七)

一.什么是多态 多态是在有继承关系的类中&#xff0c;调用同一个指令&#xff08;函数&#xff09;&#xff0c;不同对象会有不同行为。 二.什么是虚函数 概念&#xff1a;首先虚函数是存在于类的成员函数中&#xff0c;通过virtual关键字修饰的成员函数叫虚函数。 性质&am…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中&#xff0c;多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁&#xff0c;它是由多种水果榨取…

452. 用最少数量的箭引爆气球(力扣LeetCode)

文章目录 452. 用最少数量的箭引爆气球贪心算法代码 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确…

花了100块大洋搞懂 ipv6的用户如何访问ipv4 服务器

大家好&#xff0c;今天蓝胖子花了100多块搞懂了 ipv6的用户如何访问ipv4 服务器&#xff0c;将收获与大家分享下。 ipv4和ipv6的协议栈不同&#xff0c;这意味着&#xff0c;其对应的ip包的封装和解析不同&#xff0c;那么只支持ipv4的机器就无法直接与ipv6的服务器进行通信。…

kubernetes K8s的监控系统Prometheus安装使用(一)

简单介绍 Prometheus 是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做…

网络服务练习题

综合练习&#xff1a;请给 openlab 搭建 web 网站 网站需求&#xff1a; 1. 基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2. 给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c; www.openlab.c…

【Linux 驱动基础】Linux platform平台设备驱动

# 前置知识 总线驱动模型简介&#xff1a; 总线是处理器与一个或者多个设备之间的通道&#xff0c;在设备模型中&#xff0c;所有的设备都是通过总线相连&#xff0c;当然也包括虚拟的 platform 平台总线。 总线驱动模型中有三要素&#xff1a; 1. 总线 /*** struct bus_ty…

C语言书籍——B/陷阱之处(2)

文章参考于文献&#xff1a;《C陷阱与缺陷》[美]Andrew Koening &#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只…

Obsidian插件-高亮块(Admonition)

在插件市场里面搜索Admonition并安装插件&#xff0c;就可以使用高亮块了。 添加高亮块 用法稍微有一些不同。按照下面的格式&#xff0c;输入Markdown就可以创建一个高亮块。 内容内容内容输入*ad-*会出现相应的类型可以选择

Dubbo管理控制台

1.将资料中的dubbo-admin-2.6.0.war文件复制到tomcat的webapps目录下 2.启动tomcat,修改WEB-INF下的dubbo.properties文件 #如果Zookeeper是安装在虚拟机上的那么注册中心的地址需要修改为虚拟机的ip地址 dubbo.registry.addresszookeeper://192.168.100.110:2181 dubbo.admin…

对象存储服务MinIO快速入门

对象存储服务MinIO快速入门 MinIO简介开箱使用快速入门封装MinIO为starter1 创建模块heima-file-starter2 配置类3 封装操作minIO类4 对外加入自动配置5 其他微服务使用 MinIO简介 官网文档 开箱使用 docker run -p 9000:9000 --name minio -d --restartalways -e "MINIO…

ocr之opencv配合paddleocr提高识别率

背景1&#xff1a;在这篇文章编写之前使用到的工具并不是opencv&#xff0c;而是java原有的工具BufferedImage。但因为在使用过程中会频繁切图&#xff0c;放大&#xff0c;模糊&#xff0c;所以导致的jvm内存使用量巨大&#xff0c;分秒中都在以百兆的速度累加内存空间。这种情…

WIFI驱动移植实验: openssl库的移植(wpa_supplicant 依赖库)

一. 简介 前面实现了WIFI驱动的移植&#xff0c;而连接某个WIFI热点上就需要用到 wpa_supplicant 工具&#xff0c;所以&#xff0c;本文开始为 移植 wpa_supplicant 工具做准备。 wpa_supplicant 依赖于 openssl库 与 libnl库&#xff0c;因此&#xff0c;需要移植一下open…

鸿蒙hdc使用指导

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

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

VBA技术资料MF134:单值匹配查找

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【消息队列开发】 实现 MqClientTests 类——测试客户端

文章目录 &#x1f343;前言&#x1f333;所需属性&#x1f334;BeforeEach&#x1f332;AfterEach&#x1f38d;API测试⭕总结 &#x1f343;前言 本次开发任务 测试客户端接口 &#x1f333;所需属性 所需要一共三个属性 BrokerServer&#xff1a;服务器 ConnectionFa…