Java OpenCSV 编写器 - 生成空文件
Java OpenCSV writer - resulting empty file
我遇到了 OpenCSV 库的问题;准确地说,是将字符串写入文件本身。
public class Calc {
public static Summary summary;
public static CSVWriter writer;
(...)
someButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
(...)
summary = new Summary();
writer = summary.createCSV();
someThreadedMethod();
summary.closeWriter(writer);
} catch (...) {}
}
}
}
}
总结class:
public class Summary {
private static int version = 0;
private static String name;
public Summary() throws IOException {
this.version += 1;
this.name = "Summary" + Integer.toString(version) + ".csv";
}
public CSVWriter createCSV() throws IOException {
CSVWriter writer = new CSVWriter(new FileWriter(name));
return writer;
}
public void addInfo(CSVWriter writer, String info) {
String[] record = info.split("#");
writer.writeNext(record);
}
public void closeWriter(CSVWriter writer) throws IOException {
writer.close();
}
}
并且 someThreadedMethod() 创建另一个 classes 对象,这些对象登录给定的网站并解析给定的字符串表格:
(...)
ArrayList<String> contentStrToPrint = new ArrayList<>(Arrays.asList(someStringArray));
for (int i = 7; i < contentStrToPrint.size(); i += 7) {
for (String aSomething : something) {
if (contentStrToPrint.get(i).contains(aSomething)) {
StringBuilder summary = new StringBuilder();
for (int j = i; j < i + 7; j++) {
row.add(contentStrToPrint.get(j));
if (j != i + 6)
summary.append(contentStrToPrint.get(j)).append("#");
else
summary.append(contentStrToPrint.get(j));
}
data.add(row);
Calc.summary.addInfo(Calc.writer, summary.toString());
row = new Vector<>();
}
}
}
我知道这不是最简洁的代码。
结果我得到空的 "SummaryN.csv" 文件。我在这里看不到错误;此外,我在 测试项目 中重新创建了它 - 更简单,只在 buttonClick 上编写来自给定 ArrayList 的字符串(也由给定的 String[] 制作) - 它有效。
此外,在任何可能的阶段打印出值 returns 适当的字符串。是否有可能以某种方式(我不知道如何)与 threaded 方法连接?
如有任何帮助,我们将不胜感激!
PS Vectors 的 fun 并不重要,需要它才能显示一些值。
假设任何时候你开始行动你想要一个新版本的文件,我有以下建议:
将 Summary 和 CSVWriter 声明放在 try 上方的 actionPerformed 方法中。您正在方法中创建和关闭它 - 为什么要保留它?
将 writer close 语句放在 finally 中。因为如果您的线程因任何原因中断,您的文件将不会关闭(给您一个空文件)。
创建线程后使用某种连接逻辑。否则,当您调用关闭时您仍然会有线程处理并且您将丢失数据(可能给您一个空文件)。
我遇到了 OpenCSV 库的问题;准确地说,是将字符串写入文件本身。
public class Calc {
public static Summary summary;
public static CSVWriter writer;
(...)
someButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
(...)
summary = new Summary();
writer = summary.createCSV();
someThreadedMethod();
summary.closeWriter(writer);
} catch (...) {}
}
}
}
}
总结class:
public class Summary {
private static int version = 0;
private static String name;
public Summary() throws IOException {
this.version += 1;
this.name = "Summary" + Integer.toString(version) + ".csv";
}
public CSVWriter createCSV() throws IOException {
CSVWriter writer = new CSVWriter(new FileWriter(name));
return writer;
}
public void addInfo(CSVWriter writer, String info) {
String[] record = info.split("#");
writer.writeNext(record);
}
public void closeWriter(CSVWriter writer) throws IOException {
writer.close();
}
}
并且 someThreadedMethod() 创建另一个 classes 对象,这些对象登录给定的网站并解析给定的字符串表格:
(...)
ArrayList<String> contentStrToPrint = new ArrayList<>(Arrays.asList(someStringArray));
for (int i = 7; i < contentStrToPrint.size(); i += 7) {
for (String aSomething : something) {
if (contentStrToPrint.get(i).contains(aSomething)) {
StringBuilder summary = new StringBuilder();
for (int j = i; j < i + 7; j++) {
row.add(contentStrToPrint.get(j));
if (j != i + 6)
summary.append(contentStrToPrint.get(j)).append("#");
else
summary.append(contentStrToPrint.get(j));
}
data.add(row);
Calc.summary.addInfo(Calc.writer, summary.toString());
row = new Vector<>();
}
}
}
我知道这不是最简洁的代码。 结果我得到空的 "SummaryN.csv" 文件。我在这里看不到错误;此外,我在 测试项目 中重新创建了它 - 更简单,只在 buttonClick 上编写来自给定 ArrayList 的字符串(也由给定的 String[] 制作) - 它有效。 此外,在任何可能的阶段打印出值 returns 适当的字符串。是否有可能以某种方式(我不知道如何)与 threaded 方法连接?
如有任何帮助,我们将不胜感激!
PS Vectors 的 fun 并不重要,需要它才能显示一些值。
假设任何时候你开始行动你想要一个新版本的文件,我有以下建议:
将 Summary 和 CSVWriter 声明放在 try 上方的 actionPerformed 方法中。您正在方法中创建和关闭它 - 为什么要保留它?
将 writer close 语句放在 finally 中。因为如果您的线程因任何原因中断,您的文件将不会关闭(给您一个空文件)。
创建线程后使用某种连接逻辑。否则,当您调用关闭时您仍然会有线程处理并且您将丢失数据(可能给您一个空文件)。