【Java编程动手学】Java 文件与 I/O:让数据在存储与程序间快乐穿梭

文章目录

  • 前言
  • 一、Java文件类——文件操作的基石
      • 1、创建和删除文件或目录
      • 2、文件目录的路径
      • 3、File类的常用方法
      • 4、文件重命名
      • 5、判断文件是否存在
      • 6、获取文件属性
      • 7、遍历文件和目录
  • 二、Java的输入与输出——数据流动的通道
      • 1、输入输出类概述
      • 2、文件输入流
      • 3、文件输出流
      • 4、对象输出流和对象输入流
      • 5、文件读取器和文件写入器
  • 三、完整代码
  • 总结


前言

在Java编程的世界里,文件与I/O操作就像是一场神秘的探险。今天,就让我们一同深入剖析Java中的文件与I/O,揭开它那看似神秘的面纱。

一、Java文件类——文件操作的基石

1、创建和删除文件或目录

在Java中,File类是我们操作文件和目录的得力助手。要创建一个文件,我们可以这样做:

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

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

上述代码尝试创建一个名为example.txt的文件。如果文件不存在,createNewFile()方法会创建它并返回true;如果文件已经存在,则返回false

删除文件也很简单:

public class FileDeletion {
    public static void main(String[] args) {
        File file = new File("example.txt");
        if (file.delete()) {
            System.out.println("文件删除成功!");
        } else {
            System.out.println("文件删除失败,可能文件不存在。");
        }
    }
}

delete()方法用于删除文件,如果删除成功返回true,否则返回false

2、文件目录的路径

File类还提供了获取文件路径相关的方法。比如getAbsolutePath()可以获取文件的绝对路径:

public class FilePath {
    public static void main(String[] args) {
        File file = new File("example.txt");
        System.out.println("文件的绝对路径是:" + file.getAbsolutePath());
    }
}

3、File类的常用方法

File类有众多实用的方法,下面用一个表格来展示部分常用方法及其作用:

方法 作用
exists() 判断文件或目录是否存在
isFile() 判断是否为文件
isDirectory() 判断是否为目录
length() 返回文件的长度(以字节为单位)
list() 返回目录中的文件和目录名称数组

4、文件重命名

文件重命名可以使用renameTo()方法:

public class FileRename {
    public static void main(String[] args) {
        File oldFile = new File("example.txt");
        File newFile = new File("new_example.txt");
        if (oldFile.renameTo(newFile)) {
            System.out.println("文件重命名成功!");
        } else {
            System.out.println("文件重命名失败。");
        }
    }
}

5、判断文件是否存在

前面提到的exists()方法就可以完成这个任务:

public class FileExistence {
    public static void main(String[] args) {
        File file = new File("example.txt");
        if (file.exists()) {
            System.out.println("文件存在。");
        } else {
            System.out.println("文件不存在。");
        }
    }
}

6、获取文件属性

我们可以获取文件的长度等信息,例如:

public class FileAttributes {
    public static void main(String[] args) {
        File file = new File("example.txt");
        if (file.exists()) {
            System.out.println("文件长度为:" + file.length() + " 字节");
        }
    }
}

7、遍历文件和目录

使用list()方法可以遍历目录中的内容:

import java.io.File;

public class FileTraversal {
    public static void main(String[] args) {
        File dir = new File(".");
        String[] files = dir.list();
        for (String file : files) {
            System.out.println(file);
        }
    }
}

上述代码会打印当前目录下的所有文件和目录名称。

二、Java的输入与输出——数据流动的通道

1、输入输出类概述

Java的I/O类主要分为输入流和输出流。输入流用于从数据源读取数据,输出流用于将数据写入目的地。

2、文件输入流

FileInputStream用于从文件中读取数据。下面是一个读取文件内容的示例:

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

public class FileInputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            int content;
            while ((content = fis.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            System.out.println("读取文件时发生错误。");
            e.printStackTrace();
        }
    }
}

read()方法每次读取一个字节,返回读取的字节的ASCII码,当到达文件末尾时返回-1

3、文件输出流

FileOutputStream用于将数据写入文件:

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

public class FileOutputStreamExample {
    public static void main(String[] args) {
        String content = "这是要写入文件的内容。";
        try (FileOutputStream fos = new FileOutputStream("output.txt")) {
            byte[] bytes = content.getBytes();
            fos.write(bytes);
            System.out.println("数据写入成功!");
        } catch (IOException e) {
            System.out.println("写入文件时发生错误。");
            e.printStackTrace();
        }
    }
}

write()方法将字节数组写入文件。

4、对象输出流和对象输入流

ObjectOutputStreamObjectInputStream用于对象的序列化和反序列化。例如,将一个对象写入文件:

import java.io.*;

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class ObjectOutputExample {
    public static void main(String[] args) {
        Person person = new Person("张三", 25);
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.obj"))) {
            oos.writeObject(person);
            System.out.println("对象写入成功!");
        } catch (IOException e) {
            System.out.println("写入对象时发生错误。");
            e.printStackTrace();
        }
    }
}

读取对象:

import java.io.*;

