0

InputStreamReader から文字列を読み取るより良い方法はありますか。プロファイラーでは、そこにメモリ ヒープを取得しています。

public String getClientMessage() throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(tempSocket.getInputStream()));     
    char[] buffer = new char[200];
    return new String(buffer, 0, bufferedReader.read(buffer));
}

前もって感謝します。

編集: ここに画像の説明を入力

編集: メッセージはこれで送信されます:

public void sendServerMessage(String action) throws IOException{
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(tempSocket.getOutputStream()));
    printWriter.print(action);
    printWriter.flush();
}
4

2 に答える 2

2

commons-io そのようなことをより便利で簡単な方法で行うためのライブラリをお勧めします。使用するだけです:

return IOUtils.toString(tempSocket.getInputStream());

ただし、これはコード スタイルの通知にすぎません。メモリ ヒープを取得するという用語の意味がわかりません。いずれにせよ、メモリ不足の問題がある場合は、Java アプリケーションのメモリを増やす必要があります: Java HotSpot™ 仮想マシンでのメモリ管理:

Java ヒープ領域これは、オブジェクトをヒープに割り当てることができなかったことを示しています。この問題は、単なる構成の問題である可能性があります。このエラーは、たとえば、–Xmx コマンド ライン オプションで指定された (またはデフォルトで選択された) 最大ヒープ サイズがアプリケーションにとって不十分な場合に発生する可能性があります。また、アプリケーションが意図せずオブジェクトへの参照を保持しているため、不要になったオブジェクトをガベージ コレクションできないことを示している可能性もあります。HAT ツール (セクション 7 を参照) を使用して、到達可能なすべてのオブジェクトを表示し、どの参照が各オブジェクトを存続させているかを理解できます。このエラーのもう 1 つの潜在的な原因は、ファイナライザーを呼び出すスレッドがキューへのファイナライザーの追加速度に追いつかないような、アプリケーションによるファイナライザーの過度の使用である可能性があります。

于 2013-01-10T08:21:08.410 に答える
0

IOUtilsを使用できますが、そのライブラリを使用できない場合は簡単に記述できます。

public String getClientMessage() throws IOException {
    Reader r = new InputStreamReader(tempSocket.getInputStream());
    char[] buffer = new char[4096];
    StringBuilder sb = new StringBuilder();
    for(int len; (len = r.read(buffer)) > 0;)
         sb.append(buffer, 0, len);
    return sb.toString();
}

問題は、メッセージが停止したときにメッセージを送信する方法から知る方法がないことだと思います。これは、行っていない接続を閉じるまで読む必要があることを意味します。閉じるまで待ちたくない場合は、メッセージがいつ終了したかを知るための何らかの方法を追加する必要があります(改行など)。

// create this once per socket.
final PrintWriter out = new PrintWriter(
      new OutputStreamWriter(tempSocket.getOutputStream(), "UTF-8"), true);

public void sendServerMessage(String action) {
    // assuming there is no newlines in the message
    printWriter.println(action);  // auto flushed.
}

// create this once per socket
BufferedReader in = new BufferedReader(
    new InputStreamReader(tempSocket.getInputStream(), "UTF-8"));     

public String getClientMessage() throws IOException {
     // read until the end of a line, which is the end of a message.
      return in.readLine();
}
于 2013-01-10T08:24:29.690 に答える