2010-07-13 2 views
1

enter code here Linux에서 16 진수를 포함하고 "^ M"으로 구분 된 스트림을 읽습니다. 장치가 자세한 정보를 준비 할 때마다 문자 ">"를 전송합니다. 스트림은 다음과 같습니다.문자에 대한 Java BufferedReader 동작?

^M^M01 02 F3^M00 01 F3 3E^M>" 

나는 char>을 감지하고 해당 char에 대해 조치를 취해야합니다. 내가 ">"를 구분할 수있는 방법이 있나?

은 기본적으로는 현재 별도의 조치를 트리거> 내가 필요로하는이

01 02 F3 
00 01 F3 3E 

것 같습니다. 어떤 이유로 든 단일 문자가 거기에있는 경우 읽기 버퍼가 트리거되지 않습니다. 나는^M에 대해 거짓말을하고있다. 다른 일을해야합니다.

+0

두 줄의 문자 시퀀스 '^ M' 이겠지만, 개행 문자를 렌더링하는 편집기가 아닌가? – polygenelubricants

+1

'^ M'은 Windows에서 Linux 로의 FTP 전송 중에 왜곡 된 Windows 개행 문자에 대해 일반적입니다. 사실 문자/ASCII 모드가 아닌 이진 모드로 파일을 전송해야합니다. – BalusC

답변

1

이렇게하는 것이 좋습니다. 나는 최근에 매우 유사한 인터페이스를 사용하여 여러 마우스로부터 입력을 읽는 프로젝트를 작성했습니다. 마우스의 바이너리 데이터는 파일 I/O를 통해 들어왔다.

버퍼링 된 I/O는 여기서는 부적절하다고 생각합니다. 버퍼링 된 I/O는 성능상의 이유로 버퍼를 채 웁니다. 하지만 앱이 새로운 캐릭터를 기다리는 데 대부분의 시간을 소비하고있는 것으로 보입니다. 대량으로 읽지 않는다면 원시 바이트 읽기 InputStream이 트릭을 수행합니다. 요청/예상 바이트 수 (사용자의 경우 1)를받은 직후에 리턴합니다. 귀하의 경우 > 문자를 읽은 후 다음 문자에 대해 다른 1 바이트 읽기를 발행합니다.

개입 문자를 어떻게 처리해야하는지 알아야합니다. >과 다음 문자를 처리했으면 >이 아닌 문자로 무엇을하고 싶습니까?

내 응용 프로그램에서 수행 한 작업은 InputStream에서 직접 단일 바이트를 읽는 것이 었습니다. 이것은 차단 될 것이므로 대부분의 시간을 기다리는 별도의 Thread으로 완료해야했습니다. 첫 번째 등장 인물이 등장했을 때, 나는 한 줌 더 읽는 것을 알았다. 이 정보를 내 앱의 나머지 부분에 전달하기 위해 대기열을 설정했기 때문에 스레드 간 통신을 위해 일종의 동기화를 수행해야합니다.

편집 : 포인트를 명확히하기위한 여러 개의 작은 편집. 이것이 혼란스러워지면 죄송합니다.