我的应用程序的一部分以下列方式将数据写入.csv文件:
os.write
该文件将以excel格式打开,并且数据中包含所有类型的语言。 {{1}}部分用于为文件添加字节顺序标记,以便启用各种字符。
不知何故,文件中的行数与循环中的计数不匹配,我无法弄清楚如何。任何有关我在这里做错的帮助将不胜感激。
答案 0 :(得分:3)
在打开输入和计数文件之前,您只需要刷新并关闭输出流(强制fsync)。尝试添加:
writer.flush();
writer.close();
在你的try-block中。在main方法中的for循环之后。
答案 1 :(得分:2)
(作为旁注)。
请注意,使用BOM是可选的,并且(在许多情况下)会降低文件的可移植性(因为并非所有消费的应用都能够很好地处理它)。 不确保文件具有广告字符编码。所以我建议删除BOM。使用Excel时,只需选择文件,然后选择UTF-8作为编码。
答案 2 :(得分:1)
您没有刷新流,请参阅oracle docs以获取更多信息 这就是说
刷新此输出流并强制执行任何缓冲的输出字节 写出来。冲洗的一般合同是称之为 指示,如果先前写入的任何字节已被缓冲 输出流的实现,这样的字节应该立即 写到他们预定的目的地。如果是预定的目的地 此流的一个抽象是由底层操作提供的 系统,例如文件,然后仅刷新流保证 先前写入流的字节传递给 写作操作系统;它并不保证它们是 实际写入物理设备,如磁盘驱动器。
OutputStream的flush方法不执行任何操作。
您需要刷新以及关闭流。有两种方式
手动调用close()和flush()。
使用try with resource
正如我从您的代码中看到的那样,您已经实现了try with resource,而BufferedReader类也实现了Closeable,Flushable,因此请使用下面的代码
public static void main(String[] args) throws Exception {
try (OutputStream os = new FileOutputStream(FILE); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8))){
os.write(239);
os.write(187);
os.write(191);
for (int i = 0; i < COUNT; i++) {
writer.write(Integer.toString(i));
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(checkLineCount(COUNT, new File(FILE)));
}
答案 3 :(得分:0)
当COUNT
为1时,main()
中的代码将写入一个包含两行的文件,一行包含数据,另一行包含空行。然后你调用checkLineCount(COUNT, file)
期望它将返回1,但它返回2,因为该文件实际上有两行。
因此,如果您希望计数器匹配,则不得在最后一行之后写一个新行。
答案 4 :(得分:0)
(另见附注)。
请注意,按照您的方式编写CSV文件是真的不良做法。 CSV并不像第一眼看到的那么容易!所以,除非你真的知道你在做什么(所以知道所有的CSV怪癖),使用一个库!