2017-06-12 6 views
-1

私のコードは、初期化されたソケットでinputStreamをインスタンス化します。次に、bufferedReaderがinputStreamを読み取ります。バッファリングされたreadLineのreadLineメソッドはnullではありませんが、私はwhileループで繰り返します。私はここにループしている途中にターミネーターがないことを認識しています。したがって、私はループを終了させる方法を知る方法の提案を求めています。この例のコードは次のとおりです。jsonをソケットから行ごとに解析するには?

while ((line = bufferedReader.readLine()) != null) { 
      stringBuilder.append(line); 
      bytesRead += line.getBytes().length; 
      if (isJSONAcceptable(stringBuilder.toString())) { 
       System.out.println("Acceptable"); 
       stringBuilder = new StringBuilder(); 
       break; 
      } 
} 

この場合、すべての行を読み、読み込んだ行がJSON形式であることを確認します。私はこれがパフォーマンスを集中的にすることができ、読み方についてのさまざまな提案に開放されていることを認識しています。

+0

最後に、ストリーム転送の終了を示すテキストを送信できます。 ENDやSTREAM_EXITなどのように。ループ内で一致するかどうかをチェックし、ループを終了します。 –

+0

なぜJson全体を読むことができないのですか? –

+0

私は実際にストリーミングjsonパーサーを扱ったことはありませんが、それはあなたの問題とまったく同じように聞こえます。詳しくはJackson Streaming APIをご覧ください:https://github.com/FasterXML/jackson-docs/wiki/JacksonStreamingApi – borowis

答えて

0

ターミネーターがあります。bufferedReader.readLine()がnullを返すと停止します。ストリームの最後に到達すると、これが実行されます。

これは非常に一般的な停止場所です。以前に停止したい場合は、アプリケーション固有の要件を指定する必要があります。

フルストリーミングJSONプロセッサーは非常に複雑な作業ですが、あなたが質問をしたところで、私はあなたに書き込みの背景知識がないことを示唆しています。これを行う方法については、多くの書籍、チュートリアル、ブログ記事などがあります。それは、SOの答えの範囲を超えています。運動のポイントは

  • 学術ある

    • あなたが
    • に向上させることができ、ライブラリについての何かがありますことを決定した:それはない限り、自分自身を書くことよりも、成熟したライブラリを使用する方が賢明です

      Jackson has a stream parsing API.

  • +0

    私はそれに従っていないので、より明確にする。私がbufferedReader.readLine()を停止させる唯一の方法は、別の端末(nc localhostポート)でncコマンドへの接続を閉じることです。その後、ループが再開している間に実行されます。私が紛失しているものはありますか?目的の結果が得られる唯一の方法は、bufferedReader.ready()です。しかし、これはSOに続くことはないようです。 – Albert

    +1

    'nc'を初めて触れたのはこれです。送信者がストリームの終了時にストリームを終了しない場合は、「これは指定する必要のあるアプリケーション固有の要件です」。 – slim

    関連する問題