使用多个BufferedReaders读取单个文件

时间:2011-09-19 15:01:10

标签: java input bufferedreader

我正在开发一个程序,需要更新一行,该行的值取决于读取后的行的结果。我认为我可以在Java中使用两个BufferedReaders来定位读取器在线上进行更新,而另一个用于修复该值的行(它可以是前面未知的行数)。这里的问题是我在同一个文件上使用了两个BufferedReaders,即使我认为我正在使用索引,调试中的结果似乎也不可靠。 这是代码:

            String outFinal
            FileName=fileOut;

        File fileDest=new File(outFinalFileName);
        try {
            fout = new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream(fileDest)));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        FileReader inputFile=null;

        try {
            inputFile = new FileReader(inFileName);
        } catch (FileNotFoundException e2) {
            e2.printStackTrace();
        }
        BufferedReader fin = new BufferedReader(inputFile);

        BufferedReader finChecker = new BufferedReader(inputFile);  //Checks the file and matches record to change
        String line="";
        String lineC="";
        int lineNumber=0;
        String recordType="";
        String statusCode="";
        try {
            while ((lineC = finChecker.readLine()) != null) {
                lineNumber++;
                if (lineNumber==1)
                    line=fin.readLine();
                recordType=lineC.substring(0,3);//Gets current Record Type
                if (recordType.equals("35")){
                    while(!line.equals(lineC)){
                        line=fin.readLine();
                        if (line==null)
                            break;
                        fout.write(line);


                    }
                }else if (recordType.equals("32")){
                    statusCode=lineC.substring(4,7);
                    if(statusCode.equals("XX")){
                        updateRecordLine(line,fout);
                    }
                }


            }
            returnVal=true;

        } catch (IOException e) {
            e.printStackTrace();

        }

提前致谢。

2 个答案:

答案 0 :(得分:2)

好吧,BufferedReader只读取内容,它没有能力将数据写回。因此,您需要的是一个BufferedReader来获取内容,以及一个BufferedWriter,它从BufferedReader获取所有输入,并将其输出到临时文件,并带有更正/附加的数据。

然后,当您完成时(即BufferedReader和BufferedWriter流都已关闭),您需要丢弃原始文件,或者将临时文件重命名为原始文件的名称。

您基本上是将原始文件复制到临时文件,在临时文件的输出中修改有问题的行,然后在原始文件上复制/重命名临时文件。

答案 1 :(得分:0)

好的,我在你的代码中看到了一些问题 - >

recordType=lineC.substring(0,3);//Gets current Record Type                 
if (recordType.equals("35")){ 

如果你在第一行看到,你将recordType的子字符串变为recordType。现在recordType长度为3.如果RecordType只有2个字符,则substring抛出arrayIndexOutOfBoundsException。因此,当没有运行时异常时,它的长度为3,并且在下一行中,您调用的是具有2个字符的字符串的equals方法。

这个if块会不会运行?