Java - проблема чтения / записи файла - PullRequest
0 голосов
/ 19 августа 2010

У меня действительно странная ошибка: я использую буферизованный ридер (br) и пишущий (bw), чтобы читать из одного файла - делать вычисления и записывать в другой файл.проблема: первый файл не записывается в новый файл полностью.Последние пару строк обрезаются.Я попытался поместить оператор печати, чтобы увидеть, читается ли файл - и все операторы были распечатаны правильно.Я перепроверил, что я использовал bw.close ()

Все еще не знаю.

У any1 каждого была эта проблема?

Мой фрагмент кода выглядит следующим образом:

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 ]

1 голос
/ 19 августа 2010

Если вы получаете частичный вывод, вероятный виновник в том, что вам нужно вызвать flush(), чтобы убедиться, что записи записаны в файл.

0 голосов
/ 21 августа 2010

Я запустил это (с некоторыми модификациями), и оно прекрасно работает для меня.Может быть, он пишет последние строки, и вы смотрели на outputtats.txt вместо outputStatBucket.txt.Два имени довольно похожи, и это немного сбивает с толку, как первое используется в качестве входных данных для второго.

Если это не так, тогда код не очень длинный, поэтому я бы предложил закомментироватьразличные части кода, пока не останется только проблема (или пока она не будет решена) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...