文件操作与IO流

文章目录

    • File文件操作类
    • IO流原理及流的分类
      • 节点流
        • FileInputStream
        • FileOutputStream
        • FileReader
        • FileWriter
      • 处理流
        • BufferedReader
        • BufferedWriter
        • BufferedInputStream
        • BufferedOutputStream
        • ObjectInputStream
        • ObjectOutputStream
        • PrintStream
        • PrintWriter
      • 标准输入输出流
    • Properties 类

File文件操作类

Java中的File类是用来操作文件和目录的类,它提供了一系列方法来创建、删除、重命名、判断文件是否存在等操作。

//先创建文件对象
File file = new File("e:\\news1.txt");

//调用相应的方法,得到对应信息
System.out.println("文件名字=" + file.getName());
//getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory
System.out.println("文件绝对路径=" + file.getAbsolutePath());
System.out.println("文件父级目录=" + file.getParent());
System.out.println("文件大小(字节)=" + file.length());
System.out.println("文件是否存在=" + file.exists());//T
System.out.println("是不是一个文件=" + file.isFile());//T
System.out.println("是不是一个目录=" + file.isDirectory());//F

IO流原理及流的分类

Java中的IO流是用来处理输入输出的机制。它允许程序通过流的方式读取和写入数据。

流是一种数据传输的方式,数据在程序和外部设备之间通过流进行传输。

流可以分为输入流和输出流,输入流用于从外部设备读取数据,输出流用于向外部设备写入数据。

IO流按传输数据类型不同可分为字节流和字符流两种类型。字节流以字节为单位进行数据传输,适用于处理二进制数据,如图片、音频等。字符流以字符为单位进行数据传输,适用于处理文本数据。

IO流按是否封装可以分为节点流和处理流(封装流)。

节点流是直接与数据源或目标进行连接的流,它们是最基本的流类型。节点流可以从文件、内存、网络等数据源读取数据,或将数据写入文件、内存、网络等目标。常见的节点流包括FileInputStream、FileOutputStream、FileReader、FileWriter等。

处理流是对节点流的包装,通过对节点流进行包装,处理流可以提供更高级的功能。处理流本身不具备读写数据的能力,它们通过包装节点流来实现数据的读写操作。处理流可以进行数据的过滤、转换、缓冲等操作,使得数据的处理更加方便和高效。常见的处理流包括BufferedInputStream、BufferedOutputStream、ObjectInputStream、ObjectOutputStream等。

请添加图片描述

请添加图片描述

节点流

FileInputStream

FileInputStream是用于读取文件的字节流类。它继承自InputStream抽象类,可以用于从文件中读取字节数据。