public class ObjectInputExample {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.obj"))) {
            Person person = (Person) ois.readObject();
            System.out.println("读取的对象:姓名=" + person.getClass() // 这里实际可增加getName等合理获取属性逻辑,示例简单打印结构
                    + ",年龄等属性已序列化存储读取"); 
            // 实际可在Person类添加getName等合理方法,此处简化
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("读取对象时发生错误。");
            e.printStackTrace();
        }
    }
}
// 假设Person类定义同前,有对应属性等合理结构

5、文件读取器和文件写入器

FileReaderFileWriter用于字符流的读写。例如,使用FileWriter写入字符数据:

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

public class FileWriterExample {
    public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("char_output.txt")) {
            fw.write("这是字符数据写入示例。");
            System.out.println("字符数据写入成功!");
        } catch (IOException e) {
            System.out.println("写入字符数据时发生错误。");
            e.printStackTrace();
        }
    }
}

使用FileReader读取字符数据:

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

public class FileReaderExample {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("char_output.txt")) {
            int content;
            while ((content = fr.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            System.out.println("读取字符数据时发生错误。");
            e.printStackTrace();
        }
    }
}

三、完整代码

以下是将上述所有示例代码汇总到一个Java文件中的代码,为了便于区分不同示例,添加了一些注释说明:

import java.io.*;

// 定义一个可序列化的Person类,用于对象输入输出流示例
class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class FileIOExamples {

    // 创建文件示例
    public static void fileCreationExample() {
        File file = new File("example.txt");
        try {
            if (file.createNewFile()) {
                System.out.println("文件创建成功!");
            } else {
                System.out.println("文件已存在。");
            }
        } catch (IOException e) {
            System.out.println("创建文件时发生错误。");
            e.printStackTrace();
        }
    }

    // 删除文件示例
    public static void fileDeletionExample() {
        File file = new File("example.txt");
        if (file.delete()) {
            System.out.println("文件删除成功!");
        } else {
            System.out.println("文件删除失败,可能文件不存在。");
        }
    }

    // 获取文件绝对路径示例
    public static void filePathExample() {
        File file = new File("example.txt");
        System.out.println("文件的绝对路径是:" + file.getAbsolutePath());
    }

    // 文件重命名示例
    public static void fileRenameExample() {
        File oldFile = new File("example.txt");
        File newFile = new File("new_example.txt");
        if (oldFile.renameTo(newFile)) {
            System.out.println("文件重命名成功!");
        } else {
            System.out.println("文件重命名失败。");
        }
    }

    // 判断文件是否存在示例
    public static void fileExistenceExample() {
        File file = new File("example.txt");
        if (file.exists()) {
            System.out.println("文件存在。");
        } else {
            System.out.println("文件不存在。");
        }
    }

    // 获取文件属性示例
    public static void fileAttributesExample() {
        File file = new File("example.txt");
        if (file.exists()) {
            System.out.println("文件长度为:" + file.length() + " 字节");
        }
    }

    // 遍历文件和目录示例
    public static void fileTraversalExample() {
        File dir = new File(".");
        String[] files = dir.list();
        for (String file : files) {
            System.out.println(file);
        }
    }

    // 文件输入流示例
    public static void fileInputStreamExample() {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            int content;
            while ((content = fis.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            System.out.println("读取文件时发生错误。");
            e.printStackTrace();
        }
    }

    // 文件输出流示例
    public static void fileOutputStreamExample() {
        String content = "这是要写入文件的内容。";
        try (FileOutputStream fos = new FileOutputStream("output.txt")) {
            byte[] bytes = content.getBytes();
            fos.write(bytes);
            System.out.println("数据写入成功!");
        } catch (IOException e) {
            System.out.println("写入文件时发生错误。");
            e.printStackTrace();
        }
    }

    // 对象输出流示例
    public static void objectOutputExample() {
        Person person = new Person("张三", 25);
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.obj"))) {
            oos.writeObject(person);
            System.out.println("对象写入成功!");
        } catch (IOException e) {
            System.out.println("写入对象时发生错误。");
            e.printStackTrace();
        }
    }

    // 对象输入流示例
    public static void objectInputExample() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.obj"))) {
            Person person = (Person) ois.readObject();
            System.out.println("读取的对象:姓名相关等属性已序列化存储读取(这里简单示意)");
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("读取对象时发生错误。");
            e.printStackTrace();
        }
    }

    // 文件读取器示例
    public static void fileReaderExample() {
        try (FileReader fr = new FileReader("char_output.txt")) {
            int content;
            while ((content = fr.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            System.out.println("读取字符数据时发生错误。");
            e.printStackTrace();
        }
    }

    // 文件写入器示例
    public static void fileWriterExample() {
        try (FileWriter fw = new FileWriter("char_output.txt")) {
            fw.write("这是字符数据写入示例。");
            System.out.println("字符数据写入成功!");
        } catch (IOException e) {
            System.out.println("写入字符数据时发生错误。");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 可以根据需要调用不同的示例方法,这里简单调用几个示例
        fileCreationExample();
        fileOutputStreamExample();
        fileInputStreamExample();
        fileWriterExample();
        fileReaderExample();
    }
}

你可以根据实际需求在main方法中调用不同的示例方法,以演示相应的文件与I/O操作。

总结

Java的文件与I/O操作虽然看似复杂,但只要我们掌握了这些基本的方法和类,就能够轻松应对各种文件操作的需求。希望这篇文章能帮助大家更好地理解和运用Java中的文件与I/O功能。

你可能感兴趣的:(#,Java全栈,java,开发语言)