java中读取文件方法大全

欣喜 Java经验 发布时间:2025-01-27 09:57:34 阅读数:11476 1
下文笔者讲述java代码读取文件方法大全,如下所示

方法一:使用FileInputStream

package file.io.readfile;

import java.io.*;
public class FileInputStreamTest {

    public static void main(String[] args) throws Exception {
//        testInputStream();
//        testInputStream2();
        testInputStream3();
//        testInputStreamReader();
    }

    public static void testInputStream() throws Exception {
        String path = "E:\\test\\test1.txt";

        long length = new File(path).length();
        byte[] buffer = new byte[(int)length];

        FileInputStream fileInputStream = new FileInputStream(path);
        int unread = (int)length;
        //  如果是大文件,需要多次读,这里简单地一次读取文件全部内容
        // 多次读取可以采用的方式:
        // 分配一个大内存,每次读取通过指定偏移以及读取数据大小来移动偏移
        // 全部数据使用一个大内存,分配一个小内存来存储每次读取的数据,然后把每次读取的数据复制到大内存
        try (BufferedInputStream bf = new BufferedInputStream(fileInputStream)) {
            bf.read(buffer, 0, unread);
        }

        System.out.println(new String(buffer));
    }

    public static void testInputStream2() throws Exception {
        String path = "E:\\test\\test1.txt";

        long length = new File(path).length();
        byte[] buffer = new byte[(int)length];

        FileInputStream fileInputStream = new FileInputStream(path);
        int unread = (int)length;
        //  如果是大文件,需要多次读,这里简单地一次读取文件全部内容
        // 多次读取可以采用的方式:
        // 分配一个大内存,每次读取通过指定偏移以及读取数据大小来移动偏移
        // 全部数据使用一个大内存,分配一个小内存来存储每次读取的数据,然后把每次读取的数据复制到大内存
        int n;
        int pos = 0;
        try (BufferedInputStream bf = new BufferedInputStream(fileInputStream)) {
            while((n = bf.read(buffer, pos, unread)) > 0) {
                pos += n;
                unread = unread - n;
            }
        }

        System.out.println(new String(buffer));
    }

    public static void testInputStream3() throws Exception {
        String path = "E:\\test\\test1.txt";

        long length = new File(path).length();
        byte[] buffer = new byte[(int)length];

        FileInputStream fileInputStream = new FileInputStream(path);
        int unread = (int)length;
        //  如果是大文件,需要多次读,这里简单地一次读取文件全部内容
        // 多次读取可以采用的方式:
        // 分配一个大内存,每次读取通过指定偏移以及读取数据大小来移动偏移
        // 全部数据使用一个大内存,分配一个小内存来存储每次读取的数据,然后把每次读取的数据复制到大内存
        int n;
        int pos = 0;

        byte[] readBuf = new byte[1024];
        try (BufferedInputStream bf = new BufferedInputStream(fileInputStream)) {
            while((n = bf.read(readBuf)) > 0) {
                int size = Math.min(n, unread);
                System.arraycopy(readBuf, 0, buffer, pos, size);
                pos += n;
                unread = unread - n;
                // 考虑文件增大,比刚开始大小大的情况。
                if (unread <= 0) {
                    break;
                }
            }
        }

        System.out.println(new String(buffer));
    }

    /**
     * 使用字符流
     * @throws Exception
     */
    public static void testInputStreamReader() throws Exception {
        String path = "E:\\test\\test1.txt";

        long length = new File(path).length();
        byte[] buffer = new byte[(int)length];

        FileInputStream fileInputStream = new FileInputStream(path);
        int unread = (int)length;
        //  按行读取,读到的每一行不包括末尾的换行符
        try (BufferedReader bf = new BufferedReader(new InputStreamReader(fileInputStream))) {
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }
        }

        System.out.println(new String(buffer));
    }

}
 
1.1 小结
1)FileInputStream可以直接读取字节流,也可以转换成字符流读取。
2)可以读取大文件。
3)需要使用者是否资源。
4)是传统经典使用方式。

使用FileReader

package file.io.readfile;

import java.io.BufferedReader;
import java.io.FileReader;

public class FileReaderTest {
    public static void main(String[] args) throws Exception {
        testReader();
    }

    public static void testReader() throws Exception {
        String path = "E:\\test\\test1.txt";

        // 使用FileReader不能指定文件编码
        try (BufferedReader bf = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}
2.1 小结
  字符流方式读取文件,适合按行读取情况

3.使用RandomAccessFile

package file.io.readfile;

import java.io.RandomAccessFile;
public class RandomAccessFileTest {

    public static void main(String[] args) throws Exception {
        test1();
    }

    public static void test1() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw")) {
            // 获取文件大小
            // 另一个获取文件大小的方法是new File(path).length()
            // 通过打开文件流来获取文件大小的方法更好,原因有:
            // 避免两次打开文件;
            // 避免并发问题导致获取文件大小错误
            long length = randomAccessFile.length();
            byte[] buffer = new byte[(int)length];
            // 可以使用readLine分行读取
            // 如果是大文件,需要多次读取
            // 严格来说,需要判断是否读取完了整个文件
            randomAccessFile.read(buffer);
            System.out.println(new String(buffer));
        }
    }
}
  
3.1 小结
  1)可以读取大文件
  2)可以随机读取