读取字节数据方式一:

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("file.txt"); // 创建FileInputStream对象,指定要读取的文件名
            int data;
            while ((data = fis.read()) != -1) { // 读取文件中的一个字节数据,直到文件末尾
                System.out.print((char) data); // 将字节数据转换为字符并输出
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close(); // 关闭流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

读取字节数据方式二:

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("file.txt"); // 创建FileInputStream对象,指定要读取的文件名
            byte[] buffer = new byte[1024]; // 创建一个字节数组作为缓冲区
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) { // 读取文件中的字节数据到缓冲区
                for (int i = 0; i < bytesRead; i++) {
                    System.out.print((char) buffer[i]); // 将字节数据转换为字符并输出
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close(); // 关闭流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
FileOutputStream

FileOutputStream是用于写入文件的字节流类。它继承自OutputStream抽象类,可以用于向文件中写入字节数据。

写入字节数据:

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("file.txt"); // 创建FileOutputStream对象,指定要写入的文件名
            String data = "Hello, World!"; // 要写入的数据
            byte[] bytes = data.getBytes(); // 将字符串转换为字节数组
            fos.write(bytes); // 将字节数组写入文件
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close(); // 关闭流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
FileReader

读取字符数据:

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

public class FileReaderExample {
    public static void main(String[] args) {
        FileReader fr = null;
        try {
            fr = new FileReader("input.txt"); // 创建FileReader对象,指定要读取的文件名
            int data;
            while ((data = fr.read()) != -1) { // 从文件中读取字符数据,直到文件末尾
                System.out.print((char) data); // 将字符数据转换为字符并输出
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fr != null) {
                    fr.close(); // 关闭读取流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
FileWriter

写入字符数据:

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

public class FileWriterExample {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("output.txt"); // 创建FileWriter对象,指定要写入的文件名
            String data = "Hello, World!"; // 要写入的数据
            fw.write(data); // 将字符串写入文件
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fw != null) {
                    fw.close(); // 关闭写入流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

处理流

BufferedReader

当需要从字符输入流中读取数据时,BufferedReader提供了更高效的读取方式。它通过缓冲字符来减少对底层输入流的访问次数,从而提高读取数据的效率。

示例代码:

try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close(); //只需要关闭BufferedReader,底层流会自动关闭
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
BufferedWriter

当需要向字符输出流中写入数据时,BufferedWriter提供了更高效的写入方式。它通过缓冲字符来减少对底层输出流的访问次数,从而提高写入数据的效率。

示例代码:

try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
    writer.write("Hello, World!");
    writer.newLine();
    writer.write("This is a test.");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (writer != null) {
        try {
            writer.close(); //只需要关闭BufferedWriter,底层流会自动关闭
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
BufferedInputStream

当需要从字节输入流中读取数据时,BufferedInputStream提供了更高效的读取方式。它通过缓冲字节来减少对底层输入流的访问次数,从而提高读取数据的效率。

示例代码:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamExample {
    public static void main(String[] args) {
        try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("input.txt"))) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                // 处理读取到的字节数据
                String data = new String(buffer, 0, bytesRead);
                System.out.print(data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在try-with-resources语句块中,我们使用了BufferedInputStream对象,这样在代码块执行完毕后,会自动调用BufferedInputStream的close()方法来关闭它,释放底层资源。

BufferedOutputStream

BufferedOutputStream是Java中的处理流,用于将字节数据写入到输出流中,并提供了缓冲功能,以提高写入数据的效率。

示例代码:

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamExample {
    public static void main(String[] args) {
        try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
            String data = "Hello, World!";
            byte[] bytes = data.getBytes();
            outputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
ObjectInputStream

ObjectInputStream用于从输入流中读取对象数据,并进行反序列化。

示例代码:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamExample {
    public static void main(String[] args) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("data.obj"))) {
            Object obj = inputStream.readObject();
            // 处理读取到的对象数据
            System.out.println(obj);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
ObjectOutputStream

ObjectOutputStream用于将对象数据写入输出流中,并进行序列化。

示例代码:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamExample {
    public static void main(String[] args) {
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("data.obj"))) {
            Object obj = new MyClass(); // 假设MyClass实现了Serializable接口,是一个可序列化的类
            outputStream.writeObject(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
PrintStream

PrintStream是用于打印数据的输出流类。它是OutputStream的子类,提供了一系列用于打印各种数据类型的方法。

示例代码:

import java.io.PrintStream;

public class PrintStreamExample {
    public static void main(String[] args) {
        // 创建PrintStream对象,将数据打印到控制台
        PrintStream ps = System.out;

        // 打印字符串
        ps.println("Hello World!");

        // 打印整数
        int num = 10;
        ps.println("The number is: " + num);

        // 打印浮点数
        double pi = 3.14159;
        ps.printf("The value of pi is: %.2f%n", pi);

        // 打印布尔值
        boolean flag = true;
        ps.println("The value of flag is: " + flag);

        // 关闭PrintStream对象
        ps.close();
    }
}

PrintWriter

PrintWriter是用于打印数据的输出流类。它是Writer的子类,提供了一系列用于打印各种数据类型的方法。

与PrintStream不同,PrintWriter是面向字符的输出流,可以将字符数据打印到文件、网络或其他字符输出目标。它提供了一些便捷的方法来打印各种数据类型,同时还支持自动刷新缓冲区和自动关闭。

示例代码:

import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;

public class PrintWriterExample {
    public static void main(String[] args) {
        try {
            // 创建PrintWriter对象,将数据打印到文件
            PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));

            // 打印字符串
            pw.println("Hello World!");

            // 打印整数
            int num = 10;
            pw.println("The number is: " + num);

            // 打印浮点数
            double pi = 3.14159;
            pw.printf("The value of pi is: %.2f%n", pi);

            // 打印布尔值
            boolean flag = true;
            pw.println("The value of flag is: " + flag);

            // 关闭PrintWriter对象
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

标准输入输出流

标准输入输出流是指用于读取和写入数据的预定义流对象。标准输入流(System.in)用于从键盘读取数据,而标准输出流(System.out)用于将数据打印到控制台。

标准输入流(System.in)是一个字节流(InputStream),它继承自InputStream类。可以使用Scanner类来读取标准输入流中的数据。

标准输出流(System.out)是一个字节流(OutputStream),它继承自PrintStream类。可以使用System.out.println()方法将数据打印到控制台。

Properties 类

Properties 类是用于操作属性文件的类,属性文件通常以 .properties 后缀名保存,以键值对的形式(key=value)存储数据。Properties 类继承自 Hashtable 类,所以具备了 Hashtable 类的所有方法。

Properties 类提供了一系列方法来加载、存储和获取属性文件中的键值对数据。下面是一些常用的方法:

1)load(InputStream inStream):从输入流中加载属性文件。属性文件的格式为键值对的形式,每一行表示一个键值对,以等号(=)分隔键和值。

2)getProperty(String key):根据键获取属性文件中对应的值。

3)setProperty(String key, String value):设置属性文件中的键值对。

4)store(OutputStream out, String comments):将属性文件存储到输出流中。comments 参数是一个注释,可以写一些关于属性文件的说明。

示例代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

public class PropertiesExample {
    public static void main(String[] args) {
        // 加载属性文件
        Properties properties = new Properties();
        try (InputStream inputStream = new FileInputStream("config.properties")) {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取属性值
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println("Username: " + username);
        System.out.println("Password: " + password);

        // 设置属性值
        properties.setProperty("email", "example@example.com");

        // 存储属性文件
        try (OutputStream outputStream = new FileOutputStream("config.properties")) {
            properties.store(outputStream, "Updated properties");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

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

相关文章

Sublime Text简介、下载、安装、汉化、常用插件和激活——《跟老吕学Python编程》附录资料

Sublime Text简介、下载、安装、汉化、常用插件和激活——《跟老吕学Python编程》附录资料 Sublime Text 简介Sublime Text 下载、安装、汉化、常用插件和激活Sublime Text 官网Sublime Text 下载Sublime Text 安装1.安装2.右键菜单3.启动安装4.耐心等待5.安装完成 Sublime Tex…

实验一:关联规则 (见U盘)

实验名称 关联规则 实验时间 3月 14 日星期 四 第3.4节 实验目的 利用 Python 对关联规则算法进行调用。能够使用 Python 调用关联规则算法。首先使用apriori ,fpgrowth 或者 fpmax 函数来找出频繁项集&#xff0c;然后使用 association_rules …

vivado Placement、时钟和I/O放置、全局布局、详细布局和布局后优化

安置 Vivado Design Suite放置程序将网表中的单元放置到目标AMD中的特定站点上装置与其他实现命令一样&#xff0c;Vivado放置程序工作于并更新&#xff0c;内存中的设计。 设计布局优化 Vivado砂矿器同时优化了以下方面的设计布局&#xff1a; •定时松弛&#xff1a;选择…

不囤货不进货的“抖音小店”,到底靠啥盈利?内行人道出背后原因

大家好&#xff0c;我是电商花花。 在互联网的快速发展下&#xff0c;网购给人们带来了很大的便利&#xff0c;而网络下的电商也是发展迅速&#xff0c;带动了很多人想要创业做电商&#xff0c;找副业的想法。 随着抖音直播电商的快速崛起&#xff0c;抖音小店和无货源运营的…

如何把Spring的Bean注入到Quartz中

前言 今天写Quartz定时调度的时候遇到了想调用增删改查操作数据库的情况 这时候在Quartz容器中 直接注入bean 但是会出现bean为空的情况&#xff0c; 一、为什么为空 这种情况是因为Quartz容器 中 它读取不到Spring 容器中的bean&#xff0c;所以我们需要加一些方法让他读到 …

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试根据新危险化学品经营单位安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编&#xff0c;组成一套危险化学品经…

[JavaWeb学习日记]Vue工程,springboot工程整合Mybatis,数据库索引

目录 一.Vue工程 安装NodeJS与Vue-cli Vue项目创建 启动Vue项目&#xff1a;点击npm脚本serve 改端口&#xff1a;在vue.config.js下 Vue文件组成&#xff1a;templatescriptstyle 使用element 前端服务器当前使用Ngix 主要编写的文件 二.SpringBoot的Web工程 启动带…

Spring boot java: 无效的目标发行版: 18

idea 搭建spring boot 报错java: 无效的目标发行版: 18 本人jdk 1.8 解决方案如下&#xff1a;

Filter实现请求日志记录

将锁有得外部访问都记录在日志文件里面&#xff0c;设计这个功能是为了&#xff08;为什么&#xff09;&#xff1a; 1. 在不引入Promentheus进行接口监控时&#xff0c;基于日志文件就可以实现整个项目得监控。 2. 当出现问题时&#xff0c;可以基于此进行流量重放。 效果如…

HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

前言 二周目玩家&#xff0c;浅试一下这次的原型机实验。总体感觉跟上一年的很相似&#xff0c;但还是有所不同。 可以比较明显地感觉到&#xff0c;这个界面越来越好看了&#xff0c;可操作与可探索的功能也越来越多了。 我们HNU的SYSTEM真的越来越好了&#xff01;&#x…

图像处理与视觉感知---期末复习重点(3)

文章目录 一、空间域和频率域二、傅里叶变换三、频率域图像增强 一、空间域和频率域 1. 空间域&#xff1a;即所说的像素域&#xff0c;在空间域的处理就是在像素级的处理&#xff0c;如在像素级的图像叠加。通过傅立叶变换后&#xff0c;得到的是图像的频谱&#xff0c;表示图…

ElasticSearch 看这一篇就够了,详解!!!

目录 核心概念 索引 映射 文档 基本操作 索引 创建 查询 删除 映射 创建 查询 文档 添加文档 查询文档 删除文档 更新文档 批量操作 高级查询 说明 语法 常见检索 查询所有[match_all] 关键词查询(term) 范围查询[range] 前缀查询[prefix] 通配符查询…

【智能算法】人工水母搜索算法(JS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Chou 等人受到水母运动行为启发&#xff0c;提出了人工水母搜索算法(Artificial Jellyfish Search Optimizer, JS)。 2.算法原理 2.1算法思想 JS模拟了水母的搜索行为&#xf…

要将镜像推送到GitLab的Registry中的步骤

1、通过cli 模式登录gitlab &#xff08;命令行模式&#xff09; docker login git.asc-dede.de Username: haiyang Password: Login Succeeded 2、查看我的本地镜像&#xff1a; 3&#xff0c;推送镜像apollo_core到对应的gitlab项目的Registry 中 docker push registry.gi…

汽车电子零部件(4):行泊一体ADAS

前言: 现阶段智能汽车行业正在大规模力推无限接近于L3的L2++或L2.9自动驾驶量产落地,类似于当初智能手机替换传统手机的行业机会期。智能汽车常见的智能驾驶功能包括: 行车场景:自适应巡航控制ACC;自动变道辅助ALC;交通拥堵辅助TJA;车道居中LCC;领航辅助NOA; 泊车场…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接&#xff1a;基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

excel同类项合并求和怎么操作?

想必很多办公人士都熟悉excel这款软件&#xff0c;那么使用过程里&#xff0c;若想合并同类项数据并求和&#xff0c;具体是如何操作的呢&#xff1f;下面就是小编带来的excel合并同类项数据并求和的操作步骤&#xff0c;很简单哦&#xff0c;看完之后你也来试试吧! 先看一下原…

反向传播 — 简单解释

一、说明 关于反向传播&#xff0c;我有一个精雕细刻的案例计划&#xff0c;但是实现了一半&#xff0c;目前没有顾得上继续充实&#xff0c;就拿论文的叙述这里先起个头&#xff0c;我后面将修改和促进此文的表述质量。 二、生物神经元 大脑是一个由大约100亿个神经元组成的复…

关于tcp协议

目录 前言&#xff1a; 一、TCP协议的基本概念&#xff1a; 二、TCP协议的主要特点&#xff1a; 2.1面向连接&#xff1a; 2.2可靠传输&#xff1a; 2.3基于字节流&#xff1a; 三、TCP连接的建立与终止&#xff1a; 3.1连接建立&#xff1a; 3.1.1SYN&#xff1a; 3…

【SystemVerilog】结构体真是太好用了~

前言 Verilog最大的缺陷之一是没有数据结构。在SystemVerilog中可以使用struct创建结构&#xff0c;struct只是把数据组织到一起&#xff0c;是数据的集合&#xff0c;所以是可综合的。 结构体是可以通过模块接口进行传递的&#xff0c;这就是本文想描述的内容。 一、结构体的…