Day-03 Java 中 File、字符集与 IO 流的深入解析

目录

一、File 类

1.1 File 类概述

1.2 创建 File 对象

1.3 文件和目录操作

二、字符集

2.1 字符集的概念

2.2 常见字符集

2.3 字符集的使用

三、IO 流

3.1 IO 流概述

3.2 字节流

3.3 字符流

3.4 流的关闭和资源管理

一、File 类

1.1 File 类概述

在 Java 编程里,File 类扮演着重要角色,它是对文件和目录路径名的抽象表示。这里的 “抽象” 意味着它并不直接涉及文件内容的操作,而是专注于文件和目录在系统中的路径以及与之相关的各种属性和操作。它提供了一系列方法,允许开发者对文件和目录进行创建、查找、删除、重命名等操作,是进行文件系统交互的基础类。

1.2 创建 File 对象

File 类提供了多种构造方法来创建 File 对象,以适应不同的使用场景。

  • 使用文件路径字符串:这是最常见的方式,通过传入一个文件或目录的路径字符串来创建 File 对象。例如:
import java.io.File;

public class FileExample {
    public static void main(String[] args) {
        // 创建一个表示当前目录下 test.txt 文件的 File 对象
        File file = new File("test.txt");
    }
}
  • 使用父路径和子路径:可以分别传入父目录路径和子文件或子目录的名称来创建 File 对象。这种方式在处理多层级目录结构时非常有用。例如:
import java.io.File;

public class FileConstructorExample {
    public static void main(String[] args) {
        // 父目录路径
        String parent = "parentDir";
        // 子文件名称
        String child = "childFile.txt";
        // 创建 File 对象
        File file = new File(parent, child);
    }
}

1.3 文件和目录操作

借助 File 类的丰富方法,我们可以对文件和目录进行各种操作。

  • 判断文件或目录是否存在:使用 exists() 方法可以判断指定的文件或目录是否在文件系统中存在。例如:
import java.io.File;

public class FileExistsExample {
    public static void main(String[] args) {
        File file = new File("test.txt");
        if (file.exists()) {
            System.out.println("文件存在");
        } else {
            System.out.println("文件不存在");
        }
    }
}
  • 创建新文件:使用 createNewFile() 方法可以在指定路径下创建一个新的空文件。需要注意的是,该方法可能会抛出 IOException 异常,因此需要进行异常处理。例如:
import java.io.File;
import java.io.IOException;

public class FileCreateExample {
    public static void main(String[] args) {
        File file = new File("newFile.txt");
        try {
            if (!file.exists()) {
                boolean created = file.createNewFile();
                if (created) {
                    System.out.println("文件创建成功");
                } else {
                    System.out.println("文件创建失败");
                }
            }
        } catch (IOException e) {
            System.out.println("创建文件时发生异常: " + e.getMessage());
        }
    }
}
  • 创建目录:使用 mkdir() 方法可以创建单级目录,使用 mkdirs() 方法可以创建多级目录。例如:
import java.io.File;

public class DirectoryCreationExample {
    public static void main(String[] args) {
        // 创建单级目录
        File singleDir = new File("singleDir");
        if (singleDir.mkdir()) {
            System.out.println("单级目录创建成功");
        }

        // 创建多级目录
        File multiDir = new File("parentDir/childDir");
        if (multiDir.mkdirs()) {
            System.out.println("多级目录创建成功");
        }
    }
}
  • 删除文件或目录:使用 delete() 方法可以删除文件或空目录。如果要删除非空目录,需要先递归删除目录下的所有文件和子目录。例如:
import java.io.File;

public class FileDeleteExample {
    public static void main(String[] args) {
        File file = new File("test.txt");
        if (file.exists()) {
            boolean deleted = file.delete();
            if (deleted) {
                System.out.println("文件删除成功");
            } else {
                System.out.println("文件删除失败");
            }
        }

        File dir = new File("emptyDir");
        if (dir.exists()) {
            boolean deleted = dir.delete();
            if (deleted) {
                System.out.println("目录删除成功");
            } else {
                System.out.println("目录删除失败");
            }
        }
    }
}

二、字符集

2.1 字符集的概念

字符集(Character Set)规定了字符与二进制数据之间的映射规则。在计算机中,所有的数据最终都以二进制形式存储和传输,而字符集就是将人类可读的字符转换为计算机能够理解的二进制数据,以及将二进制数据还原为字符的规则集合。不同的字符集对字符的编码方式不同,因此在处理文本数据时,正确选择和使用字符集非常重要,否则可能会出现乱码问题。

