2011-11-21 3 views
4

나는 블로그와 뉴스 웹 사이트의 대규모 컬렉션에 대한 액세스를 제공하는 서비스에서 전체 HTML을 수집합니다. 나는 (실시간으로) HTML이 몇 가지 키워드를 포함하는지 확인하기 위해 HTML을 검사하고있다. 여기에 키워드 중 하나가 포함되어 있으면 HTML을 텍스트 파일에 작성하여 저장합니다.자바 텍스트 파일 크기 (파일이 닫히기 전에)

일주일 동안하고 싶습니다. 따라서 많은 양의 데이터를 수집하고 있습니다. 3 분 동안 프로그램을 테스트하면 100MB의 텍스트 파일이 생성되었습니다. 4 TB의 공간이 있으며 이보다 더 많은 공간을 사용할 수 없습니다.

또한 텍스트 파일이 너무 커지는 것을 원치 않습니다. 왜냐하면 내가 열 수 없게 될 것이라고 생각하기 때문입니다.

내가 제안하는 것은 텍스트 파일을 열고 HTML을 작성하여 크기를 자주 확인하는 것입니다. 200MB보다 크면 텍스트 파일을 닫고 다른 파일을 엽니 다. 또한 총 공간에서 사용한 공간의 로그를 유지해야하므로 4TB에 가깝지 않도록 할 수 있습니다.

이 시점에서 내가 가진 질문은 파일이 닫히기 전에 (FileWriter.close() 사용) 텍스트 파일의 크기를 확인하는 방법입니다. 이 기능이 있습니까? 아니면 파일에 기록 된 문자 수를 계산하여 파일 크기를 예측하는 데 사용해야합니까?

별도의 질문 : 텍스트 파일의 공간을 최소화하는 방법이 있습니까? 나는 자바에서 일하고있다.

+2

별도의 질문은 실제로는 별도의 질문이어야합니다. – beny23

답변

5

작성한 글자 수를 세는 라이터를 작성하고 이것을 사용하여 OutputStreamWriter을 랩핑하십시오.

[EDIT] 주 : 텍스트 파일을 저장하는 올바른 방법은 :

new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding))); 

부호화가 중요하다; 일반적으로 "UTF-8"입니다.

이 체인은 랩퍼를 삽입 할 수있는 두 가지 위치를 제공합니다. 글자 수를 얻기 위해 작성자를 감싸거나 쓸 문자를 얻기 위해 내부의 OutputStream을 얻을 수 있습니다.

+0

좋습니다, 감사합니다. 나는 이것을 시도 할 것이다. 캐릭터에 필요한 바이트 수를 어떻게 알 수 있습니까? – Andrew

+0

영어 웹 페이지를 처리하는 경우 각 문자는 1 바이트를 사용합니다. UTF-8 인코딩은 꽤 간단합니다. 하지만 당신은 또한 당신에게 바이트를주는'FileOutputStream'을 래핑 할 수 있습니다. –

+0

확인. 나는 이것으로 실험해볼 것이다. 방법은 내가 문자를 계산할거야 (아마도 이것은 올바른 방법이 아닙니다) 파일에 쓸 모든 문자열에 자바 문자열 길이 방법을 사용하여 누계를 유지하는 것입니다 – Andrew

2

파일에 쓸 수있는 바이트 수를 계산할 수 있습니까?

+0

나는 본질적으로 내가하고 싶은 것을 추측한다. 나는 아론이 제안한 것처럼 파일에 기록 된 문자의 수를 세어 계산한다. – Andrew

+0

예, 아론의 답변에도 투표했습니다. 나는 그것이 그렇게하는 방법이라고 생각한다. – Thom

3

공간을 최소화하려면 텍스트 파일을 Java로 zip 수 있습니다. 파일을 닫은 후에 각 파일을 zip에 추가해보십시오. 압축 후에는 zip 크기를 확인하여 누적 스토리지 소비량을 확인할 수 있습니다.

+0

감사합니다! 그래서 분명하지만 난 심지어 그것을 생각하지 않았다. – Andrew

3

HTML은 높은 압축률로 쉽게 압축됩니다. 텍스트 파일이 차지하는 공간을 최소화하려면 GZIPOutputStream을 사용하는 것이 좋습니다.

이 자바에 있어야합니까 : 약간 주제에서 벗어난 것에 대한

+0

감사합니다. 나는 이것을 조사 할 것이다. – Andrew

0

사과? 피드의 데이터를 얻을 방법에 따라,이

+0

자바를 잘 아는 것처럼 최선을 다하는 것, 다른 모든 것들은 자바로 작성되었습니다. – Andrew

1
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 


public class TestFileWriter { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     FileWriter fileWriter= new FileWriter("test.txt"); 
     for (int i=0; i<1000; i++) { 
      fileWriter.write("a very long string, a very long string, a very long string, a very long string, a very long string\n"); 
      if ((i%100)==0) { 
       File file=new File("test.txt"); 
       System.out.println("file size=" + file.length()); 
      } 
     } 
     fileWriter.close(); 
     File file=new File("test.txt"); 
     System.out.println("file size=" + file.length()); 

    } 

} 

이 예제는 경우 있음을 보여줍니다 (... 압축, 키워드 gzip을 확인하기위한 grep 또는 fgrep) 나에게 매우 간단한 쉘 스크립트 작업 같은 소리 당신은 파일 작가를 쓰고있는 동안 실시간으로 그 크기를 얻을 수 있고 작가는 열려 있습니다. 공간을 절약하려면 스트림을 압축 할 수 있습니다.

3

나는 아론의 대답을 계속한다.CountingOutputStream을 사용할 수 있습니다. 단지 CountingOutputStream을 사용하여 FileOutputStream을 래핑하면 이미 작성한 바이트 수를 알 수 있습니다.

관련 문제