【问题标题】:Validating input read from a file in Java [closed]验证从Java文件中读取的输入[关闭]
【发布时间】:2014-03-08 21:29:55
【问题描述】:

我正在处理一项被分解为不同方法的任务,而我目前被困在其中一种方法上。

我应该从格式如下的文件中读取数据:

46813 5 100.00

第一个数字是 0 到 99999 之间的整数,第二个是 0 到 5 之间的整数,最后一个数字是 0.00 到 100.00 之间的双精度数。

这是我应该读取输入并保存数据中的任何错误的方法的代码。例如,数字 6 如果它出现在第二列,依此类推。现在我正在使用println 在尝试保存任何值之前查看我的数据是否被正确捕获,但我几乎一无所知。

我已经坚持了好几个小时做了几件不同的事情,但我永远无法接近。如果有更简单的方法来完成所有这些,请告诉我。我愿意学习。

我正在读取的文件:

46813  5  100.00
80795  4  86.52
34961  3  77.52
40059  2  85.61
80463  1  70.16
64088  0  80.52
65400  6  90.23
80775  2  70.16
573S1  3  83.03
21076  4  54.47
32911  5  -10.90

代码:

public static void validateData() throws IOException {
    File myfile = new File("gradeInput.txt");
    Scanner inputFile = new Scanner(myfile);
    int b = 0;
    double f = 0;
    for (int i = 1; i < 12; i++) {
        int a = inputFile.nextInt();
        if (a < 0 || a > 99999) {
            b = a;
            System.out.println(b);
        }
        int c = inputFile.nextInt();
        if (c < 0 || c > 5) {
            b = c;
            System.out.println(c);
        }
        double d = inputFile.nextDouble();
        if (d < 0 || d > 100.00) {
            f = d;
            System.out.println(f);
        }
    }
}

【问题讨论】:

  • 能否为“gradeInput.txt”提供 3 或 4 行示例?
  • 46813 5 100.00 80795 4 86.52 34961 3 77.52 40059 2 85.61 80463 1 70.16 64088 0 80.52 65400 6 90.23 80775 2 70.23 80.52 65400 6 90.23 573S1 3 90.23 573S1 3 83.03 573S1 3 83.03 21076 4 50.23 21076 4 54.03 21076 4 54.03 21076 4 54.03 21076 4 54.03 21076 4 54.03 21076 4 54.03 21076 4 54.47 32911 5 -10.90我会尝试添加它到帖子。
  • 这个包含一个字母 - 573S1,它是什么?你也有负面影响。这与您对格式的文字描述不太匹配。
  • @peter.petrov 这些将被视为我需要保存的错误。如果我之前不够清楚,我很抱歉。
  • 好的,我明白了。请参阅下面如何检查此类验证错误。

标签: java validation


【解决方案1】:

将它们作为字符串读取,验证它们,例如通过尝试将它们解析为
整数、长整数、浮点数、双精度数以及它们应该是的任何值。
目前你没有验证任何东西,你只是假设
它们是有效的。这是一个测试字符串是否有效的简单方法
整数。

    private static boolean isValidInteger(String num){
        try{
            Integer.parseInt(num);
            return true;
        }catch(NumberFormatException e){
            return false;
        }
    }

您应该对 long、float、double 以及您需要的任何类型执行相同的操作。

Integer.parseInt

Long.parseLong

Float.parseFloat

Double.parseDouble

【讨论】:

  • 更有意义。谢谢!
【解决方案2】:

我使用了这个输入文件:

46813 5 100.00
80795 4 86.52
34961 3 77.52

还有这个java代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;

public class FileParser {

    public static void main(String[] args) throws IOException {
        validateData();
    }

    public static void validateData() throws IOException {

        // open file
        BufferedReader fileReader = new BufferedReader(new FileReader(
                "/.../gradeInput.txt"));

        // define variable for line of file
        String line;

        // read file line by line, until there are no more lines
        while ((line = fileReader.readLine()) != null) {
            System.out.println("Next line:");

            String[] lineContents = line.split(" ");

            int firstContent = Integer.parseInt(lineContents[0]);
            System.out.println(firstContent);

            int secondContent = Integer.parseInt(lineContents[1]);
            System.out.println(secondContent);

            Number thirdContent = new BigDecimal(lineContents[2]);
            System.out.println(thirdContent);

            System.out.println();
        }
    }
}

得到这个输出:

Next line:
46813
5
100.00

Next line:
80795
4
86.52

Next line:
34961
3
77.52

我不能 100% 确定您的输入文件是否包含换行符和/或逗号。您可能需要稍微更改代码以满足您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多