BufferedReader只读取一次

时间:2015-05-14 01:18:13

标签: java file bufferedreader

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

我创建了一个名为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

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

3 个答案:

答案 0 :(得分:0)

摆脱所有ready()测试。将其用作流结束的测试无效。这不是它的用途。见Javadoc。只需阅读readLine()返回null:

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

答案 1 :(得分:0)

好的,所以我发现了我完全陷入困境的地方。我非常专注于我正在阅读的文件,我确信这是问题所在。问题结果是我没有初始化为0 int“控制变量”我正在使用的for周期中的一些,所以我最终阅读的内容比我应该的更多在每个for中,因为我一直在添加变量的最后一个值(好奇,它没有向我显示异常)。

仍然,感谢大家的帮助,如果我没有用你的建议改变我的代码,我就永远不会知道发生了什么。

答案 2 :(得分:-1)

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

同时在阅读文件时,我看不到关闭流的代码。对于例如下面的语句打开文件进行阅读

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

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

你最好使用

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