读取一个 .txt 文件

3

我有一个类,它的作用是读取文件的内容,然后根据其内容执行某些操作。

package maple;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JOptionPane;

public class SetSettings {

public SetSettings() {

    BufferedReader reader;

    File f = new File (Shared.saveLocation + "Settings.txt");

    String line = "";

    if (f.exists()) {
        while (line != null) {
            try {
                //System.out.println("COMES HERE");
                reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
                line = reader.readLine();
                System.out.println(line);

            } catch (IOException e2) {
                // TODO Auto-generated catch block
                //e2.printStackTrace();
                //JOptionPane.showMessageDialog(null, "Error Code: Bx001", "Error", 0);

            }
        }
    }
}
 }

为了测试目的,我让它打印出每行 .txt 文件的内容。但是它会不断地重复打印第一行,而不是文件中实际的内容。无论 .txt 文件中有一行还是一百行,它都只会不停地读取一行。如何才能让它读取下一行并在没有更多行时停止呢?


3
不要创建新的缓冲读取器,这就是问题所在。在文件声明旁边初始化它。 - user1181445
1
将 while 条件替换为:(line = reader.readLine()) != null - user1181445
6个回答

6

您正在while循环内创建一个新的BufferedReader,因此每次循环执行时,读取器都会被重置。将创建读取器的行移至循环外部并尝试一下。


1
将“new BufferedReader”行移至while循环外部。
if (f.exists()) {
        reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
        while (line != null) {
            try {
                //System.out.println("COMES HERE");

                line = reader.readLine();
                System.out.println(line);

            } catch (IOException e2) {
                // TODO Auto-generated catch block
                //e2.printStackTrace();
                //JOptionPane.showMessageDialog(null, "Error Code: Bx001", "Error", 0);

            }
        }
    }

在 while 循环之前,line 为 null,因此根本不会循环。line = reader.readLine(); 必须成为 while 条件或在循环开始之前发生一次。 - Chaos
但是这行被初始化为“”,我不是Java专家,但我认为“”不等于null… - Maciej Stachowski

1
你在while循环中不断重新创建bufferReader。将其移到循环外部。
if (f.exists()) {
        reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
        while (line != null) {
            try {
                //System.out.println("COMES HERE");
                line = reader.readLine();
                System.out.println(line);

            } catch (IOException e2) {
                // TODO Auto-generated catch block
                //e2.printStackTrace();
                //JOptionPane.showMessageDialog(null, "Error Code: Bx001", "Error", 0);

            }
        }
    }

祝您愉快 :) 我们都会犯错误。

此外,这个例子很糟糕,您可能是从这里拿来的。 http://www.cafeaulait.org/slides/sd2000east/javaio/56.html


谢谢,但不是从那里得到的。 :) - user2526311

1
这个问题在于你的 while 循环中的这一行代码:
reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));

你每次都在创建一个新的BufferedReader,所以你一遍又一遍地读取第一行。将此行移至循环外并再试一次。
我认为你还需要扩展try-catch块以捕获IO异常。
try {
reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
line = reader.readLine();
while (line != null) {

            //System.out.println("COMES HERE");
            System.out.println(line);
            line = reader.readLine();
           }

} catch (IOException e2) {
            // TODO Auto-generated catch block
            //e2.printStackTrace();
            //JOptionPane.showMessageDialog(null, "Error Code: Bx001", "Error", 0);

             }

1
你应该有这个:

if (f.exists()) {
    reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
    while (line != null) {
        try {
            //System.out.println("COMES HERE");

            line = reader.readLine();
            System.out.println(line);

        } catch (IOException e2) {
            // TODO Auto-generated catch block
            //e2.printStackTrace();
            //JOptionPane.showMessageDialog(null, "Error Code: Bx001", "Error", 0);

        }
    }
}

0

while 循环之前放置 reader 您正在创建多个读取器,然后只读取第一行。

reader = new BufferedReader(new FileReader(Shared.saveLocation + "Settings.txt"));
while (line != null) {
    try {
        line = reader.readLine();
        System.out.println(line);

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