2011-11-17 2 views
2

지정된 폴더의 파일이 텍스트 렌더링인지 여부를 어떻게 알 수 있습니까? (예 : csv, html 등 텍스트로 표시 할 수있는 파일)파일이 텍스트 렌더링인지 여부를 확인하는 방법은 무엇입니까? (Java)

확장 검색 (.txt, .html 확장자 확인)을 통해이 작업을 수행하고 싶지 않습니다.

jpg 파일이있는 경우 의도적으로 확장명을 .txt로 변경하고 여전히 java 코드가이 파일 (.txt extn을 사용하더라도)을 텍스트로 렌더링 할 수 없음을 감지 할 수 있어야한다고 가정합니다.

어떻게 이것을 자바로 만들 수 있습니까?

답변

1

파일을 스캔하고 Character.html#isISOControl을 사용하여 인쇄 할 수없는 문자가 포함되어 있는지 확인하여 유형을 추측 할 수 있습니다.

이진 파일에는 대개 제어 문자가 포함 된 헤더가 포함되어 있습니다. list of File Signatures 대부분이 isISOControl에 의해 감지됩니다.

0

가로 "으로 표시 할 수 계산 어떤 의견의 문제이기 때문에 나는이 작업을 수행 할 수있는 100 % 절대 안전한 방법이라고 생각하지 않습니다 text "...하지만 영어 텍스트로 제한해도 괜찮 으면 파일의 바이트를 검사 할 수 있습니다. 대부분 또는 모든 바이트 값이 32에서 126 (십진수 부호가 없음)이면 가능하면 vanilla ASCII text입니다.

+0

CR \ LF 잊지 마세요. – Jimmy

+0

그래, 그리고 탭도! –

0

이것은 통계적 패턴 매칭을 요구합니다. 예를 들어, 영어로만 작업하는 경우 처음 100 자에 "외국"문자가 몇 개나 있는지 확인할 수 있습니다. 이것은 이것이 텍스트 문서인지 아닌지에 대한 좋은 아이디어를 줄 것입니다. a..zA..Z0..9 [punctutation]이 아닌 너무 많은 문자가있는 경우 텍스트가 아닌 것으로 추측 할 수 있습니다. 영어 파일 및 ASCII 문자 목록을 사용하여 표현할 수있는 언어로 작업 할 때 상대적으로 안전해야합니다.

물론 외국어로 작업하기 시작한 순간이 중 일부는 특수 문자로 표시 될 수 있지만 언어를 사용하지 않는 사람에게는 사용되지 않습니다.

또 다른 대안은 Java에서 클래스 파일이 특정 헤더로 시작하는 것처럼 파일 표시자를 사용하고 파일의 값을 헤더 라이브러리와 비교하는 것입니다. 파일이 기록에 없을 수도 있으므로 텍스트 파일이라고 생각할 수도 있으므로 성 가시고 오류 발생 가능성이 높습니다.

-1

허용되는 MIME 유형 목록을 유지 한 다음 읽고있는 파일의 MIME 유형을 가져올 수 있습니다. 그것이 잘 맞으면.

import javax.activation.MimetypesFileTypeMap; 
import java.io.File; 

class GetMimeType { 
    public static void main(String args[]) { 
    File f = new File("gumby.gif"); 
    System.out.println("Mime Type of " + f.getName() + " is " + 
         new MimetypesFileTypeMap().getContentType(f)); 
    // expected output : 
    // "Mime Type of gumby.gif is image/gif" 
    } 
} 

http://www.rgagnon.com/javadetails/java-0487.html

+0

이것은 확장을 통해 이루어집니다. MIME 형식은 내용에서 유추되지 않습니다. –

+0

'MimetypesFileTypeMap'이 잘못되었습니다! 존재하지 않는 파일에 대해 어떻게 mimetype을 가질 수 있습니까? 이것은 기본적으로 확장을 검사한다는 것을 의미합니다. (아니 내 downvote) – Mob

+0

@ YannRamin 그래, 내 나쁜, 코드를 테스트, 그게 나쁜 ... 그것을 지적 주셔서 감사합니다. – Zohaib

0

a Character#isISOControl의 사용은 좋은 일이있다. 인코딩도 고려해야합니다 (p.ex.UTF-8).여기 내 기능 :

/** 
* Test is a file is a text file. It is the case only if it has no well-known control characters. 
* (see {@link Character#isISOControl(int)}) 
* @param file 
* @return 
* @throws IOException 
*/ 
public static boolean isTextFile (final File file) throws IOException 
{ 
    BufferedInputStream is = null; 
    try 
    { 
     final BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-16")); 

     boolean isText; 
     int read; 
     do 
     { 
      read = in.read(); 
      isText = read == -1; 
      isText |= read == 13; // newline 
      isText |= read == 10; // newline 
      isText |= read == 9; // tab 
      isText |= !Character.isISOControl(read); 
     } 
     while (isText && read != -1); 

     return isText; 
    } 
    finally { 
     if (is != null) 
     { 
      try 
      { 
       is.close(); 
      } 
      catch (IOException e) 
      { 
       throw new Error(e); 
      } 
     } 
    } 
} 
관련 문제