BufferedReader 只读取一次

BufferedReader reads only once

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

我创建了一个名为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 以确定字符串是否被接受。使用该包的 class 中的代码如下。在导入所需的包并确定选项后,它会执行以下任一选项:

                    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()) 条件,永远不会阅读这些台词,并将始终 return false 因为它。

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

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

此外,在您阅读文件时,我没有看到关闭流的代码。例如下面的语句打开文件进行读取

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

但是sfile.close()的调用在哪里呢?同样,isAccepted 方法也在打开文件流,但根本没有关闭它。

你最好使用

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

删除所有 ready() 测试。将其用作流结束的测试是无效的。这不是它的目的。请参阅Javadoc。一直读到 readLine() returns null:

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

好的,所以我发现我完全搞砸了。我非常专注于我正在阅读的文件,我确信那是问题所在。问题原来是我没有将 int"control variables" 中的一些 int"control variables" 初始化为 0 我在我的 for 周期中使用了一些,所以我最终阅读的内容比我想象的要多在每个 for 中,因为我一直添加到变量的最后一个值(好奇它没有向我显示此异常)。

仍然感谢大家的帮助,如果我没有根据您的建议更改我的代码,我永远不会发现发生了什么。