0

文字列を複数のファイルに分割する方法がわかりません。現時点では、両方とも JSON データを含む 2 つのファイルを取得する必要があります。以下のコードは最初のファイルに書き込みますが、2 番目のファイルは空のままにします。理由はありますか?

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++;

終わりではなく始まりをチェックする

で始まる行を確認し{、その 3 行を実行してファイルを開きます。

閉じてフラッシュすることを忘れないでください

最初の行でない場合 ( i > 0)、最後のライターを閉じます ( write.close();)。

最後に開いたライターを閉じる

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 に答える