【问题标题】:BufferedReader reads only onceBufferedReader 只读取一次
【发布时间】:2015-05-14 01:18:12
【问题描述】:

我正在尝试读取配置文件和字符串文件。配置文件将用于判断字符串文件中的内容是否正确。

我创建了一个名为StringAcceptor的包,部分代码如下:

    public static boolean isAccepted(File config, File lines_file, String string) throws Exception {

    //BufferedReader para obtener las líneas del archivo
    conf = new BufferedReader(new FileReader(config));
    //BufferedReader para determinar la cantidad de líneas en el archivo
    lines = new BufferedReader(new FileReader(lines_file));

    //Validación de archivo de configuración del AFD

    while(lines.ready()){
        lines.readLine();
        line_number = line_number + 1;
    }

    while(conf.ready()){
        try{

在这里我开始读取行并将值分配给相应的变量

然后我创建了一个 java 文件来使用该包并将信息发送到我的 StringAcceptor 以确定字符串是否被接受。使用该包的类的代码如下。在导入所需的包并确定选项后,它会执行以下任一选项:

                    case 1:
                            System.out.print("\nInsert configuration file name: ");
                            path = br.readLine();
                            archivo = new File(path);
                            if(archivo.isFile()){
                                System.out.print("\nInsert string to be verified: ");
                                String string = br.readLine();
                                if(StringAcceptor.isAccepted(archivo, archivo, string)){
                                    System.out.println("\nAccepted!\n");
                                } else{
                                    System.out.println("\nNot accepted.\n");
                                }
                            } else {
                                System.out.println("\nFile does not exist.\n");
                            }
                            break;
                    case 2:
                            System.out.print("\nInsert configuration file name: ");
                            path = br.readLine();
                            archivo = new File(path);
                            if(archivo.isFile()){
                                System.out.print("\nInsert name of string file to be verified: ");
                                String string = br.readLine();
                                strings = new File(string);
                                if(strings.isFile()){
                                    BufferedReader sfile = new BufferedReader(new FileReader(strings));
                                    while(sfile.ready()){
                                        if(StringAcceptor.isAccepted(archivo, archivo, sfile.readLine())){
                                            System.out.println("\nAccepted!\n");
                                        } else {
                                            System.out.println("\nNot Accepted.\n");
                                        }
                                    }
                                } else{
                                    System.out.println("\nFile does not exist.\n");
                                }
                            } else {
                                System.out.println("\nFile does not exist.\n");
                            }
                            //archivo.delete();
                            break;
                    case 3:
                            exit = true;
                            break;
                    default:
                            System.out.println("\nInvalid Option.\n");

每当我执行我的代码时,它都会出现以下菜单:

1) 验证字符串 2) 验证字符串文件 3) 退出 插入选项:

现在,无论我先选择哪个选项或首先使用哪个配置文件,它只会第一次正确执行,之后每次都不会进入while(conf.ready()) 条件,永远不会读取行和因为它,总是会返回false

希望我的编辑使它更容易理解。

【问题讨论】:

  • 干得好,但你能提供更小的例子吗?足以表明你的观点。不剪切和粘贴整个应用程序。
  • sscce.org - 简短、独立、正确的示例。

标签: java file bufferedreader


【解决方案1】:

好的,所以我发现我完全搞砸了。我非常专注于我正在阅读的文件,我确信这就是问题所在。问题原来是我没有将一些int“控制变量”初始化为0,我在for循环中使用了一些,所以我最终在每个@987654323中阅读的内容比我应该阅读的要多@ 因为我一直添加到变量的最后一个值(好奇它没有向我显示这个异常)。

不过,感谢大家的帮助,如果我没有根据你的建议更改代码,我永远不会知道发生了什么。

【讨论】:

    【解决方案2】:

    摆脱所有ready() 测试。将其用作流结束的测试是无效的。那不是它的用途。请参阅 Javadoc。一直读到readLine() 返回null:

    while ((line = in.readLine()) != null)
    

    【讨论】:

    • 问题是 .txt 文件必须有特定的行数,并且每一行都分配给不同的变量,并且通过使用您建议的方法,我无法再读取已经存在的行读了一段时间。另一方面,我不能用控制变量来读取指定数量的行,因为我需要能够逐行检测特定行是否具有某种格式。
    • 好的,所以不要使用循环,只需阅读各个行。但请确保它们不为空,即文件不会被过早截断。你为什么要在开头数那些行?
    • 我听从了你的建议,但由于某种原因它仍然不起作用。我什至在每个 return 语句之前向 BufferedReader 添加了close() 方法。尽管如此,它只在第一次执行时读取配置文件。
    • 你将不得不解释这一点。它跳过了代码的哪一部分?跳过从哪里开始?你之前说过'它不会进入while(conf.ready()) 条件':好吧,现在你已经删除了它,所以它必须。您是否忽略了某个地方的异常?还是不告诉我们?
    • 这实际上是一个好问题。我有一个 try/catch 语句,所以我删除了它以查看它在执行期间是否会给我任何异常,结果它确实读取了前 2 行,然后由于某种原因停止了。现在想弄清楚。
    【解决方案3】:

    您应该删除ready 方法。在使用BufferedReader 读取时,使用readLine 方法检查数据是否可用,然后继续。

    此外,当您阅读文件时,我看不到关闭流的代码。例如下面的语句打开文件以供阅读

    BufferedReader sfile = new BufferedReader(new FileReader(strings));
    

    但是对sfile.close() 的调用在哪里。同样,isAccepted 方法也是打开文件流而不是关闭它。

    你应该更好地使用

    1. 尝试使用资源(如果使用 Java 7+)
    2. 尝试/最终

    【讨论】:

    • 全部正确但不回答问题。
    • 我没有添加代码的那些特定部分,但我在代码的几乎所有需要的部分(读取文件、读取数字等)中都使用了 Try/Finally。而且我的代码中确实有 conf.close() 和 sfile.close(),但仍然不起作用。
    • 但没有修复它。 “从流中读取数据并检查它是否不为空”仅适用于readLine(),,不适用于任何读取流的一般方式。那段是唯一回答这个问题的部分,所以它根本不是“附加的”。它应该是第一个,它的 rest 是“附加的”。
    • @EJP 您似乎在解释我所说的内容时遇到了问题。对此无能为力。
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多