주요 콘텐츠로 건너뛰기

CooLWJ 검색

选择搜索范围,输入关键词后按回车。

언어

java file로 파일 유형 알아내기

Java 개발에서는 파일 형식을 판별해야 하는 상황이 자주 발생합니다. 예를 들어 파일 업로드 기능에서는 사용자가 올린 파일이 요구되는 형식에 맞는지 판별해야 합니다. 이 글에서는 Java로 파일 형식을 알아내는 방법을 자세히 소개합니다.

一、파일 확장자로 파일 유형 판단하기

파일 형식을 판단하는 가장 일반적인 방법은 파일 확장자를 확인하는 것이다. 운영체제에서 대부분의 파일에는 특정한 확장자가 있으며, 예를 들어 텍스트 파일의 확장자는 보통.txt,이미지 파일의 확장자는 보통.jpg또는.png등등.

Java 프로그램으로 파일 확장자를 가져오는 것은 매우 간단하며, 다음을 사용하기만 하면 된다String클래스의substring메서드를 사용하면 됩니다. 코드는 다음과 같습니다:

public static String getFileExtension(File file) {
    String fileName = file.getName();
    if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    } else {
        return "";
    }
}


이 메서드는 하나의 File객체를 매개변수로 전달한 다음 사용합니다lastIndexOf메서드로 파일명에서 마지막 점의 위치, 즉 확장자가 시작되는 위치를 찾은 다음, substring메서드는 확장자 문자열을 가져와 반환합니다. 파일에 확장자가 없으면 빈 문자열을 반환합니다.

다음 코드로 이 메서드를 테스트할 수 있다:

File file = new File("C:/path/to/file.txt");
String extension = getFileExtension(file);
System.out.println(extension);


실행 결과는 다음과 같다:

txt

이 방법으로 파일 형식을 판별하면 다음과 같은 장점이 있습니다:

  • 사용하기 쉽고 코드 구현이 간결하다.

  • 대부분의 파일에는 확장자가 있으므로, 대부분의 파일에 유효하다.

그러나,이 방법에도 몇 가지 단점이 있다:

  • 파일 확장자는 변경될 수 있어 판별 결과가 잘못될 수 있다.

  • 확장자가 없는 실행 파일처럼, 일부 파일에는 확장자가 없습니다.

파일 유형을 더 정확하게 판단하려면 파일의 매직 넘버도 함께 활용할 수 있다.

Java에서 파일 형식 가져오기를 주제로 한 이미지

둘째、파일 매직 넘버로 파일 형식 판별하기

파일 매직 넘버는 파일의 첫 몇 바이트에 있는 특정 바이트로, 파일 형식을 식별하는 데 쓰인다. 파일 매직 넘버를 식별하면 확장자에 영향을 받지 않고 파일 형식을 정확하게 판별할 수 있다.

Java에서는 파일의 바이너리 데이터를 읽어 파일의 매직 넘버를 얻을 수 있다.

2.1 파일의 바이너리 데이터 읽기

우리는 사용할 수 있습니다.FileInputStream클래스로 파일의 바이너리 데이터를 읽습니다. 다음 메서드는 파일의 바이너리 데이터를 담은 바이트 배열을 반환합니다:

public static byte[] readFileToByteArray(File file) throws IOException {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        byte[] data = new byte[(int)file.length()];
        fis.read(data);
        return data;
    } finally {
        if (fis != null) {
            fis.close();
        }
    }
 }


위 방법은 다음을 사용했습니다FileInputStream로 파일을 열고 데이터를 읽어 바이트 배열에 저장합니다. 파일 읽기가 끝나면 반드시 호출해야 합니다.close메서드로 파일 스트림을 닫아,시스템 자원을 해제한다。

2.2 파일 매직 넘버로 파일 유형 판단하기

파일의 바이너리 데이터가 있으면 파일 형식을 판별할 수 있다. 각 파일 형식에는 특정한 매직 넘버가 있으며, 이 매직 넘버를 바탕으로 파일 형식을 판별할 수 있다. 다음은 흔히 쓰이는 파일 형식의 매직 넘버와 그에 따른 판별 방법이다:

  • 텍스트 파일(.txt)의 매직 넘버는EF BB BF(UTF-8로 인코딩된 파일의 시작 부분에 이 바이트 시퀀스가 있다),다음 방법으로 판단할 수 있다:

    public static boolean isTextFile(byte[] data) {
      if (data.length >= 3 && data[0] == -17 && data[1] == -69 && data[2] == -65) {
          return true;
      }
      return false;
    }


  • JPEG 이미지(.jpg)의 매직 넘버는FF D8 FF,다음 방법으로 판단할 수 있다:

    public static boolean isJPEGFile(byte[] data) {
      if (data.length >= 3 && data[0] == -1 && data[1] == -40 && data[2] == -1) {
          return true;
      }
      return false;
     }


  • PNG 이미지(.png)의 매직 넘버는 89 50 4E 47 0D 0A 1A 0A,다음 방법으로 판단할 수 있다:

    public static boolean isPNGFile(byte[] data) {
      if (data.length >= 8 && data[0] == -119 && data[1] == 80 && data[2] == 78 && data[3] == 71 &&
          data[4] == 13 && data[5] == 10 && data[6] == 26 && data[7] == 10) {
          return true;
      }
      return false;
    }


필요에 따라 더 많은 파일 유형과 그에 대응하는 매직 넘버 판별 메서드를 추가할 수 있습니다.

2.3 전체 예제

다음은 파일 매직 넘버를 사용하여 파일 형식을 판별하는 방법을 보여 주는 완전한 예제입니다:

