Java文件操作

摘要

文件是操作系统重要的组成部分,那么对文件的读写操作也必然是不可缺少的!本文将用Java核心类库提供的Api对文件进行操作,通过本文可以基本掌握在Java的世界里是如果对文件进行操作的!

创建文件

创建一个文件很简单,基本定义一个文件路径,调用Api即可!

@Test
public void test_create() throws IOException {
    final File file = new File(TMP_FILE);
    file.createNewFile();
}

注意事项

  • 当前目录不存在时,会出异常
java.io.IOException: No such file or directory
  • createNewFile() 当文件存在时,返回False

文件读写操作

Java里对文件的操作(读、写)对象可以分为两类

  • 对字节操作
  • 对字符操作

关于什么是字节和字符,直观的意思就是长度不一样嘛!关于Java里字节和字符网上很多资料可以阅读,这里不是表述的重点!

写入文件

  • 按字节处理
@Test
public void test_byte_write() throws IOException {
    String text = "Hello Java!\nHello World!";
    try (
            FileOutputStream fileOutputStream = new FileOutputStream(TMP_FILE);
         //在fileOutputStream的基础上加了一个缓冲区(适合大容量写入)、即使不加缓冲区也可以利用fileWrite写入磁盘
         BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream)
    ) {
        bufferedOutputStream.write(text.getBytes(StandardCharsets.UTF_8));
    }
}
  • 按字符处理
@Test
public void test_character_Write() throws IOException {
    String text = "Hello Java!\nHello World!";
    try (
            FileWriter fileWriter = new FileWriter(TMP_FILE);
         //在FileWrite的基础上加了一个缓冲区(适合大容量写入)、即使不加缓冲区也可以利用fileWrite写入磁盘
         BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    ) {
        bufferedWriter.write(text);
        bufferedWriter.flush();
    }
}

读取文件

  • 按字节处理
@Test
public void test_byte_read() throws IOException {
    try (
            FileInputStream fileInputStream = new FileInputStream(TMP_FILE);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
            ) {
        int l = 0;
        final StringBuilder builder = new StringBuilder();
        while ((l = bufferedInputStream.read()) != -1) {
            builder.append((char) l);
        }
        System.out.println(builder);

    }
}
  • 按字符处理
@Test
public void test_character_read() throws IOException {
    try (
            FileReader reader = new FileReader(TMP_FILE);
            BufferedReader bufferedReader = new BufferedReader(reader);
    ) {
        int l = 0;
        final StringBuilder builder = new StringBuilder();
        while ((l = bufferedReader.read()) != -1) {
            builder.append((char) l);
        }
        System.out.println(builder);

    }
}

总结

不管是字节操作还是字符操作,Java I/O库存都提供了两种策略操作

  • 直接操作磁盘
  • 带有一个缓冲区的操作 (Buffer)

那么Java提供这两种Api我们平时用哪一个呢?

操作系统在每次操作磁盘都是一个费时费力的工作、Buffer的作用就是提供一个缓冲区,至于这个缓冲区的作用,可以想像成:
很久以前人们吃饭是没有碗的!每次吃饭,每次吃一口就去跑去锅里盛一口、这样来回跑太累了。后来发明了碗,每次吃多少就盛到碗里,这样就不用来回的跑!
那么这个碗不就是Buffer嘛!!但是某一次我不是很饿也只能吃一口,那么那个碗还有用嘛?这个是值得思考的问题!

文中示例代码:GitHub

posted @ 2021-09-03 11:53  乌托拉赛文  阅读(89)  评论(0编辑  收藏  举报