2.2 常见字符集

  • UTF - 8:这是一种可变长度的字符编码,它是 Unicode 字符集的一种实现方式。UTF - 8 可以表示全球大部分字符,包括各种语言的文字、符号等。它的优点是兼容性好,广泛应用于互联网、操作系统等领域。对于 ASCII 字符(即英文字母、数字和常见符号),UTF - 8 只使用一个字节进行编码,与 ASCII 编码兼容;对于其他字符,根据字符的不同,可能使用 2 到 4 个字节进行编码。
  • GBK:主要用于中文编码,它是在 GB2312 编码的基础上扩展而来的,能够表示更多的中文字符,包括简体中文和繁体中文。GBK 使用固定的 2 个字节来表示一个中文字符,对于英文字符则使用 1 个字节,与 ASCII 编码兼容。
  • ISO - 8859 - 1:也称为 Latin - 1,是一种单字节字符集,主要用于表示西欧语言的字符。它只能表示 256 个字符,包括英文字母、数字、标点符号和一些西欧语言的特殊字符。

2.3 字符集的使用

在 Java 中,可以使用 Charset 类来获取字符集实例,并进行字符编码和解码操作。

  • 获取字符集实例:使用 Charset.forName() 方法可以根据字符集名称获取对应的 Charset 实例。例如:
import java.nio.charset.Charset;

public class CharsetGetInstanceExample {
    public static void main(String[] args) {
        // 获取 UTF - 8 字符集实例
        Charset utf8 = Charset.forName("UTF-8");
        // 获取 GBK 字符集实例
        Charset gbk = Charset.forName("GBK");
    }
}
  • 字符编码和解码:使用 String 类的 getBytes(Charset charset) 方法可以将字符串按照指定的字符集进行编码,得到字节数组;使用 String 类的构造方法 String(byte[] bytes, Charset charset) 可以将字节数组按照指定的字符集进行解码,得到字符串。例如:
import java.nio.charset.Charset;

public class CharsetEncodingDecodingExample {
    public static void main(String[] args) {
        Charset utf8 = Charset.forName("UTF-8");
        String text = "你好,世界";
        // 编码
        byte[] bytes = text.getBytes(utf8);
        // 解码
        String decodedText = new String(bytes, utf8);
        System.out.println(decodedText);
    }
}

三、IO 流

3.1 IO 流概述

Java 的 IO 流是实现输入输出的基础,它提供了一种统一的方式来处理不同来源和目标的数据传输,如文件、网络、内存等。IO 流主要分为字节流和字符流,字节流以字节为单位进行数据读写,适用于处理二进制数据;字符流以字符为单位进行数据读写,适用于处理文本数据。

3.2 字节流

字节流的基类是 InputStream 和 OutputStream,它们是抽象类,具体的字节流操作通常使用它们的子类。

  • 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("input.txt");
             FileOutputStream fos = new FileOutputStream("output.txt")) {
            int data;
            // 从输入文件中读取字节数据,直到文件末尾
            while ((data = fis.read()) != -1) {
                // 将读取的字节数据写入输出文件
                fos.write(data);
            }
        } catch (IOException e) {
            System.out.println("读写文件时发生异常: " + e.getMessage());
        }
    }
}
  • BufferedInputStream 和 BufferedOutputStream:这两个类是缓冲字节流,它们在内存中设置了缓冲区,通过减少与磁盘或其他外部设备的交互次数,提高了 IO 操作的效率。例如:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedByteStreamExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
            int data;
            while ((data = bis.read()) != -1) {
                bos.write(data);
            }
            // 刷新缓冲区,确保所有数据都写入文件
            bos.flush();
        } catch (IOException e) {
            System.out.println("读写文件时发生异常: " + e.getMessage());
        }
    }
}

3.3 字符流

字符流的基类是 Reader 和 Writer,它们也是抽象类,具体的字符流操作通常使用它们的子类。

  • FileReader 和 FileWriter:这两个类用于对文件进行字符级的读写操作。FileReader 用于从文件中读取字符数据,FileWriter 用于向文件中写入字符数据。例如:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharacterStreamExample {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("input.txt");
             FileWriter fw = new FileWriter("output.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                fw.write(data);
            }
        } catch (IOException e) {
            System.out.println("读写文件时发生异常: " + e.getMessage());
        }
    }
}
  • BufferedReader 和 BufferedWriter:这两个类是缓冲字符流,它们同样在内存中设置了缓冲区,提高了字符数据的读写效率。BufferedReader 还提供了 readLine() 方法,可以方便地按行读取文本数据。例如:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedCharacterStreamExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
            String line;
            // 按行读取输入文件中的数据
            while ((line = br.readLine()) != null) {
                // 将读取的行数据写入输出文件
                bw.write(line);
                // 写入换行符
                bw.newLine();
            }
        } catch (IOException e) {
            System.out.println("读写文件时发生异常: " + e.getMessage());
        }
    }
}

3.4 流的关闭和资源管理

在使用 IO 流时,需要注意流的关闭操作,以释放系统资源。Java 7 引入了 try - with - resources 语句,它可以自动关闭实现了 AutoCloseable 接口的资源,避免了手动关闭资源时可能出现的异常处理和资源泄漏问题。上述示例中都使用了 try - with - resources 语句来确保流的正确关闭。

通过对 File 类、字符集和 IO 流的学习,我们能够在 Java 中灵活地进行文件操作和数据读写,处理各种文本和二进制数据,为开发更复杂的应用程序奠定基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫super

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值