从性能角度来看,应该选择缓冲读取器还是扫描仪?

4

从性能优化的角度来看:在Java中读取文件——缓冲读取器(BufferedReader)还是扫描器(Scanner)更好?

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;


public class BufferedReaderExample {   

    public static void main(String args[]) {

        //reading file line by line in Java using BufferedReader       
        FileInputStream fis = null;
        BufferedReader reader = null;

        try {
            fis = new FileInputStream("C:/sample.txt");
            reader = new BufferedReader(new InputStreamReader(fis));

            System.out.println("Reading File line by line using BufferedReader");

            String line = reader.readLine();
            while(line != null){
                System.out.println(line);
                line = reader.readLine();
            }           

        } catch (FileNotFoundException ex) {
            Logger.getLogger(BufferedReaderExample.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(BufferedReaderExample.class.getName()).log(Level.SEVERE, null, ex);

        } finally {
            try {
                reader.close();
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(BufferedReaderExample.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
  } 

Output:
Reading File line by line using BufferedReader
first line in file
second line
third line
fourth line
fifth line
last line in file

另一种扫描仪的方法是...
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

/**
 * @author Javin Paul
 * Java program to read file line by line using Scanner. Scanner is a rather new
 * utility class in Java and introduced in JDK 1.5 and preferred way to read input
 * from console.
 */
public class ScannerExample {


    public static void main(String args[]) throws FileNotFoundException  {

       //Scanner Example - read file line by line in Java using Scanner
        FileInputStream fis = new FileInputStream("C:/sample.txt");
        Scanner scanner = new Scanner(fis);

        //reading file line by line using Scanner in Java
        System.out.println("Reading file line by line in Java using Scanner");

        while(scanner.hasNextLine()){
            System.out.println(scanner.nextLine());
        }

        scanner.close();
    }   

}

Output:
Reading file line by line in Java using Scanner
first line in file
second line
third line
fourth line
fifth line
last line in file

1
删除对 println 的调用,给它一个10+兆字节的文件,亲自试一试。 - Sergey Kalinichenko
@dasblinkenlight,请详细解释一下..!! - Crazy4Java
你已经写好了基准代码,你需要做的就是比较使用两种方法读取一个大文件(比如 10 GB)所需的时间。我怀疑在这种情况下你不会看到一个明显的赢家,不过我还是会选择 BufferedReader - Sergey Kalinichenko
long ti = System.currentTimeMillis(); 放在程序开头,将 System.out.println("Time elapsed: " + (System.currentTimeMillis() - ti)); 放在结尾,在大量的 sample.txt 上运行每个版本的程序并检查哪个更快... - beny23
1个回答

6

BufferedReaderScanner快很多,因为它会缓存字符,所以每次读取一个字符时就不需要每次都访问文件。

Scanner特别适用于直接读取原始数据类型,并且还可用于正则表达式。

我已经使用了Scanner和BufferedReader,BufferedReader的性能显著提高。您也可以自行测试。


4
在jdk6的某个版本中(记不清是哪个版本),Scanner也有一个1KB的缓冲区,这已经足够了。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接