文件操作与IO流

news2025/1/16 18:45:59

文章目录

    • 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.coloradmin.cn/o/1519096.html

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

相关文章

【声速、频率、波长、波数、波矢】

【声速、频率、波长、波数、波矢】 在声学中,声速(Speed of Sound)、频率(Frequency)、波长(Wavelength)、波数(Wave Number)和波矢(Wave Vector)是描述声波传播特性的重要物理量。它们之间的关系如下: 声速(Speed of Sound): 表示声波在介质中传播的速度,通常…

Vue 运行报错 Error: Cannot find module ‘semver‘

文章目录 项目场景&#xff1a;问题描述解决方案&#xff1a;注意&#xff1a; 项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 运行 Vue 后遇到一个报错&#xff1a; 我的项目是WebStorm 运行的&#xff0c;不通过命令运行&#xff0c;我奇怪的是…

用网格大师网络重划分时,坐标原点按照XML文件原点填写,导出的瓦块文件命名不对,坐标原点该怎么填写

瓦块名称和原来不一致的原因是瓦块原点这里设置的不对&#xff0c;要和重建设置的瓦块原点保持一致。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c;集格式转换、坐标转换、轻量化、瓦片重划分…

探秘Kafka位移在消息旅程中的神奇

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Kafka位移在消息旅程中的神奇 前言什么是消费者位移消费者位移的定义和作用&#xff1a;消费者位移对于消息传递的一致性至关重要的原因&#xff1a; 位移的存储方式位移信息的存储方式&#xff1…

非常实用的区间预测!基于QR-BiGRU的时间序列分位数区间预测程序,电池寿命、轴承寿命、负荷预测、光伏、风速、电价、碳价预测

适用平台&#xff1a;Matlab2022版及以上 本程序参考中文EI期刊《电工技术学报》2024年1月30日网络首发文献&#xff1a;《基于QR-BiGRU神经网络与区间抗差增广状态估计的线路参数区间追踪估计》&#xff0c;提出基于QR-BiGRU双向门控循环单元网络的时间序列分位数区间预测程序…

解读 PICO 全新无灯环手柄背后的技术突破

从上世纪70年代的雅达利游戏机开始到后来的PS&#xff0c;Xbox和Switch等&#xff0c;按钮式控制器一直是团队输入的主要方式&#xff0c;并将继续在相当长的时间里继续作为重要的交互方式。这种控制器同样在新兴的XR系统中扮演着关键的角色&#xff0c;通过熟悉的按钮布局和物…

Scala--01--简介、环境搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么&#xff1f;官网&#xff1a; [https://scala-lang.org/](https://scala-lang.org/)官方文档&#xff1a; [https://docs.scala-lang.…

Unity中的网格创建和曲线变形

Unity中的网格创建和曲线变形 3D贝塞尔曲线变形贝塞尔曲线基础线性公式二次方公式三次方公式 Unity 实现3D贝塞尔曲线变形准备工作脚本概述变量定义 变量解析函数解析 获取所有子节点GetAllChildren 获取所有子节点UpdateBezierBend 控制点更新CalculateBezier Bezier 曲线公式…

解锁基于LLMS的咒语:通过上下文学习重新思考对齐

一、写作动机&#xff1a; 最近的一项研究&#xff0c;LIMA&#xff0c;表明仅使用1K个示例进行SFT也可以实现显著的对齐性能&#xff0c;这表明对齐微调的效果可能是“表面的”。&#xff08;知识和推理能力来源于预训练&#xff0c;而不是必须通过对齐微调获得的。&#xff…

掌握未来数据管理:Tidb数据库学习网站全攻略!

介绍&#xff1a;TiDB是一个开源的分布式关系型数据库&#xff0c;由PingCAP公司设计和研发。以下是对TiDB的详细介绍&#xff1a; HTAP支持&#xff1a;TiDB能够同时处理在线事务处理&#xff08;OLTP&#xff09;和在线分析处理&#xff08;OLAP&#xff09;&#xff0c;这使…

50、东北大学、阿尔伯塔大学:Hi-GCN从2个层次角度进行图学习,用来诊断脑部疾病[你这和MVS-GCN套娃呢?]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2020年10.24日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑连接网络已被用于神经系统疾病的分类&#xff0c;如自闭症…

数据仓库的设计开发应用(二)

目录 四、数据仓库的设计&#xff08;一&#xff09;需求分析&#xff08;二&#xff09;概念设计&#xff08;三&#xff09;逻辑设计&#xff08;四&#xff09;物理设计 四、数据仓库的设计 数据仓库的设计包括需求分析、概念设计、逻辑设计和物理设计四个阶段&#xff0c;其…

计算机毕业设计-基于大数据分析的服装定制网的设计与实现

概要 人民的日常生活离不开“衣食住行”&#xff0c;四者之中“食住行”发展迅猛&#xff0c;突飞猛进的发展推动了产业的升级更新。而与之形成鲜明对比的是&#xff0c;服装行业作为传统古老的行业&#xff0c;因为产业结构特征、个性化需求等问题&#xff0c;难以出现推动行业…

算法第二十七天-猜数字游戏

猜数字游戏 题目要求 解体思路 有多少位属于数字和确切位置都猜对了&#xff1a;统计 s e c r e t [ i ] g u e s s [ i ] secret[i]guess[i] secret[i]guess[i]的个数。 有多少位属于数字猜对了但是位置不对&#xff1a;用两个数组&#xff08;哈希表&#xff09;分别统计…

C#实现哈希查找算法​

C#实现哈希查找算法 下面是一个简单的C#代码示例&#xff0c;实现了哈希查找算法&#xff1a; using System; using System.Collections.Generic;class HashSearch {// 哈希查找函数static int HashSearchFunction(int[] array, int target){// 创建一个Dictionary用于存储数…

this是什么?为什么要改变this?怎么改变 this 指向?

目录 this 是什么&#xff1f; 箭头函数中的 this 为什么要改变 this 指向&#xff1f; 改变 this 指向的三种方法 call(无数个参数) apply(两个参数) bind(无数个参数) this 是什么&#xff1f; 在对象方法中&#xff0c;this 指的是所有者对象&#xff08;方法的拥有者…

程序人生——Java数组和集合使用建议(1)

目录 引出数组和集合建议60&#xff1a;性能考虑&#xff0c;数组是首选建议61&#xff1a;若有必要&#xff0c;使用变长数组建议62&#xff1a;警惕数组的浅拷贝 建议63&#xff1a;在明确的场景下&#xff0c;为集合指定初始容量建议64&#xff1a;多种最值算法&#xff0c;…

YOLOv8 | 添加注意力机制报错KeyError:已解决,详细步骤

目录 添加注意力机制报错 报错的原因 注意事项 解决错误流程 代码分享 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;h…

Linux中GPU相关命令

Linux查看显卡信息&#xff1a; lspci | grep -i vga 使用nvidia GPU可以&#xff1a; lspci | grep -i nvidia1 前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机); 查看指定显卡的详细信息用以下指令&#xff1a; lspci -v -s 00:0f.01 Linux查看Nvidia显…

探索仿函数(Functor):C++中的灵活函数对象

文章目录 一、仿函数定义及使用二、仿函数与函数指针的区别三、仿函数与算法的关系四、仿函数的实践用例 在C编程中&#xff0c;我们经常需要对数据进行排序、筛选或者其他操作。为了实现这些功能&#xff0c;C标准库提供了许多通用的算法和容器&#xff0c;而其中一个重要的概…