2012-08-24 2 views
0

몇 가지 데이터를 Java에서 다양한 방법으로 저장해야하는데, File, String, System.out ... 그리고 3 가지 방법으로 거의 동일한 작업을 수행했습니다. 그래서 매개 변수로 OutputStream을 사용하여 단일 메소드로 변경했습니다. 단일 OutputStream에 몇 가지를 썼습니다. 어떤 텍스트, 직렬화 된 객체, 다른 직렬화 된 객체, 일부 수치 데이터 ...각각의 InputStream에 대해 다른 유형의 데이터를 사용하여 동일한 InputStream에서 서로 다른 데이터 그룹을 읽을 수 있습니까?

하지만 지금은 붙어 있습니다. 나는 내가 쓰여진 다른 것들을 구별 할 수 없다는 사실을 간과했다. 데이터에 대해 InputStream을 만듭니다. 먼저 해당 스트림에서 Scanner을 사용하여 텍스트를 읽은 다음 ObjectInputStream을 사용하여 직렬화 된 객체를 읽으려고했지만 EOFException이 표시됩니다.

스캐너가 앞서 읽는 것 같습니다. 스캐너가 앞으로 읽히지 않게하려면 어떻게합니까?
아니면 각자 적절한 InputStream을 사용하여 각 그룹의 데이터를 읽을 수 있습니까?

+1

그래서 Scanner * 및 * ObjectInputStream을 사용하여 읽을 InputStream이 있습니까? – aioobe

+0

예, 가능하다면 – neXus

+1

당신은 텍스트인지 여부를 결정해야합니다. 예 : 스캐너 또는 바이너리 ObjectInputStream. 자신이하는 일을 실제로 알고 있다면 혼합 할 수는 있지만 이것은 좋은 아이디어는 아닙니다. 즉 그 끔찍한 엉망이 될 가능성이 더 큽니다. –

답변

2

같은 스트림에서 읽기 위해 다른 독자를 사용하지 않으려 고합니다. 머신에서 작동하도록 관리하더라도 다른 OS 또는 다른 JVM 구현으로 실행할 때 중단 될 수 있습니다.

데이터를 읽고 쓰는 단일 방법을 선택해야합니다. 스트림에서 직렬화 된 객체를 사용하고 있기 때문에 모든 것을 사용하는 것이 가장 좋습니다. 문자열을 통해 이진 데이터를 읽고 올바르게 해석하는 것이 매우 어려울 것이라는 의견을 이미 지적했습니다. 그러나 String 객체를 가져 와서 출력 스트림에 쓰고 다시 읽은 다음 String으로 캐스팅하는 것은 어렵지 않습니다.

이제 데이터를 해석하는 데 문제가 있습니다. 필자는 모든 것을 태그 - 데이터 쌍으로 작성하는 것이 좋습니다. 정수를 먼저 작성한 다음 (프로그램에서 사용하기 쉽게 열거 형의 서수 일 수도 있음), 데이터를 작성합니다. 정수는 스트림에서 다음에 오는 데이터 유형 (예 : 텍스트 또는 객체)을 나타내며, 다음에 읽는 객체는 데이터이고 사용자는 그 유형을 알고 있습니다. 텍스트 인 경우 객체를 문자열로 캐스팅하여 스캐너에 전달할 수 있습니다. 객체 인 경우 객체로 수행해야하는 작업을 수행하면됩니다.

좀 더 깔끔하게 만들려면 각 데이터 유형에 대한 메소드를 사용하여 스트림 주변에 래퍼를 작성할 수 있습니다. 어쩌면 당신은 getNextObject() 방법과 getNextTextScanner() 방법을 가질 수 있습니다. 각각은 먼저 스트림의 다음 Integer 태그를 검사하여 올바른 데이터를 읽었는지 (불일치를 발견하면 예외를 throw 함) 다음 객체를 반환하거나 데이터 문자열을 처리하기 위해 새 Scanner를 반환합니다.

실제로 두 가지 유형의 데이터에 대해 별도의 스트림을 사용할 수 있다면 더 좋을 것입니다. 그러나, 만약 당신이 정말로 같은 물줄기를 사용하여 붙어 있다면 나는 그것을 어떻게 할 것입니다.

+0

이것은 훌륭하고 분명한 대답입니다. 이러한 사용자 지정 스트림을 구현하려고했습니다. 문제는 내가 아는 한 직렬화는 ObjectOutputStream 및 ObjectInputStream을 통해서만 수행 할 수 있다는 것입니다. 이 클래스의 구현은 JVM에 많은 영향을주는 것으로 보입니다. 그것들은 순수 자바 코드가 아닙니다. 나는 분명히 자신의 직렬화 메커니즘을 발명하지 않고는 자신의 행동을 재현 할 수 없다. 나는 원하지 않는다. 나는 그 스트림을 후드 아래에서 사용해야 할 것 같다. 나는 내일 일하도록 노력할 것이다. – neXus

관련 문제