Java- 라인별로 파일을 읽고 중지 한 다음 즉시 중지 된 곳에서 바이트를 읽기 시작할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1341396

문제

파일의 ASCII 부분을 구문 분석하는 데 문제가 있으며, 끝 태그를 누르면 즉시 해당 시점에서 바이트에서 읽기 시작합니다. 내가 자바에서 아는 모든 줄을 읽거나 전체 단어를 읽으면 버퍼가 생겨서 스톱 포인트 직후 바이트를 얻을 가능성이 있습니다. 이것을 바이트별로 읽고, 새로운 선을 찾고, 새 라인 전에 모든 것을 재구성하고, 그것이 내 엔드 태그인지 확인하고 거기에서 이동하는 유일한 방법입니까?

도움이 되었습니까?

해결책

이 파일은 얼마나 큽니까? 나의 첫 번째 생각은 모든 것을 바이트 버퍼 또는 바이 테어 아웃 푸트 스트림으로 읽지 않고 바이트 값을 비교하여 태그를 찾는 것입니다. 텍스트 부분이 어디에서 끝나고 이진 부분이 시작되는지 알면 각 부분을 적절하게 처리합니다.

다른 팁

가능하지만 API의 클래스를 알지 못하는 한.

수동으로 할 수 있습니다. BufferedInputStream, 지원하는 mark/reset. 블록별로 읽습니다 (byte[]) 그리고 당신은 그것을 ASCII로 구문 분석합니다. 결국 마커에 닿을 때까지 버퍼로 축적됩니다. 하지만 당신 앞에 read 당신은 전화합니다 mark. ASCII에서 필요한 모든 것을 읽은 것으로 생각되면 reset 그리고 당신은 전화합니다 read ASCII 부분의 나머지 부분을 덤프합니다. 그리고 지금 당신은 a BufferedInputStream (이것은 InputStream) 파일의 이진 부분을 읽을 준비가되었습니다.

가장 좋은 아이디어는 "선"의 개념을 포기하는 것입니다. 엔드 태그를 찾으려면 a를 만듭니다 링 버퍼 그것은 엔드 태그를 포함 할만 큼 충분히 큽니다. 바이트 바이트를 읽고, 각 바이트 후에 태그가 포함되어 있는지 확인하십시오.

보다 정교하고 효율적인 검색 알고리즘이 있지만 차이는 더 긴 검색어와 관련이 있습니다 (아마도 최종 태그는 짧음).

예, 당신은 바이트 바이트에 대해 옳습니다. 추상화에는 단점이 있습니다.

파일이 성장하고 있습니까, 아니면 정적입니까?

정적 인 경우 참조하십시오 http://java.sun.com/javase/6/docs/api/java/nio/mappedbytebuffer.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top