如何干净地打印代码输出? Java帮助:扫描仪,PrintWriter,FileReader

时间:2019-06-03 22:33:00

标签: java

编写一个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();
}}

2 个答案:

答案 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

中输入的字段类型的详细信息

我不确定您对标题的意思,但是通常您只希望在输出的顶部打印一次。解决方法很简单,将标题的打印移到开始循环之前。但是我不确定那是什么意思,因为这似乎很明显。