java - 使用 printwriter 从列表中创建包含多行的文本文件
问题描述
我正在尝试以文本格式创建一个逗号分隔的文件,并使用 try 和 catch。为此,我正在使用库 PrintWriter。但是,我无法逐行打印所有行。我创建了一个列表来存储我在每次迭代中创建的每一行,然后我尝试在列表上使用 for 将每个元素打印为文件中的一行:
for(int i=0;i<listA.size();i++) {
writer.println(listA.get(i));
}
但是,我在文件中得到的结果是
Name_DS_1,LineString_1,UFI_1,Name_DS_2,LineString_2,UFI_2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
我期待:
Name_DS_1,LineString_1,UFI_1,Name_DS_2,LineString_2,UFI_2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
我的整个代码是:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class App {
public static List listA = new ArrayList();
public static void main(String[] args) {
matchSplits();
}
public static void matchSplits()
{
String header = "Name_DS_1" + "," + "LineString_1" + "," + "UFI_1" + "," + "Name_DS_2" + "," + "LineString_2" + "," + "UFI_2" + "\r\n";
String fileName = "D:\\WIP\\test\\Coordinates.txt";
File file = new File(fileName);
int matchCount = 0;
try (PrintWriter writer = new PrintWriter(file)) {
for (int k=0;k<3;k++) {
//Here I am inserting the header only in the first iteration.
if(matchCount == 0) {
writer.write(header);
}
String Name_DS_1 = "Name1";
String LineString_1 = "Line1";
String UFI_1 = "Ufi1";
String Name_DS_2 = "Name2";
String LineString_2 = "Line2";
String UFI_2 = "Ufi2";
String line = Name_DS_1 + "," + LineString_1 + "," + UFI_1 + "," + Name_DS_2 + "," + LineString_2 + "," + UFI_2 + "\r\n";
listA.add(line);
for(int i=0; i<listA.size(); i++) {
writer.println(listA.get(i));
}
writer.close();
matchCount++;
}
}
catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
解决方案
这是您问题的可能解决方案,在这里您可以找到解决方案
public class App {
public static List<String> listA = new ArrayList<>();
public static void main(String[] args) {
matchSplits();
}
public static void matchSplits() {
String header = "Name_DS_1" + "," + "LineString_1" + "," + "UFI_1" + "," + "Name_DS_2" + "," + "LineString_2" + "," + "UFI_2";
String fileName = "foo.csv"; // your file name here
File file = new File(fileName);
try (PrintWriter writer = new PrintWriter(file)) {
// no need to check if k == 0, this is outside the loop
listA.add(header);
// prepare your data here
for (int k = 0; k < 3; k++) {
String Name_DS_1 = "Name1";
String LineString_1 = "Line1";
String UFI_1 = "Ufi1";
String Name_DS_2 = "Name2";
String LineString_2 = "Line2";
String UFI_2 = "Ufi2";
String line = Name_DS_1 + "," + LineString_1 + "," + UFI_1 + "," + Name_DS_2 + "," + LineString_2 + "," + UFI_2;
listA.add(line);
}
// write your lines here
for (String s: listA) {
writer.println(s);
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
一些提示:
- 无需
PrintWriter
像您在其中声明的那样关闭try(...)
- 不需要,
\r\n
因为您已经在使用printline
- 不需要两个计数器,
k
就足够了(至少在这个片段中)
推荐阅读
- html - 水平滚动容器网页
- excel - 使用 MSXML2.XMLHTTP60 对象解析 HTML 数据时出现错误 91
- java - 如何在 android studio 中为天气应用程序制作自定义推送通知消息
- assembly - 为什么在主内存中以 4K 步进 16 会导致没有 L1d 缓存未命中
- node.js - ace 编辑器在 socket.io 节点应用程序中不起作用
- angular - 在角度如何在 URL 中传递两个变量?
- angular - Angular 6 使用“#”获取查询参数
- javascript - 如何单击与 Cypress.io 的另一个 DIV 关联的链接?
- javascript - 如何从动态添加的字段中获得差异 - 反应
- c++ - CRTP 基类继承 std::enable_shared_from_this,抛出 std::bad_weak_ptr。我需要交代