2014-01-06 3 views
3

이미지를 XML 파일로 인코딩했으며 디코딩 할 때 긴 실행 시간 (중간 크기 이미지의 경우 거의 20 분) 문제가 발생했습니다. 다음 코드는 현재 변환 방법을 보여줍니다 xml을 큰 이미지가있는 XML에 매우 오랜 시간이 걸리는 문자열로 변환하는 것은 다른 방법으로 XML을 짧은 시간 안에 문자열로 가져 오는 것입니다.매우 오랜 시간이 걸리는 XML 파일에서 읽기

String s1= new String(); 
System.out.println("Reading From XML file:"); 
    InputStream inst = new FileInputStream("c:/collection.xml"); 
    long size = inst.available(); 
     for(long i=0;i<size;i++) 
     { 
      s1=s1+ (char)inst.read(); 

     } 
    inst.close(); 

내 xml에 여러 이미지가 포함되어 있으면 문제가 악화됩니다.

+0

... btw, 왜 XML 파일을 문자열로 읽는 중입니까? 당신의 intesion이 문서를 파싱하는 것이라면, 파서에'InputStream'을 넘겨 주면됩니다.'String' 객체에 내용을 가질 필요가 없습니다. – A4L

+0

사실 저는 학생이고 그러한 임무를 받았습니다. 먼저 문자열을 읽은 다음 Base64를 사용하여 문자열을 읽습니다. – DCoder

답변

5

String s1 대신 StringBuilder를 사용하십시오. 문자열 연결 s1=s1+ (char)inst.read();이 문제입니다.

수정해야 할 또 다른 사항은 에서 바이트로 읽기가 매우 비효율적이기 때문에 BufferedInputStream을 사용하십시오.

그것은 가능한 사용하는 나쁜 생각,이 모든

StringBuilder sb= new StringBuilder(); 
    try (InputStream inst = new BufferedInputStream(new FileInputStream("c:/collection.xml"))) { 
     for(int i; (i = inst.read()) != -1;) { 
      sb.append((char)i); 
     } 
    } 
    String s = sb.toString(); 

에서

for(int i; (i = inst.read()) != -1;) { 
    ... 
} 

모두 더 나은 및 파일이 작은 경우 충분히

File file = new File("c:/collection.xml"); 
    byte[] buf = new byte[(int)file.length()]; 
    try (InputStream in = new FileInputStream(file)) { 
     in.read(buf); 
    } 
    String s = new String(buf, "ISO-8859-1"); 
+0

아무런 효과가 없습니다. JDK는이 예제의 코드를 StringBuilder 기반으로 변환하여 생성 된 바이트 코드를 확인합니다. – Mikhail

+0

내가 StringBuilder를 사용해야합니까? s2 = new StringBuilder (inst.read()); – DCoder

+0

왜 속도 변경을 시도하지 않습니까? –

2

다음 메모리에 맞게 첫째

String s1= new String(); 

은 String이 불변이고 모든 루프 반복마다 새 객체 (연결 결과)가 할당되므로 쓸모가 없습니다.

2, 루프

3를 사용하여 문자열을 구축하기 위해 StringBuilder를 사용하여, 그것은 훨씬 더 빨리 바이트에 의한 읽기 바이트 InputStream#read(byte[]) 또는 InputStream#read(byte[], int, int)를 사용하여 바이트 버퍼를 사용하여 읽을.

1

외에도 StringBuilder 솔루션은 이전의 대답에 제안에서, 당신은 극적 속도를 높이기 위해 다양한 방법을 시도 할 수 있습니다 :

  1. 을 사용 BufferedInputStream.
  2. 당신은 파일 크기를 알고 있습니다. java.io.Reader.read(char[] buf) 메서드를 사용하여 파일 크기의 char 버퍼를 할당하고 전체 파일 내용을 slurp 할 수 있습니다. 거대한 파일에주의하십시오. 거대한 파일을 긁어 모으면 OutOfMemoryException이 발생할 수 있습니다.
  3. XML 구문 분석기를 사용하여 XML 내용을로드합니다. 그들은 파일을 효율적으로 읽는 법을 알고 있습니다 (어쨌든, 당신이 사용하는 로직보다 구현에 의존적입니다). DOM 파서에주의하십시오. 파일이 큰 경우 OutOfMemoryException을 발생시킬 수 있습니다. 한 번에 하나씩 처리 할 수 ​​있도록 SAX 파서를 사용하여 읽을 수있는 각 이미지 내용의 이벤트를 얻을 수 있습니다.
관련 문제