java - 为什么我在阅读两次后无法保存文件的内容?
问题描述
已经修好了。感谢 Mas & ruhul 观察我的错误。
我试图读取一个名为stationary.txt 的文本文件两次。文件内容有金额、产品名称、总价三栏。
我首先要做的是通过逐行阅读来平均每个产品的价格。然后我关闭了缓冲,然后再次打开并阅读。第二个读数采用可变平均值并逐行比较每个产品的价格。如果第 1 行超过平均值,则将其写入 Dearer.txt,否则将其写入cheap.txt
这是stationary.txt
1 Highlighter 5.99
2 Pen 9.00
3 Eraser 5.00
4 DrawingPin 2.75
5 Highlighter 10.99
6 FountainPen 20.50
7 Pencil 14.50
下面是源代码
import java.util.*;
import java.io.*;
public class Ques {
public static void main(String[] args) throws FileNotFoundException {
double average = 0;
File inFile = new File("stationary.txt");
FileReader fileReader = new FileReader(inFile);
BufferedReader bufReader = new BufferedReader(fileReader);
File outFilel = new File("dearer.txt");
FileOutputStream outFileStreaml = new FileOutputStream(outFilel);
PrintWriter outStream1 = new PrintWriter(outFileStreaml);
File outFile2 = new File("cheap.txt");
FileOutputStream outFileStream2 = new FileOutputStream(outFile2);
PrintWriter outStream2 = new PrintWriter(outFileStream2);
computeAverage(bufReader, outStream1, outStream2, average);
}
public static void computeAverage(BufferedReader bufReader, PrintWriter outStream1, PrintWriter outStream2, double average) {
String line = "";
double mark = 0;
double sum = 0;
int count = 0;
try {
bufReader.readLine();
while ((line = bufReader.readLine()) != null) {
String [] data = line.split(" ");
mark = Double.parseDouble(data[2]);
sum += mark;
count++;
}
average = sum / count;
compareMark(outStream1, outStream2, average);
} catch (NumberFormatException | IOException e) {
System.out.println(e);
} finally {
if (bufReader != null) {
try {
bufReader.close();
} catch ( IOException e) {
e.printStackTrace();
}
}
}
}
public static void compareMark(PrintWriter outStream1, PrintWriter outStream2, double average) throws FileNotFoundException {
File inFile = new File("stationary.txt");
FileReader fileReader = new FileReader(inFile);
BufferedReader bufReader = new BufferedReader(fileReader);
String line = " ";
double sum = 0;
double mark = 0;
int count = 0;
try {
double ave = (double) Math.round(average * 100) / 100;
System.out.println("another " + ave);
bufReader.readLine();
while ((line = bufReader.readLine()) != null) {
System.out.println(line);
String [] data = line.split(" ");
mark = Double.parseDouble(data[2]);
if (mark > ave) {
System.out.println("Over");
outStream1.write(line);
} else {
System.out.println("Less");
outStream2.write(line);
}
}
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException ex) {
System.out.println(ex);
} finally {
if (bufReader != null) {
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
源代码运行良好,只是在执行两次读取后我收到了两个文件的 0 字节(首先,做平均,最后,做比较)。这是为什么?我在这里做错了什么?
感谢您的热心帮助。
解决方案
您提供的数据文件的列由空格分隔。由于第 2 列的数据包含空格,因此将 data[2] 转换为 double 将触发异常。这将使程序关闭缓冲区并退出。
使用逗号分隔列数据。
使用更好的异常处理来轻松查找异常。
推荐阅读
- python - 如何在打开交互模式的情况下更新 ipywidget 中的 matplotlib 图?
- discord.js - Discord.js 读取消息中的字段
- javascript - useEffect 不会在它“监听”的对象发生变化时触发
- sql - SQL 将多个 ID 传递给单个参数
- json - 如何防止我的对象的某些字段被类转换器转换
- r - 如何创建许多变量,这些变量取决于 R 中的多个条件(类似于 SAS 中的数组函数)
- jacoco - 我怎样才能让 Jacoco 代码扫描忽略分支条件 InterruptedException,它已知会按预期运行?
- c++ - 如何修复“E0349 没有运算符匹配这些操作数”错误?
- json - 使用 Go 删除 JSON 字符串的第一个字段
- r - 如何使用 R Markdown to Beamer 中的 kable 删除标题和表格之间不必要的空白