import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class FileTypeChecker {
    public static void main(String[] args) {
        File file = new File("C:/path/to/file.jpg");
        try {
            byte[] data = readFileToByteArray(file);
            if (isJPEGFile(data)) {
                System.out.println("This is a JPEG file.");
            } else if (isPNGFile(data)) {
                System.out.println("This is a PNG file.");
            } else if (isTextFile(data)) {
                System.out.println("This is a text file.");
            } else {
                System.out.println("Unknown file type.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static byte[] readFileToByteArray(File file) throws IOException {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            byte[] data = new byte[(int)file.length()];
            fis.read(data);
            return data;
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
    }

    public static boolean isTextFile(byte[] data) {
        if (data.length >= 3 && data[0] == -17 && data[1] == -69 && data[2] == -65) {
            return true;
        }
        return false;
    }

    public static boolean isJPEGFile(byte[] data) {
        if (data.length >= 3 && data[0] == -1 && data[1] == -40 && data[2] == -1) {
            return true;
        }
        return false;
    }

    public static boolean isPNGFile(byte[] data) {
        if (data.length >= 8 && data[0] == -119 && data[1] == 80 && data[2] == 78 && data[3] == 71 &&
            data[4] == 13 && data[5] == 10 && data[6] == 26 && data[7] == 10) {
            return true;
        }
        return false;
    }
 }


위 예제 코드는 파일의 매직 넘버를 기준으로 파일 형식을 판단하고 해당 결과를 출력한다。

삼、외부 라이브러리를 사용해 파일 형식 판별하기

위의 방법 외에도 서드파티 라이브러리를 사용해 파일 유형을 판단할 수 있습니다. Java에는 파일 유형을 더 편리하게 알아낼 수 있도록 도와주는 오픈 소스 서드파티 라이브러리가 있습니다.

3.1 Tika

Tika 는 Apache Software Foundation의 프로젝트로,텍스트、이미지、오디오、동영상 등 다양한 파일 형식을 분석하는 오픈 소스 Java 라이브러리를 제공한다。Tika를 사용하면 파일 유형을 포함한 파일의 메타데이터를 추출할 수 있다。

먼저 Tika 라이브러리 의존성을 추가해야 합니다. Maven으로 프로젝트를 빌드한다면, 다음 위치에 pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.27</version>
</dependency>


그다음, 아래 코드를 사용해 파일 형식을 확인할 수 있다:

import org.apache.tika.Tika;
public class FileTypeChecker {
    public static void main(String[] args) {
        Tika tika = new Tika();
        try {
            File file = new File("C:/path/to/file.jpg");
            String fileType = tika.detect(file);
            System.out.println("File type: " + fileType);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


위 코드를 실행하면,파일 유형이 출력된다。

Tika는 파일 확장자, 매직 넘버 등 다양한 방법으로 파일 형식을 식별한다. 사용자 정의 감지기도 지원하므로 필요에 따라 파일 형식 판별 규칙을 직접 추가할 수 있다.

3.2 FileTypeDetector

Java는 파일 유형을 판별하는 표준 API를 제공한다. 바로 FileTypeDetector인터페이스와ProbeContentType클래스. 이 인터페이스를 구현하면 파일 형식 감지기를 직접 정의할 수 있다.

다음은 사용자 정의 파일 형식 감지기의 예제다:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.spi.FileTypeDetector;

public class CustomFileTypeDetector extends FileTypeDetector {
    @Override
    public String probeContentType(Path path) throws IOException {
        String extension = getFileExtension(path.toFile());
        if ("txt".equals(extension)) {
            return "text/plain";
        } else if ("jpg".equals(extension) || "jpeg".equals(extension)) {
            return "image/jpeg";
        } else if ("png".equals(extension)) {
            return "image/png";
        } else {
            return null;
        }
    }

    private String getFileExtension(File file) {
        String fileName = file.getName();
        if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        } else {
            return "";
        }
    }
  }

이 예제에서는 파일 확장자로 파일 형식을 판단하고, 해당하는 MIME 유형을 반환한다.

사용자 정의 파일 형식 감지기를 사용하려면 프로그램 진입점에 다음 코드를 추가하세요:

File file = new File("C:/path/to/file.jpg");
Path path = file.toPath();
String fileType = Files.probeContentType(path);
System.out.println("File type: " + fileType);

위 코드를 실행하면,파일 유형이 출력된다。

확장자가 없는 실행 파일과 같은 일부 특수한 파일 형식에서는 이러한 확장자 기반 방법이 충분히 정확하지 않을 수 있으므로, 앞서 소개한 파일 매직 넘버 기반 방법을 사용하는 것이 더 권장된다.

넷째、정리

이 글에서는 Java에서 파일 유형을 알아내는 몇 가지 방법을 소개했다. 파일 확장자로 파일 유형을 판단할 수도 있고, 파일의 매직 넘버로 판단할 수도 있다. Tika 같은 서드 파티 라이브러리를 사용하면 파일 유형을 더 편리하게 알아낼 수 있다. 특수한 파일 유형은 사용자 정의 파일 유형 탐지기를 구현하여 정확하게 판단할 수 있다.

파일 형식을 알아낼 적절한 방법을 선택하는 것은 구체적인 사용 환경과 요구 사항에 달려 있다. 실제 개발에서는 파일의 특성과 요구 사항에 따라 가장 적합한 판별 방법을 선택하고, 확장성과 호환성도 고려해야 한다.


댓글

보내는 중

원하는 테마를 선택하세요

선택한 테마가 사이트 전체에 적용됩니다.