首页 > 解决方案 > 为什么我在阅读两次后无法保存文件的内容?

问题描述

已经修好了。感谢 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 字节(首先,做平均,最后,做比较)。这是为什么?我在这里做错了什么?

感谢您的热心帮助。

标签: java

解决方案


您提供的数据文件的列由空格分隔。由于第 2 列的数据包含空格,因此将 data[2] 转换为 double 将触发异常。这将使程序关闭缓冲区并退出。

使用逗号分隔列数据。

使用更好的异常处理来轻松查找异常。


推荐阅读