编写一个Java程序来演示使用Scanner,FileReader和PrintWriter类的文件处理。您还将利用更高级的解析技术。您将使用String的split()方法来帮助您进行解析。
您将打开args [0]中提供的文件以进行读取,并打开args [1]中提供的文件以进行写入。一次从文件中读取整行,直到EOF。
文件中的每一行将具有以下格式:
名称:curriculum:gradyear:ssn:dob从输入文件中读取的信息将以以下格式重新格式化:
学生姓名SSN DOB Curr Grad Yr
当我编译并运行它时,它可以很好地打印出第一行,然后似乎将其他所有内容放到新行中并重复一次。我试图让标头和String行仅打印一次,其余的都照此进行。 目前的当前代码是..
import java.io.*;
import java.util.Scanner;
public class D2 {
public static void main(String[] args) throws IOException {
String line, parts[];
int x;
Scanner infile = new Scanner(new FileReader("d2.dat"));
PrintWriter outfile = new PrintWriter(System.out, true);
while(infile.hasNext()) {
line = infile.nextLine();
parts = line.split(":");
for (x = 0; x < parts.length; x++)
outfile.println(parts[x]);
String ssn = parts[3]; String f, m, l;
f = ssn.substring(0,3);
m = ssn.substring(3,5);
l = ssn.substring(5);
String stringssn = f + "-" + m + "-" + l;
String header =("Student Name SSN DOB Curr Grad Yr");
String lines = ("------------ --- --- ---- -------");
String data = (parts[0] + " " + stringssn + " " + parts[4] +
" " + parts [1] + " " + parts[2]);
System.out.println(header + "\n" + lines + "\n" + data);
}
outfile.close();
infile.close();
}}
答案 0 :(得分:0)
使用制表符"/t"
来格式化这样的控制台输出,而不是使用空格,要容易得多。这也将大大提高代码的可读性。
要解决标题问题,您只需要将代码从while循环中删除,因此在进入循环之前,请执行以下操作:
if(infile.hasNext()) {
// print headings
} else {
// handle error case of !hasNext()
outfile.close();
infile.close();
// exit execution
}
上面是如果您希望早期返回而不是嵌套的if / else执行,但是将整个while循环包装在上面的if语句中也可以
如果您真的想使事情变得美好,总会把您的行分成一个字符串数组,计算要显示的每个“列”的最大字符串长度,并以编程方式在每个字符串行中填充额外的空格,以得到一个格式正确的表格。
答案 1 :(得分:0)
您也可以尝试查看String.format。
作为入门者,您可以替换此:
String data = (parts[0] + " " + stringssn + " " + parts[4] +
" " + parts [1] + " " + parts[2]);
类似这样:
String data = String.format("%-40s%-20s%-40s%-20s%s", parts[0], stringssn, parts[4], parts[1], parts[2])
这意味着用5个字段格式化字符串。第一个字符串将包含一个在40个字符宽的字段中对齐的字符串(您将需要调整40个字符以使其与下一个字段对齐。第二个字符串也是一个将在字段20中对齐的字符串字符宽等。
您还可以获取它来格式化其他数据类型,例如Integers或doubles等。
这里是String.format的文档以及您可以在format string
中输入的字段类型的详细信息我不确定您对标题的意思,但是通常您只希望在输出的顶部打印一次。解决方法很简单,将标题的打印移到开始循环之前。但是我不确定那是什么意思,因为这似乎很明显。