2010-07-29 4 views
0

어제 저는 inputstream reading과 관련된 문제에 대한 질문을 올렸고 도움을 받았습니다.다시 Inputstream에서 데이터를 읽는 데 도움이 필요합니다

나는 비슷한 상황에 처해 있지만 이번에는 내가 옳은 일을하고 있지만 아직 나를 위해 일하지 않는다는 것을 안다.

입력 스트림에서 읽는 중이지만 다른 값을 얻습니다. 아무리 내가 데이터를 변경하더라도 동일한 문자열 ("toForklift-42")을 값으로 보냅니다. 처음에는 "toForklift-"와 함께 보내는 값 앞에 접두사를 붙였습니다. 그러나 문자열을 다른 문자열로 변경했지만 대괄호에 같은 문자열이 나타납니다. i 숫자 42를 다른 숫자로 바 꾸었지만 프로그램을 실행할 때 콘솔에서 같은 문자열을 얻습니다. 다음은 무엇을 보내는가입니다 : as

송수신 클래스는 두 가지입니다.

leJOS NXJ NXTConnector를 사용하여 연결을 만들고 스트림을 엽니 다.

// sender class 

class PanButton implements Runnable { 

    DataInputStream dis; 
    DataOutputStream dos; 
    TouchSensor touch = new TouchSensor(SensorPort.S4); 





    PanicButtonCrossing(DataInputStream is, DataOutputStream os) { 
    dos = os; 
    dis = is; 
    } 

    public void run() { 

     while (!touch.isPressed()) {} 

      // If you get a message: KILL EVERYTHING  
      Motor.A.stop(); 
      Motor.B.stop(); 
      Motor.C.stop(); 

      try { // send 42 
       int value = 42; 

       dos.writeChars("ggggggggg" + 455 + "\n"); 
       dos.flush(); 
       Sound.systemSound(true, 3); 
      } catch (IOException ioe) { 
       LCD.drawString("Write Exception", 0, 0); 
      } 

      System.exit(1); 


} 






// Reader classs 



public class InputReaderCrossing implements Runnable{ 


     private DataInputStream dataIn; 
     private DataOutputStream dataOut; 

public InputReaderCrossing(DataInputStream dataIn, DataOutputStream dataOut) { 
      this.dataIn = dataIn; 
      this.dataOut = dataOut; 
      this.sensor = sensor; 
      this.readLock = new Object(); 

     } 


public void run(){ 

while(true){ 

String dataFromCrossing1 = readLineFromCrossing(); 
System.out.println("CROSSING VALUE: " + dataFromCrossing1 + " :VALUEEEEE"); 
} 

} 

private String readLineFromCrossing() throws IOException{ 
       StringBuffer sb = new StringBuffer(); 

       synchronized(readLock){ 
       while(true) { 
        char c = this.dataIn.readChar(); 
        if (c == '\n') break; 
        sb.append(c); 
       } 
       return sb.toString(); 
       } 
      } 


} 

귀하의 도움이 필요합니다. 나는 6 시간을 보냈지만 그 이유를 알 수 없다. 나는 내가 무엇을 보내든 상관없이 "toForklift-42"를 이해하지 못한다. 우선

는 난 내의 writeInt와 42() 메소드를 보내려고하지만, 그 리더 클래스 측 전 readInt을 (사용)하지만 같은 일도 얻을 :

745687894 
459877455 
456987456 

그래서 난에 문자열로 변경 이유를 알아 내고 lo는 내가 무엇을 보내더라도 그 문자열을 얻습니다. 문자열이 입력 스트림에 고정되어있어 아무것도 보내지 않는 것과 같습니다. 나는 무슨 일이 일어나고 있는지 모른다.

도움이 필요

+0

현재 응용 프로그램에서 String "toForklift-"을 얻을 수있는 단서가 없습니다. 그리고 정의한 int 변수 (int value = 42;)는 전혀 사용되지 않습니다. 보내시는 유일한 문자열은 * "ggggggggg"+ 455 + "\ n"*입니다. 그 문자열이 수신되기를 기대합니다. – f1sh

+0

나도 그래도 나는 그 문자열을받지 못했다. 지금은 매우 이상합니다. 나는 의도적으로 42에서 455로 바꿨지 만 효과가 있는지는 알지 못했다. 답장을 보내 주셔서 감사합니다. –

+1

그 문자열, 특히 "지게차"라는 단어는 아무데도 나타나지 않습니다 ... 전체 프로젝트를 검색하십시오.NXT Framework (결코 사용하지 않음)가 스트림에 씁니다. 그렇지 않으면 코드의 어느 시점에서 앱이 실행됩니다. – f1sh

답변

0

매우 혼란스러운 질문입니다. 어떤 프로세스가 어떤 데이터를 쓰고 있는지, 어떻게 전송되고 있는지, 어떤 프로세스가 데이터를 쓰는지는 알 수 없습니다. 여기서 볼 수있는 몇 가지 관련 코드가 있지만 이야기를 들려주기에 충분하지 않습니다. dataFromCrossing1은 어떻게 그 가치를 얻었나요?

외부인에게 질문 할 수있는 방식으로 문제를 체계화하는 것이 좋을 것이라고 생각합니다. 아마도 그렇게하는 과정에서 스스로 해결할 수 있습니다. 당신이 당신의 프로그램에서 문자열 상수를 변경하는 경우 원칙적으로

는 아직 같은 출력을 볼 계속하고 무엇 일어나는 것은 원래의 프로그램이 계속 실행되고

  • 이다; 또는
  • 원래 버전 이후의 모든 버전에는 오류가 있으므로 일단 성공적으로 컴파일 한 클래스 파일은 계속해서 실행됩니다. 또는
  • 실행중인 프로그램을 실제로 실행하고 있지 않습니다.
+1

이 메소드에서 값을 가져옵니다. readLineFromCrossing() –

+1

예, 어떤 메소드가 있습니까? 할당을 설명하는 코드 행은 메소드 또는 이니셜 라이저에 없습니다. 코드를 복사하여 붙여 넣으면 코드를 읽을 수 없게됩니다. – f1sh

관련 문제