有人了解外部文件吗?

时间:2015-02-11 16:03:09

标签: java while-loop external computer-science

我应该创建一个程序来读取每行上有3个整数的外部文件,并找到带有这三个数字的三角形区域。我们还没有学过数组,所以我想创建没有数组的程序,方法和类都很好。我需要帮助每三个数字逐行读取文件。

数据是:

7 8 9

9 9 12

6 5 21

24 7 25

13 12 5

50 40 30

10 10 10

82 34 48

4 5 6

这是我到目前为止所拥有的:

import java.io.*;
import java.util.*;
import java.lang.*;
public class Prog610a
{
    public static void main(String[] args) throws IOException
    { 
        BufferedReader reader = new BufferedReader(new FileReader("myData.in"));
        String currentLine;

        int a, b, c; 
        double s, area;

        System.out.println("A" + "\t B" + "\t C" + "\t Area");
        try
        {
            while((currentLine = reader.readLine()) != null)
            {
                Scanner scanner = new Scanner(currentLine);

                s = ((scanner.nextInt() + scanner.nextInt() + scanner.nextInt()) / 2);
                area = Math.sqrt(s * (s - scanner.nextInt()) * (s - scanner.nextInt()) * (s - scanner.nextInt()) );

                if(s < 0)
                {
                    System.out.println(scanner.nextInt() + " \t" + scanner.nextInt() + 
                    " \t" + scanner.nextInt() + "\t This is not a triangle");
                }
                else
                {
                    System.out.println(scanner.nextInt() + " \t" + scanner.nextInt() + 
                    " \t" + scanner.nextInt() + " \t" + area);
                }
            }
        } 
        finally 
        {
            reader.close();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

使用Scanner开始了一个好的开始。我建议只使用它可能是不够的,因为你最终可能会出现一些格式错误的行。要处理它们,您可能希望将处理分为两部分:获取一行,然后从该行获取各个值。

这允许您捕获没有足够值或具有太多值的行。如果你不这样做,那么你可能会与线条不对齐,从一行读取一些值,从下一行读取一些值。

BufferedReader将允许您读取可以扫描的行。由于您不想使用数组,因此必须单独提取数字:

BufferedReader reader = new BufferedReader(new FileReader("myData.in"));
String currentLine;

try {
    while ((currentLine = reader.readLine()) != null) {
        Scanner scanner = new Scanner(currentLine);

        try {
            calculateTriangleArea(
                scanner.nextInt(), scanner.nextInt(), scanner.nextInt()
            );
        }
        catch (NoSuchElementException e) {
            // invalid line
        }
    }
}
finally {
    reader.close();
}

它也可以帮助您理解Java字符串插值。您的代码中包含horizontalTab。您只需使用\t即可在字符串中表达。例如:

"\tThis is indented by one tab"
"This is not"

您可以找到字符串转义字符here的完整列表。

我的代码中的异常处理(或缺少)可能会让您感到惊讶。在您的代码中,您可以捕获可能被抛出的Exception。但是,您丢弃它然后继续执行已知已损坏的扫描仪上的其余代码。在这种情况下,最好立即失败而不是隐瞒错误并尝试继续。

我的代码中发生的一点异常处理是finally块。这确保了读者无论在阅读时发生什么都会被关闭。它包装了打开阅读器后执行的代码,因此知道阅读器不为空,应该在使用后关闭。