2012-10-08 4 views
1

파일에 HashMap이있는 personHashMap.ser 파일이 있습니다.파일의 새 내용 만 5 분마다 업데이트하십시오.

String file_path = ("//releasearea/ToolReleaseArea/user/personHashMap.ser"); 
public void createFile(Map<String, String> newContent) { 
    try{ 
     File file = new File(file_path); 

     FileOutputStream fos=new FileOutputStream(file); 
     ObjectOutputStream oos=new ObjectOutputStream(fos); 

     oos.writeObject(newContent); 
     oos.flush(); 
     oos.close(); 
     fos.close(); 

    }catch (Exception e){ 
     System.err.println("Error in FileWrite: " + e.getMessage()); 
    } 

} 

지금 내가 원하는, 프로그램이 실행되는 모든 오분 만 변경 내용으로 파일 personHashMap.ser을 업데이트 : 여기에 내가 그것을 만드는 방법 코드입니다. 그래서 내가 전화 한 방법 :

public void updateFile(Map<String, String> newContent) { 
    Map<String, String> oldLdapContent = readFile(); 
    if(!oldLdapContent.equals(ldapContent)){ // they arent the same, 
              // so i must update the file 

    } 

} 

그러나 지금 나는 그것을 실현할 수있는 아이디어가 없습니다.
그리고 새 콘텐츠 만 업데이트하면 성능이 향상됩니까? 아니면 전체 파일을 치료하고 새 목록을 다시 삽입해야합니까?

당신이 날 도울 수 있기를 바랍니다 ..

편집이 :

해시 맵은 즉 street=Example Street이 포함되어 있습니다.
하지만 이제는 새로운 거리가 New Example Street입니다. 이제 파일에서 HashMap을 업데이트해야합니다. 그래서 난 그냥

+0

'System.err.println ("FileWrite :"+ e.getMessage()); '오류 - 스택 추적을 잃어 버리고 프로그램이 실제로 실행되지 않아야합니다. 'RuntimeException'으로 다시 던지기가 더 좋습니다. – artbristol

+0

@artbristol : 감사합니다.하지만 먼저 코드를 실행하고 싶습니다. 그 후 오류를 잡습니다. –

+0

@dTDesing 예,하지만 코드가 디버깅하는 동안 오류를 catch하는 것이 더 어렵습니다. – artbristol

답변

2

먼저 HashMap은 실제로 적절한 선택이 아닙니다. 직렬화가 아닌 메모리 내 사용을 위해 설계되었습니다 (물론 표준 방식으로 직렬화 할 수 있음). 그러나 2kb 일 경우 업데이트 된 데이터가 아닌 전체를 작성하십시오.

둘째,이 다소 간단한 방법의 성능에 지나치게 걱정되는 것처럼 보입니다 (2KB의 경우 쓰기 시간은 불과 밀리 초 정도 걸립니다). 나는 일관성과 동시성 문제에 대해 더 걱정할 것이다. JavaDB 나 h2와 같은 경량의 데이터베이스를 사용하는 방법을 살펴 보시기 바랍니다.

+0

+1입니다. 그러나 HashMap을 사용하여 작업하기 쉽습니다. 다시 사용하려면지도를 어떻게 저장해야합니까? 파일이 너무 작을 것이라고 확신하지 못합니다. –

+0

@dTDesign 전체 내용을 다시 작성하십시오. 때까지 성능에 대해 걱정하지 마십시오. 방대한 양의 데이터로 프로그램을 테스트하고 어떤 일이 발생하는지 확인하십시오. – artbristol

+0

감사합니다. 나는 그렇게한다. 그러나 학습 효과를 위해 나는 다른 버전을 시도해보고 싶습니다. 답변을 수락합니다. 마자 내 방법에 대한 해결책을 발견, 나는 내 대답에 게시 할 수 있습니다. 도움에 감사드립니다. –

0

당신은 루프에서 updateFile 메서드를 호출하고 5 분간 (5 * 60 * 1000 밀리 초)에 대한 수면를 호출 할 수 있습니다 ... 새로운 내용을 추가 할 수 없습니다.

Thread.Sleep(300000); // sleep for 5 minutes 

당신이 사용할 수있는 기존 파일에 추가하려면 :

FileOutputStream fooStream = new FileOutputStream(file, true); 
+0

네, 벌써 찾았지만, 고마워. 큰 질문은 파일의 업데이 트입니다 ... –

+0

그냥 콘텐츠의 끝 부분에 추가하는 경우 추가는 항상 최선의 선택이 될 것입니다 .. –

+0

아니, 변경된 내용이 아니라 첨부해야합니다. .. –

0

생성자 FileOutputStream(File file, boolean append)를 사용 trueboolean append을 설정합니다. 기존 파일에 텍스트를 추가합니다.

+0

나는 추가가 올바른 방법이라고 생각하지 않습니다. 제 편집을보세요. –

+0

두 옵션을 사용하면 'append false'를 설정하여 변경 사항을 덮어 쓸 수 있습니다. 다른 옵션은 - 이미 파일이 존재하는 경우 내용을'String'으로 구문 분석하거나'Regex'를 사용하여 변경 내용을 대체하는 것입니다. 이 위대한 답변은 – Pr38y

관련 문제