4.使用Scanner

package file.io.readfile;

import java.io.FileReader;
import java.util.Scanner;
 
public class ScannerTest {
    public static void main(String[] args) throws Exception {
//        test1();
//        test2();
//        test3();
        test4();
    }

    public static void test1() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (Scanner scanner = new Scanner(new FileReader(path))) {
            // 按空格分隔
            while (scanner.hasNext()) {
                String line = scanner.next();
                System.out.println(line);
            }
        }
    }

    public static void test2() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (Scanner scanner = new Scanner(new FileReader(path))) {
            // 按空格分隔
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
        }
    }

    public static void test3() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (Scanner scanner = new Scanner(new FileReader(path))) {
            // 指定分隔符
            scanner.useDelimiter("\n");
            while (scanner.hasNext()) {
                String line = scanner.next();
                System.out.println(line);
            }
        }
    }

    public static void test4() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (Scanner scanner = new Scanner(new FileReader(path))) {
            // 指定分隔符
            scanner.useDelimiter(" ");
            while (scanner.hasNext()) {
                String word = scanner.next();
                System.out.println(word);
            }
        }
    }
    
}
   
4.1 适合按行、按分隔符读取字符文件

5.使用java.nio.file.Files

package file.io.readfile;

import java.io.BufferedReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.list;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FilesTest {
    public static void main(String[] args) throws Exception {
//        test1();
//        test2();
//        test3();
//        test4();
//        test5();
        test6();
    }

    public static void test1() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.readAllLines(Paths.get(path), StandardCharsets.UTF_8);
        List<String> lines = Files.readAllLines(Paths.get(path));

        for (String line : lines) {
            System.out.println(line);
        }
    }

    public static void test2() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.newBufferedReader(Paths.get(path), StandardCharsets.UTF_8);
        try (BufferedReader bf = Files.newBufferedReader(Paths.get(path))) {
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

    public static void test3() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.lines(Paths.get(path), StandardCharsets.UTF_8);
        Stream<String>  stringStream = Files.lines(Paths.get(path));
        stringStream.forEach(line -> {
            System.out.println(line);
        });
    }

    public static void test4() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.lines(Paths.get(path), StandardCharsets.UTF_8);
        Stream<String>  stringStream = Files.lines(Paths.get(path));
        // 保证处理顺序
        stringStream.forEachOrdered(line -> {
            System.out.println(line);
        });
    }

    public static void test5() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.lines(Paths.get(path), StandardCharsets.UTF_8);
        Stream<String>  stringStream = Files.lines(Paths.get(path));
        List<String> list = stringStream.collect(Collectors.toList());
        for (String line : list) {
            System.out.println(line);
        }
    }

    /**
     * 一次性读取整个文件
     * @throws Exception
     */
    public static void test6() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 可以指定编码
//        Files.readAllLines(Paths.get(path), StandardCharsets.UTF_8);
        byte[] buffer = Files.readAllBytes(Paths.get(path));
        // jdk11提供方法
//        Files.readString(Paths.get(path));
        System.out.println(new String(buffer));
    }
}
5.1 小结
  1.适合按行读取文件
  2.一次性读取整个文件,得到字节数组

6.使用com.google.common.io.Files

package file.io.readfile;

import com.google.common.io.Files;

import java.io.BufferedReader;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
 
public class FileTest2 {
    public static void main(String[] args) throws Exception {
//        test1();
        test2();
    }

    public static void test1() throws Exception {
        String path = "E:\\test\\test1.txt";
        List<String> lines = Files.readLines(new File(path), StandardCharsets.UTF_8);
        for (String line : lines) {
            System.out.println(line);
        }
    }

    public static void test2() throws Exception {
        String path = "E:\\test\\test1.txt";
        try (BufferedReader bf = Files.newReader(new File(path), StandardCharsets.UTF_8)) {
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }

        }
    }
}
 
6.1 适合按行读取文件

7.使用org.apache.commons.io.FileUtils

package file.io.readfile;

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
 
public class FileUtilsTest {
    public static void main(String[] args) throws Exception {
//        test1();
//        test2();
        test3();
    }

    public static void test1() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 用编码字面值指定编码,例如
        // List<String> lines =  FileUtils.readLines(new File(path), “UTF-8");
        // 或者使用默认编码
        // List<String> lines =  FileUtils.readLines(new File(path))
        List<String> lines =  FileUtils.readLines(new File(path), StandardCharsets.UTF_8);
        for (String line : lines) {
            System.out.println(line);
        }
    }


    public static void test2() throws Exception {
        String path = "E:\\test\\test1.txt";
        // 用编码字面值指定编码,例如
        // FileUtils.readFileToString(new File(path), “UTF-8");
        // 或者使用默认编码
        // FileUtils.readFileToString(new File(path))
        String content = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
        System.out.println(content);
    }

    /**
     * 读取整个文件到字节数组
     * @throws Exception
     */
    public static void test3() throws Exception {
        String path = "E:\\test\\test1.txt";
        byte[] buffer = FileUtils.readFileToByteArray(new File(path));
        System.out.println(new String(buffer));
    }
}
  
7.1 
   1.适合按行读取文件
   2.一次性读取整个文件,得到字节数组或字符串
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202501/17379439538251.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者