• Java读写文件常用方法


    一.字符流:读写纯文本(txt,csv等),

    1 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter

    1.1 测试 FileWriter 写入

    private void writeFileWriter() throws IOException {
        try (FileWriter fw = new FileWriter(basicPath + "writeUnicode_FileWriter.txt")) {
            fw.write("测试 FileWriter 写入。");
        }
    }

    1.2 测试 BufferedWriter 写入

    private void writeBufferedWriter() throws IOException {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(basicPath + "writeUnicode_BufferedWriter.txt"))) {
            bw.write("测试 BufferedWriter 写入。");
        }
    }

    1.3 测试 PrintWriter 写入

    private void writePrintWriter() throws IOException {
        try (PrintWriter pw = new PrintWriter(new FileWriter(basicPath + "writeUnicode_PrintWriter.txt"))) {
            pw.write("测试 PrintWriter 写入。");
        }
    }

    2 字符流读文件主要用:FileReader,BufferedReader

    2.1 测试 FileReader 读取

    private void readFileReader() throws IOException {
        // 方式1:一个一个char读取 (不推荐)
        try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
            int ch;
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch);
            }
        }
    
        // 方式2:数组自定长度一次性读取
        try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
            char[] buf = new char[1024];
            int length;
            while ((length = fr.read(buf)) != -1) {
                String str = new String(buf, 0, length);
                System.out.print(str);
            }
        }
    }

    2.2测试 BufferedReader 读取

    private void readBufferedReader() throws IOException {
        // 方式1:一个一个char读取 (不推荐)
        try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
            int c;
            while ((c = br.read()) != -1) {
                System.out.print((char) c);
            }
        }
    
        // 方式2:数组自定长度一次性读取
        try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
            char[] buf = new char[1024];
            int length;
            while ((length = br.read(buf)) != -1) {
                String str = new String(buf, 0, length);
                System.out.print(str);
            }
        }
    
        // 方式3:bufferedReader.readLine()读取
        try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.print(line);
            }
        }
    }

    二.字节流:读取视频,音频,二进制文件等,(文本文件也可以但不推荐,以下仅为测试用)

    1 字节流写文件主要用:FileOutputStream,BufferedOutputStream

    1.1 测试 FileOutputStream 写入

    private void writeFileOutputStream() throws IOException {
        try (FileOutputStream fos = new FileOutputStream(basicPath + "writeByte_FileOutputStream.txt")) {
            String content = "测试 FileOutputStream 写入。";
            byte[] bytes = content.getBytes();
            fos.write(bytes);
        }
    }

    1.2 测试 BufferedOutputStream 写入

    private void writeBufferedOutputStream() throws IOException {
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
            String content = "测试 BufferedOutputStream 写入。";
            byte[] bytes = content.getBytes();
            bos.write(bytes);
        }
    }

    2 字节流读文件主要用:FileInputStream,BufferedInputStream

    2.1 测试 FileInputStream 读取

    private void readFileInputStream() throws IOException {
        // 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
        try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
            int ch;
            while ((ch = fis.read()) != -1) {
                System.out.print((char) ch);
            }
        }
    
        // 方式2:数组自定长度一次性读取
        try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
            byte[] buf = new byte[1024];
            int length;
            while ((length = fis.read(buf)) != -1) {
                String str = new String(buf, 0, length);
                System.out.print(str);
            }
        }
    }

    2.2 测试 BufferedInputStream 读取

    private void readBufferedInputStream() throws IOException {
        // 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
            int c;
            while ((c = bis.read()) != -1) {
                System.out.print((char) c);
            }
        }
    
        // 方式2:数组自定长度一次性读取
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
            byte[] buf = new byte[1024];
            int length;
            while ((length = bis.read(buf)) != -1) {
                String str = new String(buf, 0, length);
                System.out.print(str);
            }
        }
    }

    三.通过 Files类读写文件

    1 测试 Files类写入

    private void writeFiles() throws IOException {
        String content = "测试 Files 类写入。
    第二行";
        Files.write(Paths.get(basicPath + "writeFiles.txt"), content.getBytes());
    }

    2 测试 Files类读取

    private void readFiles() throws IOException {
        // 方式1 (文件特大时会占满内存)
        byte[] bytes = Files.readAllBytes(Paths.get(basicPath + "writeFiles.txt"));
        String srcStr1 = new String(bytes);
        System.out.println(srcStr1);
    
        // 方式2 (文件特大时会占满内存)
        List<String> lines = Files.readAllLines(Paths.get(basicPath + "writeFiles.txt"));
        StringBuilder sb = new StringBuilder();
        for (String line : lines) {
            // 此时line最后没有换行,因为readAllLines以换行分隔了所有行,可以用System.out.print 看到效果
            sb.append(line).append("
    ");
        }
        String srcStr2 = sb.toString();
        System.out.println(srcStr2);
    
        // 方式3 JDK8的Stream流,边消费边读取
        String srcStr3 = Files.lines(Paths.get(basicPath + "writeFiles.txt")).reduce((s1, s2) -> s1 + s2).get();
        System.out.println(srcStr3);
    }

    四.源码

    1 字符流读写

    package com.writefiles;
    
    import java.io.*;
    
    /**
     * @author: Convict.Yellow
     * @date: 2020/12/22 16:11
     * @description: 字符流的基本单位为 Unicode,大小为两个字节(Byte),主要用来处理文本数据。
     * 字符流有两个基类:Reader(输入字符流)和 Writer(输出字符流)。
     * <p>
     * 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter
     * 字符流读文件主要用:FileReader,BufferedReader
     */
    public class WriteAndReadByUnicode {
    
        private static final String basicPath = "D:/ztest/";
    
        public static void main(String[] args) throws IOException {
            WriteAndReadByUnicode entrance = new WriteAndReadByUnicode();
    
            // 测试 FileWriter 写入
            entrance.writeFileWriter();
            // 测试 BufferedWriter 写入
            entrance.writeBufferedWriter();
            // 测试 PrintWriter 写入
            entrance.writePrintWriter();
    
            // 测试 FileReader 读取
            entrance.readFileReader();
            // 测试 BufferedReader 读取
            entrance.readBufferedReader();
        }
    
        private void writeFileWriter() throws IOException {
            try (FileWriter fw = new FileWriter(basicPath + "writeUnicode_FileWriter.txt")) {
                fw.write("测试 FileWriter 写入。");
            }
        }
    
        private void writeBufferedWriter() throws IOException {
            try (BufferedWriter bw = new BufferedWriter(new FileWriter(basicPath + "writeUnicode_BufferedWriter.txt"))) {
                bw.write("测试 BufferedWriter 写入。");
            }
        }
    
        private void writePrintWriter() throws IOException {
            try (PrintWriter pw = new PrintWriter(new FileWriter(basicPath + "writeUnicode_PrintWriter.txt"))) {
                pw.write("测试 PrintWriter 写入。");
            }
        }
    
        private void readFileReader() throws IOException {
            // 方式1:一个一个char读取 (不推荐)
            try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
                int ch;
                while ((ch = fr.read()) != -1) {
                    System.out.print((char) ch);
                }
            }
    
            // 方式2:数组自定长度一次性读取
            try (FileReader fr = new FileReader(basicPath + "writeUnicode_FileWriter.txt")) {
                char[] buf = new char[1024];
                int length;
                while ((length = fr.read(buf)) != -1) {
                    String str = new String(buf, 0, length);
                    System.out.print(str);
                }
            }
        }
    
        private void readBufferedReader() throws IOException {
            // 方式1:一个一个char读取 (不推荐)
            try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
                int c;
                while ((c = br.read()) != -1) {
                    System.out.print((char) c);
                }
            }
    
            // 方式2:数组自定长度一次性读取
            try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
                char[] buf = new char[1024];
                int length;
                while ((length = br.read(buf)) != -1) {
                    String str = new String(buf, 0, length);
                    System.out.print(str);
                }
            }
    
            // 方式3:bufferedReader.readLine()读取
            try (BufferedReader br = new BufferedReader(new FileReader(basicPath + "writeUnicode_BufferedWriter.txt"))) {
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.print(line);
                }
            }
        }
    
    }
    View Code

    2 字节流读写

    package com.writefiles;
    
    import java.io.*;
    
    /**
     * @author: Convict.Yellow
     * @date: 2020/12/22 15:27
     * @description: 字节流的基本单位为字节(Byte),一个字节为8位(bit),主要是用来处理二进制(数据)。
     * 字节流有两个基类:InputStream(输入字节流)和 OutputStream(输出字节流)。
     * <p>
     * 字节流写文件主要用:FileOutputStream,BufferedOutputStream
     * 字节流读文件主要用:FileInputStream,BufferedInputStream
     */
    public class WriteAndReadByByte {
    
        private static final String basicPath = "D:/ztest/";
    
        public static void main(String[] args) throws IOException {
            WriteAndReadByByte entrance = new WriteAndReadByByte();
    
            // 测试 FileOutputStream 写入
            entrance.writeFileOutputStream();
            // 测试 BufferedOutputStream 写入
            entrance.writeBufferedOutputStream();
    
            // 测试 FileInputStream 读取
            entrance.readFileInputStream();
            // 测试 BufferedInputStream 读取
            entrance.readBufferedInputStream();
    
        }
    
        private void writeFileOutputStream() throws IOException {
            try (FileOutputStream fos = new FileOutputStream(basicPath + "writeByte_FileOutputStream.txt")) {
                String content = "测试 FileOutputStream 写入。";
                byte[] bytes = content.getBytes();
                fos.write(bytes);
            }
        }
    
        private void writeBufferedOutputStream() throws IOException {
            try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
                String content = "测试 BufferedOutputStream 写入。";
                byte[] bytes = content.getBytes();
                bos.write(bytes);
            }
        }
    
        private void readFileInputStream() throws IOException {
            // 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
            try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
                int ch;
                while ((ch = fis.read()) != -1) {
                    System.out.print((char) ch);
                }
            }
    
            // 方式2:数组自定长度一次性读取
            try (FileInputStream fis = new FileInputStream(basicPath + "writeByte_FileOutputStream.txt")) {
                byte[] buf = new byte[1024];
                int length;
                while ((length = fis.read(buf)) != -1) {
                    String str = new String(buf, 0, length);
                    System.out.print(str);
                }
            }
        }
    
        private void readBufferedInputStream() throws IOException {
            // 方式1:一个一个char读取 (不推荐,且中文占2个字节,此方式读中文文件会造成乱码)
            try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
                int c;
                while ((c = bis.read()) != -1) {
                    System.out.print((char) c);
                }
            }
    
            // 方式2:数组自定长度一次性读取
            try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basicPath + "writeByte_BufferedOutputStream.txt"))) {
                byte[] buf = new byte[1024];
                int length;
                while ((length = bis.read(buf)) != -1) {
                    String str = new String(buf, 0, length);
                    System.out.print(str);
                }
            }
        }
    
    
    }
    View Code

    3 Files类读写

    package com.writefiles;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.List;
    
    /**
     * @author: Convict.Yellow
     * @date: 2020/12/22 16:11
     * @description:
     *
     */
    public class WriteAndReadByFiles {
    
        private static final String basicPath = "D:/ztest/";
    
        public static void main(String[] args) throws IOException {
            WriteAndReadByFiles entrance = new WriteAndReadByFiles();
    
            // 测试 Files类写入
            entrance.writeFiles();
    
            // 测试 Files类读取
            entrance.readFiles();
        }
    
        private void writeFiles() throws IOException {
            String content = "测试 Files 类写入。
    第二行";
            Files.write(Paths.get(basicPath + "writeFiles.txt"), content.getBytes());
        }
    
        private void readFiles() throws IOException {
            // 方式1 (文件特大时会占满内存)
            byte[] bytes = Files.readAllBytes(Paths.get(basicPath + "writeFiles.txt"));
            String srcStr1 = new String(bytes);
            System.out.println(srcStr1);
    
            // 方式2 (文件特大时会占满内存)
            List<String> lines = Files.readAllLines(Paths.get(basicPath + "writeFiles.txt"));
            StringBuilder sb = new StringBuilder();
            for (String line : lines) {
                // 此时line最后没有换行,因为readAllLines以换行分隔了所有行,可以用System.out.print 看到效果
                sb.append(line).append("
    ");
            }
            String srcStr2 = sb.toString();
            System.out.println(srcStr2);
    
            // 方式3 JDK8的Stream流,边消费边读取
            String srcStr3 = Files.lines(Paths.get(basicPath + "writeFiles.txt")).reduce((s1, s2) -> s1 + s2).get();
            System.out.println(srcStr3);
        }
    
    }
    View Code

    Tip:均采用 try-with-resources写法,故无需手动 close流,try-with-resources写法可参考此处

  • 相关阅读:
    shell脚本之for循环
    shell脚本小集锦
    Java构建指定大小文件
    IntelliJ+Maven+Spring+Tomcat项目搭建(MAC)
    Git下基本命令操作
    Mac下IntelliJ的Git、GitHub配置及使用
    Git下的.DS_Store文件
    Mac下GitHub以及GitHub Desktop使用实战
    idea快捷键
    汉字获取首字符
  • 原文地址:https://www.cnblogs.com/convict/p/14177729.html
Copyright © 2020-2023  润新知