我有一个非常奇怪的错误: 我使用缓冲读取器(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;
}
}
谢谢,
答案 0 :(得分:1)
如果它是你得到的部分输出,可能的罪魁祸首是你需要调用flush()
来确保写入文件。
答案 1 :(得分:0)
我跑了这个(做了一些修改),它对我来说很好。也许它正在编写最后一行,你正在查看outputstats.txt而不是outputStatBucket.txt。这两个名字非常相似,第一个被用作第二个的输入有点令人困惑。
如果不是这样,那么代码在这一点上的时间不是很长,所以我建议将代码的各个部分都注释掉,直到只留下问题(或直到它解决了)......