为什么我的程序只读取文件中的第一条记录?

时间:2017-07-19 20:03:59

标签: java filereader

我写了这个程序来比较2个文件。它们的尺寸为500mb到2.8gb,每6小时创建一次。我有来自2个来源(NMD和XMP)的2个文件。它们被分解为具有由管道(|)字符分隔的字段的文本行。每行是一条记录,最长可达65,000个字符。数据与电视节目和电影有关,显示时间和描述性内容。我已经确定任何特定节目或电影至少有3个数据可以唯一地标识该节目或电影。 IE:CallSign,ProgramId和StartLong。这个数据的两个来源是称为NMD和XMP的系统,因此该缩写词添加到各种变量中。所以我的目标是比较NMD创建的文件和XMP创建的文件,并确认NMD生成的所有内容也是由XMP生成的,并且每个匹配记录中的数据是相同的。

我想在这里完成的是: 1.按记录读取3个唯一数据字段的NMD文件记录。 2.按记录读取XMP文件记录,并查找NMD文件中当前记录的匹配项。 3. NMD文件应该一次迭代一条记录。然后应在整个XMD文件中搜索每个NMD记录,记录该记录的相同记录。 4.在2个文件中的一个中写入一个日志条目,指示成功或失败以及该数据是什么。

正在发生的事情是每个文件中的第一条记录被读取,但之后没有记录被读取。结果,两个文件都没有到达,也没有找到任何匹配。我的success.log和failure.log文件从不显示其中的任何数据。在外部do / while循环中,System.out显示单行文本。 IE:文件中的第一条记录。在内部do / while循环中,System.out一遍又一遍地打印相同的数据,这些数据也来自文件中的第一个记录。是不是证明程序没有通过两个源文件按记录迭代?

所以在实际代码上......

import java.io.*;

public class FileParse {

    public static void main(String[] args) throws java.io.IOException {

        String epgsRecordNMD = null;
        String epgsRecordXMP = null;
        BufferedWriter logSuccessWriter = null;
        BufferedWriter logFailureWriter = null;
        BufferedReader readXMP = null;
        BufferedReader readNMD = null;

        readNMD = new BufferedReader(new FileReader("d:testdataNMD.txt"));

            do {

                epgsRecordNMD = readNMD.readLine();
                String[] epgsSplitNMD = epgsRecordNMD.split("\\|");
                String epgsCallSignNMD = epgsSplitNMD[0];
                String epgsProgramIdNMD = epgsSplitNMD[2];
                String epgsStartLongNMD = epgsSplitNMD[9];
                System.out.println("epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD );


                    do {

                        readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt"));
                        epgsRecordXMP = readXMP.readLine();
                        String[] epgsSplitXMP = epgsRecordXMP.split("\\|");
                        String epgsCallSignXMP = epgsSplitXMP[0];
                        String epgsProgramIdXMP = epgsSplitXMP[2];
                        String epgsStartLongXMP = epgsSplitXMP[9];
                        System.out.println("epgsCallsignXMP: " + epgsCallSignXMP + " epgsProgramIdXMP: " + epgsProgramIdXMP + " epgsStartLongXMP: " + epgsStartLongXMP);


                        if (epgsCallSignXMP.equals(epgsCallSignNMD) && epgsProgramIdXMP.equals(epgsProgramIdNMD) && epgsStartLongXMP.equals(epgsStartLongNMD)) {
                            logSuccessWriter = new BufferedWriter (new FileWriter("d:success.log", true));
                            logSuccessWriter.write("NMD match found in XMP" + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD);
                            logSuccessWriter.write("\n");
                            logSuccessWriter.close();
                            System.out.println ("Match found");

                        }

                    } while (epgsRecordXMP != null); 

                        logFailureWriter = new BufferedWriter (new FileWriter("d:failure.log", true));
                            logFailureWriter.write("NMD match not found in XMP" + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD);
                            logFailureWriter.write("\n");
                            logFailureWriter.close();
                            System.out.println ("Match NOT found");

           } while (epgsRecordNMD != null);
            readNMD.close();
            readXMP.close();

        }
    }

2 个答案:

答案 0 :(得分:0)

   do {

     readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt"));

你确定你想要循环吗?你一遍又一遍地打开同一个文件。

答案 1 :(得分:0)

为什么不做这样的事情?

BufferedReader br = new BufferedReader(new FileReader("whateverfile.dat"));
BufferedReader br2 = new BufferedReader(new FileReader("whateverfile2.dat"));
String data;
String data2;

while(data = br.readLine() != null)
{
    // do whatever you want, for example found 3 unique records

    while(data2 = br2.readLine() != null)
    {
        // do whatever you want
    }
}

就像OldProgrammer所说的那样,你多次打开文件。您只需要确保阅读器/流媒体是开放的,并根据需要进行迭代,然后关闭它。