Java文件I/O的良好实践

4

我正在尝试从文件中读取整数,对它们进行一些操作,并将得到的整数写入另一个文件。

// Input
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
Scanner s = new Scanner(br);

// Output
FileWriter fw = new FileWriter("out.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);

int i;

while(s.hasNextInt())
{
    i = s.nextInt();
    pw.println(i+5);
}

我想问一下,这样包装输入输出流是一种好的做法吗?
我是java新手,在网上看到很多其他文件I/O的方式。我想坚持一个方法,那么上述方法是最好的方法吗?

1
文件有多大? - Mostafa Zeinali
5个回答

5

- 假设你在食品商场购物,你通常会怎么做?从货架上挑选每个物品,然后去结账柜台,再回到货架上,然后再回到结账柜台吗?还是将所有物品放入购物车中,然后去结账柜台呢?

- 在Java中也是类似的,Files处理字节,而Buffer处理字符,因此需要将字节转换为字符。相信我,它运行良好,不会有任何明显的开销。

因此,要读取文件:

File f = new File("Path");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);

写文件的方法:

File f = new File("Path");
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);

当您使用Scanner时,不需要使用BufferedReader


3

请注意,这些类的设计基于装饰器设计模式。一个好的实践是在finally块中关闭所有的java.io.Closeable实例。例如:

    Reader r = null;
    Scanner s = null;
    try {
        r = new FileReader("test.txt");
        s = new Scanner(r);
        // Do your stuff here.
    } finally {
        if (r != null)
            r.close();
        if (s != null)
            s.close();
    }

如果您使用的是Java 7或更高版本:

    try (
            Reader r = new FileReader("test.txt");
            Scanner s = new Scanner(r)
            ) {
        // Do your stuff here.
    }

2

如果你使用PrintWriter来写字符数据,那么你就不需要BufferedWriter了。 PrintWriter有一个构造函数,它以FileWriter作为参数,并且不需要使用Scanner来从文件中读取数据,你可以直接使用BufferedReader

FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
while((line=br.readLine())!=null){
//do read operations here
}

FileWriter fw = new FileWriter("out.txt");
PrintWriter pw = new PrintWriter(fw);
 pw.println("write some data to the file")

我使用了BufferedWriter来提高效率。我还包含了Scanner,这样我就可以读取整数了。但是我不确定如何在没有Scanner的情况下完成它,因为BufferedReader只有read()或readLine()方法。 - Happy Mittal
确实,简单读取文件时不需要扫描器。但是,扫描器允许您至少解析标记,这对于大多数应用程序是必要的。 - user937726

2

Scanner不需要BufferedReader。您可以将其包装在FileReader上。

Scanner s = new Scanner(new FileReader("test.txt"));

在使用扫描器时,最好假设源包含各种内容。使用完毕后关闭扫描器。

   while(s.hasNext()){

    if(s.hasNextInt())
      int i = s.nextInt();

    s.next();
    }
     s.close();

但是我在某个地方读到,我们应该使用 BufferedReader 来提高效率。是这样吗? - Happy Mittal
它们有不同的功能。Scanner 可以基于原始值或分隔符字符串对输入进行标记化处理。BufferedReader 相对于 FileReader 具有优势,因为它可以一次读取一行文本。 - clinton

0

我通常这样做:

String inputFileLocation = "Write it here";

BufferedReader br = new BufferedReader(new FileReader(new File(fileLocation)));

while((line=br.readLine())!=null){
//Scanner operations here
}

String outputFileLocation = "Here";
PrintWriter pr = new PrintWriter(new FileWriter(new File(outputFileLocation)));

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