2013-01-10 3 views
0

InputStreamReader에서 문자열을 읽는 더 좋은 방법이 있습니까? Profiler에서 메모리 힙이 발생했습니다.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)); 
} 

미리 감사드립니다.

편집 : enter image description here

편집 : 메시지가이 함께 전송됩니다

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

"메모리 힙"이 발생합니까? 무엇 않습니다 그 의미 ? –

+0

우연히 getClientMessage를 너무 많이 실행하지 않는 한 스크린 샷에 아무런 문제가 없습니다. – asgoth

+0

나는 getClientMessage를 1 초마다 실행하고있다. –

답변

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(); 
} 
+0

tryed this, same .. 아무것도 인쇄 할 수 없습니다. –

+0

음, 친애하는, 우리는 어떻게 코드가 서로 인터리브되는지 알지 못하기 때문에 더 심각한 문제가 될 수 있습니다. – Andremoniy

+0

@IlendemliMuhammet이 방법은 아무 것도 인쇄하지 않습니다. 무언가를 인쇄 할 것으로 예상되는 곳은 어디입니까? –

2

내가 더 편리하고 간단한 방법으로 이러한 일을 당신에게 commons-io 라이브러리를 건의 할 것입니다. 그냥 사용

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

을하지만 이것은 단지 코드 스타일의 통지입니다. 우리는 단어 이 메모리 힙을 얻는 것의 의미를 이해하지 못한다.. Memory Management in the Java HotSpot™ Virtual Machine :

Java 힙 공간이 객체가 힙에 을 할당 할 수 없음을 나타냅니다 당신이 메모리 부족 문제가있는 경우 어떤 경우에는, 당신은 당신을 위해 자바 응용 프로그램을 메모리를 증가해야합니다. 이 문제는 구성 문제 일 수 있습니다. -Xmx 명령 줄 옵션 (또는 기본적으로 선택됨)으로 지정된 최대 힙 크기가 응용 프로그램 에 충분하지 않은 경우이 오류가 발생할 수 있습니다. 또한 이 더 이상 필요하지 않은 개체는 가청 처리되지 않을 수 있습니다. 따라서 응용 프로그램 이 실수로 해당 개체에 대한 참조를 보유하고 있기 때문에 가비지 수집 할 수 없습니다. HAT 도구 ( 섹션 7 참조)를 사용하여 도달 가능한 모든 개체를보고 을 참조하여 각 개체를 생존 상태로 유지할 수 있습니다. 이 오류의 또 다른 가능성이있는 소스는 응용 프로그램에서 파이널 라이저를 과도하게 사용하여 파이널 라이저를 호출하는 스레드가 종료자를 큐에 추가하는 속도와 일치하도록 유지할 수 없게됩니다. jconsole 관리 도구를 사용하면 이 완료 될 때까지 대기중인 객체 수를 모니터링 할 수 있습니다.

+0

commons-io를 시도했지만 어떤 메시지도받지 못합니다. –

+0

'sendServerMessage' 메소드에서'action' 변수를 디버깅하거나 추가하려고 시도합니다. – Andremoniy

+0

sendServerMessage는 char 배열을 사용하여 String을 내 메서드로 전달할 수 있기 때문에 실제로 작동합니다. 유일한 문제는 효율적이지 않습니다. –