2010-08-18 3 views
0

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

По-прежнему нет подсказки.

Имеет ли у каждого 1 эту проблему?

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

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; 
    } 
} 

Спасибо,

+0

Там являются двумя функциями в вашем примере кода, и оба, кажется, обрабатывают входной файл в выходной файл. Какой из них является проблемой? – Pointy

+1

Я бы настоятельно посоветовал вам сбрасывать ваш образец кода и удалять все, что вы можете, все еще воспроизводя проблему. Вы можете понять это, делая это, а если нет, если вы разместите минимальный пример, у вас гораздо больше шансов получить помощь. –

ответ

1

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

+2

Разумеется, вызов 'close()' будет очищать буферы. – Pointy

+1

Я не думаю, что здесь проблема, потому что он закрывает файл, а close() должен очищать буферы. –

+0

Я всегда получаю эту ошибку, когда использую flush(), я использую ее только в конце метода. не раньше этого. java.io.IOException: поток закрыт в java.io.BufferedWriter.ensureOpen (Неизвестный источник) в java.io.BufferedWriter.flushBuffer (Неизвестный источник) в java.io.BufferedWriter.flush (Неизвестный источник) в DBase. connect (DBase.java:67) в automateExport.main (automateExport.java:11) – JJunior

0

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

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

Смежные вопросы