写入csv文件时出现意外的行数

时间:2017-04-16 14:28:41

标签: java csv bufferedwriter byte-order-mark

我的应用程序的一部分以下列方式将数据写入.csv文件:

os.write

该文件将以excel格式打开,并且数据中包含所有类型的语言。 {{1}}部分用于为文件添加字节顺序标记,以便启用各种字符。

不知何故,文件中的行数与循环中的计数不匹配,我无法弄清楚如何。任何有关我在这里做错的帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

在打开输入和计数文件之前,您只需要刷新并关闭输出流(强制fsync)。尝试添加:

writer.flush();
writer.close();

在你的try-block中。在main方法中的for循环之后。

答案 1 :(得分:2)

(作为旁注)。

请注意,使用BOM是可选的,并且(在许多情况下)会降低文件的可移植性(因为并非所有消费的应用都能够很好地处理它)。 确保文件具有广告字符编码。所以我建议删除BOM。使用Excel时,只需选择文件,然后选择UTF-8作为编码。

答案 2 :(得分:1)

您没有刷新流,请参阅oracle docs以获取更多信息 这就是说

  

刷新此输出流并强制执行任何缓冲的输出字节   写出来。冲洗的一般合同是称之为   指示,如果先前写入的任何字节已被缓冲   输出流的实现,这样的字节应该立即   写到他们预定的目的地。如果是预定的目的地   此流的一个抽象是由底层操作提供的   系统,例如文件,然后仅刷新流保证   先前写入流的字节传递给   写作操作系统;它并不保证它们是   实际写入物理设备,如磁盘驱动器。

     

OutputStream的flush方法不执行任何操作。

您需要刷新以及关闭流。有两种方式

  1. 手动调用close()和flush()。

  2. 使用try with resource

  3. 正如我从您的代码中看到的那样,您已经实现了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怪癖),使用一个库!