五年开发,你还记得Java基础代码中的文件I/O操作么?

createh56个月前 (12-26)技术教程55

文件I/O操作作为Java开发中的一个重要组成部分,主要负责Java代码中对于文件的读写操作,可能对于一些长时间不使用Java文件API的开发者来说早都忘记了相关的操作,下面我们就来详细介绍一下Java中的各种文件I/O操作。

Java文件I/O的基本概念

对于文件的I/O操作无非就是完成如下的两个操作。

  • 读取文件:将文件内容从磁盘加载到程序中。
  • 写入文件:将程序中的数据保存到磁盘文件中。

而在Java中对于文件的I/O操作一般又可以分为两种工作模式,如下所示。

  • 字节流(InputStream 和 OutputStream):处理二进制数据,例如图片、视频等。
  • 字符流(Reader 和 Writer):处理文本数据,例如 .txt 文件。

下面我们就来回忆一下Java中的那些常用的文件操作类。

文件IO的常用类

在Java中提供了很多的操作类来进行文件处理操作,而这些文件操作类一般都包括在java.io和java.nio.file包中,如下所示,展示了一些常用的文件操作类。

File类

File类表示一个文件或者是一个文件目录,这个类只是对文件或者是文件目录的抽象处理,并不直接执行对文件内容的读写操作,而是用来完成如下的一些功能。

  • 创建新文件
  • 删除文件
  • 获取文件信息

代码如下所示。

import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("example.txt");
        try {
            if (file.createNewFile()) {
                System.out.println("文件已创建:" + file.getName());
            } else {
                System.out.println("文件已存在。");
            }
        } catch (IOException e) {
            System.out.println("创建文件时发生错误。");
            e.printStackTrace();
        }
    }
}

字节流类

在Java中对于文件操作的字节流类被分为了FileInputStream 和 FileOutputStream,主要就是用来通过以字节流的方式来操作文件。如下所示,通过FileInputStream 和 FileOutputStream来实现文件的复制操作。

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

public class ByteStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("source.txt");
             FileOutputStream fos = new FileOutputStream("destination.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                fos.write(data);
            }
            System.out.println("文件复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符流类

当然除了字节流之外,在Java中还提供了字符流操作类,如下所示,常见的字符流文件操作类有如下两个FileReader 和 FileWriter,主要的作用就是以字符流的方式实现文本文件读写操作。如下所示实现读取文件并写入另一个文件中。

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

public class CharStreamExample {
    public static void main(String[] args) {
        try (FileReader reader = new FileReader("input.txt");
             FileWriter writer = new FileWriter("output.txt")) {
            int data;
            while ((data = reader.read()) != -1) {
                writer.write(data);
            }
            System.out.println("文本文件复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用缓冲流提高效率

在文件流操作的过程中,我们可以通过数据缓冲区来提升对于文件的读写效率,如下所示。是日常开发中常见的一些文件缓冲类和操作介绍。

  • BufferedReader 和 BufferedWriter:用于高效处理字符数据。
  • BufferedInputStream 和 BufferedOutputStream:用于高效处理字节数据。

下面我们演示一下如何通过BufferedReader 和 BufferedWriter来实现文件的读写操作。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedStreamExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
            System.out.println("文件内容已成功复制!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

java.nio.file 包中的文件操作

在Java7之后引入了NIO操作的文件操作包java.nio.file,提供了基于NIO模型的文件操作类,例如比较常用的Files和Paths类都是在这个包中。如下所示,我们通过一个小例子来看看如何通过NIO包中的类来读取整个的文件内容。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class NIOExample {
    public static void main(String[] args) {
        try {
            List<String> lines = Files.readAllLines(Paths.get("input.txt"));
            lines.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我们也可以直接通过Files.copy()来实现文件的拷贝操作,如下所示。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

public class NIOCopyExample {
    public static void main(String[] args) {
        try {
            Files.copy(Paths.get("source.txt"), Paths.get("destination.txt"));
            System.out.println("文件复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件IO的常见错误处理

在进行文件操作的时候无非就是文件找不到,文件操作异常读写异常等一些常见的异常处理。如下所示。

  • 文件未找到异常:FileNotFoundException
  • 权限不足异常:SecurityException
  • IO 异常:IOException

在实现文件操作的时候,我们需要根据文件类型选择合适的文件操作流来实现文件操作,提供缓冲流来提升文件的读写性能,再加上完整的文件异常检查方案,就可以保证高效的文件IO操作。

总结

在Java中提供了很多的文件处理的I/O操作类,从传统的File类和流操作到现代的java.nio.file工具类都是非常好的文件操作支持,开发者可以根据具体的的操作来选择合适的实现方案,在实际开发中也是一样,可能长时间不使用某种技术,会对相关的技术实现有所忘记变得陌生,所以适当的时间回忆一下相关的基础操作,也是对自己能力的提升。

相关文章

Java文件的读写操作方法 java读文件写文件

在 Java 中,你可以使用 File、FileInputStream、FileOutputStream、BufferedReader 和 BufferedWriter 等类进行文件读写操作。下面是一...

基于Java虚拟平台的在线Ftp Voyager JV文件传输攻略

在微头条里面我分享了“昨晚攻克了基于Java虚拟平台下Ftp Voyager JV本来只允许第一次启动变为可多次启动的技术难题,还多亏了在梦中都在探究解决该问题的技术方案,网上几乎没有该问题的技术解决...

I/O流之File类的用法和实例详解——Java进阶知识讲义系列(八)

序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!I/O文件读写是Java甚至所有编程语言都十分重要的模块,因此我们会分几期来分享,今天先讲Java的文件类File。如果你正在学习...

Spring Boot + MinIO: 实现文件存储系统

引言在现代的应用程序中,文件存储和管理是一个常见的需求。传统的文件系统存储方式可能会面临存储空间有限、备份和恢复困难等问题。为了克服这些问题,可以使用分布式对象存储系统。MinIO是一个开源的对象存储...

java实现Elasticsearch的数据导出与导入

最近组内有个需求要把本地的es测试数据导入到内网中,看了网上很多说用elasticdump插件,不过这个还需要安装个人觉得有点麻烦,在网上找了一下代码自己做了下优化还挺方便,适合刚开始学习的人,下面给...