以表格格式将数据写入文本文件

时间:2014-10-07 05:33:44

标签: java netbeans file-io filewriter

到目前为止,我有这个:

File dir = new File("C:\\Users\\User\\Desktop\\dir\\dir1\\dir2);
dir.mkdirs();
File file = new File(dir, "filename.txt");
FileWriter archivo = new FileWriter(file);
archivo.write(String.format("%20s %20s", "column 1", "column 2 \r\n"));
archivo.write(String.format("%20s %20s", "data 1", "data 2"));
archivo.flush();
archivo.close();

然而。文件输出如下所示:

http://i.imgur.com/4gulhvY.png

我根本不喜欢。

如何为文本文件的输出制作更好的表格格式?

非常感谢任何协助。

提前致谢!

编辑:已修复!

此外,而不是看起来像

    column 1             column 2
      data 1               data 2

如何让它看起来像这样:

column 1             column 2
data 1               data 2

会更喜欢这样。

5 个答案:

答案 0 :(得分:7)

\r\n已作为第二个参数的一部分进行评估,因此它基本上将所需空间计算为...... 20 - "column 2".length() - " \r\n".length(),但由于第二行没有这个,所以占用更少的空间,看起来错位...

尝试添加\r\n作为基本格式的一部分,例如......

String.format("%20s %20s \r\n", "column 1", "column 2")

这会产生类似......

的东西
        column 1             column 2
          data 1               data 2

在我的测试中......

答案 1 :(得分:6)

我认为您正在尝试以表格格式获取数据。我开发了一个Java库,可以构建更复杂的表,并提供更多自定义。您可以获取源代码here。以下是我的库可以创建的一些基本表视图。希望这很有用!

COLUMN WISE GRID(DEFAULT)

+--------------+--------------+--------------+--------------+-------------+
|NAME          |GENDER        |MARRIED       |           AGE|    SALARY($)|
+--------------+--------------+--------------+--------------+-------------+
|Eddy          |Male          |No            |            23|      1200.27|
|Libby         |Male          |No            |            17|       800.50|
|Rea           |Female        |No            |            30|     10000.00|
|Deandre       |Female        |No            |            19|     18000.50|
|Alice         |Male          |Yes           |            29|       580.40|
|Alyse         |Female        |No            |            26|      7000.89|
|Venessa       |Female        |No            |            22|    100700.50|
+--------------+--------------+--------------+--------------+-------------+

全网格

+------------------------+-------------+------+-------------+-------------+
|NAME                    |GENDER       |MARRIE|          AGE|    SALARY($)|
+------------------------+-------------+------+-------------+-------------+
|Eddy                    |Male         |No    |           23|      1200.27|
+------------------------+-------------+------+-------------+-------------+
|Libby                   |Male         |No    |           17|       800.50|
+------------------------+-------------+------+-------------+-------------+
|Rea                     |Female       |No    |           30|     10000.00|
+------------------------+-------------+------+-------------+-------------+
|Deandre                 |Female       |No    |           19|     18000.50|
+------------------------+-------------+------+-------------+-------------+
|Alice                   |Male         |Yes   |           29|       580.40|
+------------------------+-------------+------+-------------+-------------+
|Alyse                   |Female       |No    |           26|      7000.89|
+------------------------+-------------+------+-------------+-------------+
|Venessa                 |Female       |No    |           22|    100700.50|
+------------------------+-------------+------+-------------+-------------+

没有网格

NAME                    GENDER       MARRIE          AGE    SALARY($)      
Alice                   Male         Yes              29       580.40      
Alyse                   Female       No               26      7000.89      
Eddy                    Male         No               23      1200.27      
Rea                     Female       No               30     10000.00      
Deandre                 Female       No               19     18000.50      
Venessa                 Female       No               22    100700.50      
Libby                   Male         No               17       800.50      
Eddy                    Male         No               23      1200.27      
Libby                   Male         No               17       800.50      
Rea                     Female       No               30     10000.00      
Deandre                 Female       No               19     18000.50      
Alice                   Male         Yes              29       580.40      
Alyse                   Female       No               26      7000.89      
Venessa                 Female       No               22    100700.50      

答案 2 :(得分:1)

您目前在右对齐的第二个参数中包含" \r\n"。我怀疑你根本不想要这个空间,你不希望\r\n成为20个字符的一部分。

要左对齐而不是右对齐,请使用-标记,即%-20s而不是%20s。有关详细信息,请参阅Formatter文档的文档。

此外,您可以使用%n以更加跨平台的方式使代码工作,以表示当前平台的行终止符(除非您专门想要Windows文件。

我建议使用Files.newBufferedWriter,因为它允许你指定字符编码(否则将使用UTF-8,这比使用平台默认值更好)...并使用一个try-with-resources语句,即使在异常面前关闭作者:

try (Writer writer = Files.newBufferedWriter(file.toPath())) {
  writer.write(String.format("%-20s %-20s%n", "column 1", "column 2"));
  writer.write(String.format("%-20s %-20s%n", "data 1", "data 2")); 
}

答案 3 :(得分:0)

try {
    PrintWriter outputStream = new PrintWriter("myObjects.txt");
    outputStream.println(String.format("%-20s %-20s %-20s", "Name", "Age", "Gender"));
    outputStream.println(String.format("%-20s %-20s %-20s", "John", "30", "Male"));
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

答案 4 :(得分:0)

如果您想输出变量而不是硬编码,它也适用于 printf

try {
    PrintWriter myObj = new PrintWriter("Result.txt");
    resultData.println("THE RESULTS OF THE OPERATIONS\n");
    for (int i = 0; i < 15; i++){
            resultData.printf("%-20d%-20d\r", finalScores[i], midSemScores[i]);
        }
    resultData.close();
} catch (IOException e){
    System.Out.Println("An error occurred");
    e.printStackTrace();
}