0

我在弄清楚如何将字符串拆分为多个文件时遇到问题。目前我应该得到两个包含 JSON 数据的文件。下面的代码写入第一个文件,但第二个为空。任何想法为什么?

public void splitFile(List<String> results) throws IOException {

  int name = 0;
  for (int i=0; i<results.size(); i ++) {

    write = new FileWriter("/home/tom/files/"+ name +".json");
    out = new BufferedWriter(write);
    out.write(results.get(i));

    if (results.get(i).startsWith("}")) {
      name++;
    }      
  } 
}

编辑:它在开头的行拆分,{因为这表示 JSON 文档的结尾。

4

3 回答 3

1

在每个完成的写入序列后,我会关闭您的缓冲写入器。即在您分配write给新的FileWriter().

关闭BufferedWriter将关闭底层FileWriter从而强制刷新写入磁盘的数据

注意:如果您使用不同的FileWriter每个循环,那么我会将该变量范围限定为该内部循环,例如

FileWriter write = new FileWriter("/home/tom/files/"+ name +".json");

对于BufferedWriter. 实际上你可以写:

BufferedWriter outer = new BufferedWriter(new FileWriter(...

并处理outer.

于 2012-07-05T10:44:08.103 回答
1

加强切割控制

把这个放在一起:

write = new FileWriter("/home/tom/files/"+ name +".json");
out = new BufferedWriter(write);

还有这个:

name++;

检查开始,而不是结束

检查以 开头的行{,然后执行这三行以打开文件。

记得关闭并冲洗

如果它不是第一行 ( i > 0),则关闭最后一个编写器 ( write.close();)。

关闭最后打开的 writer

if (!results.isEmpty())
    out.close();

结果

它应该看起来像这样:

public void splitFile(List<String> results) throws IOException {

  int name = 0;

  BufferedWriter out = null;
  for (int i=0; i<results.size(); i ++) {
    String line = results.get(i);
    if (line.startsWith("{")) {
       if (out != null) // it's not the first
          out.close(); // tell buffered it's going to close, it makes it flush
       FileWriter writer = new FileWriter("/home/tom/files/"+ name +".json");
       out = new BufferedWriter(writer);
       name++;
    }
    if (out == null)
       throw new IllegalArgumentException("first line doesn't start with {");
    out.write(line);
  } 

  if (out != null) // there was at least one file
     out.close();
}
于 2012-07-05T10:51:59.923 回答
0

试试下面的代码..

    public void splitFile(List<String> results) throws IOException {

    int name = 0;
    for (int i = 0; i < results.size(); i++) {

        write = new FileWriter("/home/tom/files/" + name + ".json");
        out = new BufferedWriter(write);
        out.write(results.get(i));
        out.flush();
        out.close();  // you have to close your stream every time in your case.

        if (results.get(i).startsWith("}")) {
            name++;
        }
    }
}
于 2012-07-05T10:48:28.210 回答