任何人都了解外部文件吗?

Anyone understand external files well?

我应该创建一个程序来读取每行有 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();
        }
    }
}

您使用 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 块。这确保 reader 关闭,无论从中读取时发生什么。它包装了 reader 打开后执行的代码,因此已知 reader 不为空,使用后应关闭。