java - 文件读/写问题

时间:2010-08-18 21:50:37

标签: java file-io

我有一个非常奇怪的错误: 我使用缓冲读取器(br)和写入器(bw)从一个文件读取 - 进行计算并写入另一个文件。 问题: 第一个文件没有完全写入新文件。 LAst几行被截断。 我尝试使用print语句来查看文件是否被读取 - 并且所有语句都正确打印出来。 我重新检查过我使用过bw.close()

仍然没有线索。

有没有人都有这个问题吗?

我的代码段如下:

private void calculateStats(String input) throws IOException {


   BufferedWriter out = new BufferedWriter(new FileWriter("outputstats.txt"));
   BufferedReader br = new BufferedReader(new FileReader(input));
   int dtime = 0 ;
   double ingress,inMean= 0.0;
   double egress,outMean = 0.0;
   String id, date, newLine = null;
   out.write("interfaceId , I-Mean, I-STD, I-Kurt, I-Skew, E-Mean, E-STD, E-Kurt, E-Skew"+NL);

   DescriptiveStatistics inStats = new DescriptiveStatistics();
   DescriptiveStatistics outStats = new DescriptiveStatistics();
   DescriptiveStatistics inPMean = new DescriptiveStatistics();
   DescriptiveStatistics outPMean = new DescriptiveStatistics();
   DescriptiveStatistics inPStd = new DescriptiveStatistics();
   DescriptiveStatistics outPStd = new DescriptiveStatistics();
   int j = 0;

   while((newLine = br.readLine()) != null){

     //   System.out.println(" new line for statistical output "+newLine);
        StringTokenizer st = new StringTokenizer(newLine, ",");
        for(int i = 0; i<st.countTokens(); i++){
            id = st.nextToken().trim();
            dtime = Integer.parseInt(st.nextToken());
            ingress = Double.parseDouble(st.nextToken().trim());
            egress = Double.parseDouble(st.nextToken().trim());
            date = st.nextToken().trim();

            // set the interface token for easy evaluation

            if(interfaceId.trim().equalsIgnoreCase("no value") || !(interfaceId.trim().equalsIgnoreCase(id))){
                interfaceId = id;
                if(j == 0){
                    out.write(interfaceId + ",");
                    j = 1;//reset j value
                }else{
                inMean = inStats.getMean();
                outMean = outStats.getMean();
                out.write((int) inMean + ","+(int)inStats.getStandardDeviation()+","+
                        (int)inStats.getKurtosis()+ ","+ (int)inStats.getSkewness()+ ","+ (int)outMean + 
                        ","+(int)outStats.getStandardDeviation()+","+(int)outStats.getKurtosis()+","+(int)outStats.getSkewness()+ NL);
                inPMean.addValue(inMean);
                inPStd.addValue(inStats.getStandardDeviation());
                outPMean.addValue(outMean);
                outPStd.addValue(outStats.getStandardDeviation());
                out.write(interfaceId + ",");
                inStats.clear();
                outStats.clear();
                }//end of j initialization
            }

            if(ingress >= 0){
  //                System.out.println("ingress value "+ingress);
                inStats.addValue(ingress);
            }
            if(egress >= 0){
  //                System.out.println("egress value "+egress);
                outStats.addValue(egress);
            }
        }// end of for
   }// end of while

   out.write((int)inMean + "," + (int)outMean);
   out.close();
   br.close();
   percentile(inPMean,inPStd,outPMean,outPStd, "outputstats.txt");

}

private void percentile(DescriptiveStatistics inPMean,
        DescriptiveStatistics inPStd, DescriptiveStatistics outPMean,
        DescriptiveStatistics outPStd, String inputFileName) throws IOException {


        BufferedReader br = new BufferedReader(new FileReader(inputFileName));
        BufferedWriter bw = new BufferedWriter(new FileWriter("outputStatBucket.txt"));
        String newLine = null;
        bw.write(br.readLine()+ NL);
        while((newLine = br.readLine())!= null){
            StringTokenizer st = new StringTokenizer(newLine, ",");
            while(st.hasMoreTokens()){
                System.out.println("newLine "+newLine);
                          bw.write(st.nextToken()+","+calcP(st.nextToken().trim(),inPMean)+"," + calcP(st.nextToken().trim(),inPStd)+
                        ","+st.nextToken().trim()+","+st.nextToken().trim()+","+calcP(st.nextToken().trim(),outPMean)+
                        ","+calcP(st.nextToken().trim(),outPStd)+","+st.nextToken().trim()+","+st.nextToken().trim()+ NL);
            }
        }
        bw.close();
        br.close();
 }
private int calcP(String nextToken, DescriptiveStatistics inPMean) {
    int next = Integer.parseInt(nextToken.trim());
    if(next<= inPMean.getPercentile(25)){
        return 1;
    }else if(next > inPMean.getPercentile(25) && next <=inPMean.getPercentile(50)){
        return 2;
    }else if(next > inPMean.getPercentile(50) && next <=inPMean.getPercentile(75)){
        return 3;
    }else if(next > inPMean.getPercentile(75)){
        return 4;
    }else{
        return 0;
    }
}

谢谢,

2 个答案:

答案 0 :(得分:1)

如果它是你得到的部分输出,可能的罪魁祸首是你需要调用flush()来确保写入文件。

答案 1 :(得分:0)

我跑了这个(做了一些修改),它对我来说很好。也许它正在编写最后一行,你正在查看outputstats.txt而不是outputStatBucket.txt。这两个名字非常相似,第一个被用作第二个的输入有点令人困惑。

如果不是这样,那么代码在这一点上的时间不是很长,所以我建议将代码的各个部分都注释掉,直到只留下问题(或直到它解决了)......