2011-01-15 4 views
2

줄 위치 n의 줄에 파일을 쓰려고합니다.특정 줄을 파일에 작성하십시오.

줄 n이 없어도. 이 경우 파일은 빈 행으로 커져 n에 도달해야합니다. 기본적으로 writer.writeLine(n, mycontent)과 같은 것입니다. 내 컨텐츠는 ObjectOutputStream의 2 진 표현입니다. 파일의 각 행에는 일련 화 된 오브젝트가 들어 있습니다. 행 번호가 색인입니다.

특정 줄에 어떻게 쓸 수 있습니까? - FileUtils 또는 비표준 API 구성 요소를 사용하지 않고.

This answer 내가 원하는 것을 요약 해 놓았으나 글쓰기가 다른 것처럼 보입니다.

편집 : I 인해 현재 값을 읽는 파일을 통해 의견

+0

BufferedWriter가 ObjectOutputStream에 래핑 되었습니까? 조금 더 명확히 할 수 있습니까? –

+2

귀하의 질문은 매우 불분명합니다. ObjectOutputStream는, 바이너리 데이터를 기입합니다. ObjectOutputStream에는 「라인」이라고하는 개념은 없습니다. –

+0

죄송합니다, 제 질문을 업데이트했습니다. 나는 line-number를 인덱스로 사용하여 "container"파일에서 다시 직렬화 된 객체를 조회한다. 문제는 행 번호가 색인 인 경우 파일 내에서 쓸 위치를 선택할 수 있어야한다는 것입니다. 그리고 전적으로 캐시하고 싶지 않습니다. – wishi

답변

2

선의 개념은 매우 중요합니까? 그렇지 않으면 아마도 파일에서 Map을 직렬화하고이를 사용하여 특정 인덱스에서 오브젝트를 쓰거나 읽을 수 있습니다 (이 경우 인덱스는 맵의 핵심입니다).

다음은 약간의 예입니다.

public static void main(String[] args) throws Exception { 
    ObjectOutputStream tocStream = new ObjectOutputStream(new FileOutputStream("myfile.toc")); 
    Map<Integer,Object> tableOfContent = new HashMap<Integer, Object>(); 
    String myString = "dataOne"; 
    Date myDate = new Date(); 
    tableOfContent.put(0,myDate); 
    tableOfContent.put(1,myString); 
    tocStream.writeObject(tableOfContent); 
    tocStream.flush(); 
    tocStream.close(); 
    ObjectInputStream tocInputStream = new ObjectInputStream(new FileInputStream("myfile.toc")); 
    Map<Integer,Object> restoredTableOfContent = (Map<Integer, Object>) tocInputStream.readObject(); 
    Object restoredMyString = restoredTableOfContent.get(1); 
    System.out.println(restoredMyString); 
    tocInputStream.close(); 
} 
+0

재 작성해야하는 것을 피하고 싶었습니다. 불가능한 것 같아요 ... 직렬화 된 개체를 포함하는 해당 파일에 대한 업데이트를 실현하는 방법을 잘 모르겠습니다. 그것은 커질지도 모른다. 아직도 나는 이것이 길을 선도한다고 생각한다. 감사. – wishi

0
  • 루프에 내 질문에 명확히.
  • 각 값을 새 임시 파일에 씁니다.
  • 이전 파일 이 줄 번호 앞에 끝나는 경우 은 빈 줄을 쓰십시오.
  • 그런 다음 한 번 라인 번호를 얻으려면 새 데이터를 업데이트하려면 을 업데이트하십시오.
  • 이전 행에 더 많은 행이있는 경우 파일을 계속 작성하십시오.
  • 이전 파일을 삭제하십시오. 임시 파일의 이름을 바꿉니다.
+0

정말 필요한가요? 나는 하나의 변화로 모든 것을 다시 쓰고 싶지 않습니다. – wishi

+0

예. 그래서 데이터를 저장하는 데이터베이스 나 다른 구조가 더 나은 선택 일 수 있습니다. – jzd

+0

간단한 제안 사항이 있으십니까? 나는 이것에 대한 경험이 없으며 너무 복잡해지고 싶지 않다. – wishi

2

각 직렬화 된 개체에 이진 표현의 일부로 하나 이상의 줄 바꿈 문자가 포함될 수 있기 때문에이 방법은 작동하지 않습니다. 따라서 3 번째 줄에 새 객체를 작성하면 첫 번째 객체의 이진 표현의 중간에 객체를 작성할 수 있습니다. 테스트를 :

  1. (예를 들어, 이진 데이터와 함께 작동하는 프로토콜을 선택합니다 : 각 개체에 대해 바이트의 길이를 (쓰기)를 같은

    public class OOSTest { 
        public static void main(String[] args) throws IOException { 
         String s = "Hello\nWorld"; 
         ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
         ObjectOutputStream oos = new ObjectOutputStream(bos); 
         oos.writeObject(s); 
         oos.flush(); 
         oos.close(); 
         System.out.println(new String(bos.toByteArray())); 
        } 
    } 
    

    IMHO, 당신은 세 가지 선택이있다

  2. 예를 들어 Base64를 사용하여 직렬화 된 바이트를 문자열로 인코딩하고 인코딩의 일부가 아닌 객체 사이에 구분 기호를 사용합니다.
  3. 직렬 출력의 ObjectOutputStream Object의 배열을 나타냅니다. 새로운 항목을 쓰는 것은 배열의 비 직렬화, 올바른 크기의 배열인지 또는 적절한 크기의 새로운 배열로 복사, 객체의 위치에 삽입, 전체 배열의 재 배열로 구성됩니다.
+0

여전히 특정 줄 위치에서 어떻게 쓸 수 있는지 명확하지 않습니다 ... 매우 복잡해 보입니다. – wishi

관련 문제