任何人都了解外部文件吗?
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 不为空,使用后应关闭。
我应该创建一个程序来读取每行有 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 不为空,使用后应关闭。