2016-12-01 11 views
1

私はいつも私にプレーン/テキストファイルを送信しているwebserviceを使用しています。ただし、そのファイルはジップまたはcsvのいずれかですが、そのタイプについて事前に通知されていません。Java - CSVファイルからZIPファイルを区別する

コンテンツをプログラム的に見て、ファイルの種類を知る方法はありますか? 1つはバイトコードで、もう1つは実際にreadeableテキストです。

私は既にファイルのコンテンツでたくさんのカンマを探していると思っていましたが、それは不正確です。

+1

あなたはCSVのためのフィルタリングルールを定義するには、 'java.io.FileFilter'を使用することができますおよびZipファイル。 –

+1

まず、Webサービスが壊れています。それを修正する機会はありますか?第2に、ZIPファイルに特徴的な署名バイトが検出されます(https://en.wikipedia.org/wiki/Zip_%28file_format%29) – Henry

+1

zipまたはcsvを送信するために 'text/plain'を使用するのは間違っています。これを回避することができたとしても、そのAPIを変更し、すべてのクライアントが適切なメディアタイプを 'Content-Type'ヘッダとして送信するように努めなければなりません。 –

答えて

2

あなたはZIPファイル構造を利用できます。 file headerごとに、各ファイルは、バイト:0x04 0x03 0x4b 0x50で始まる必要があります。

Apache TikaなどのMIME検出ライブラリを使用することもできます。import org.apache.tika.Tika; import org.apache.tika.mime.MediaType;

import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class Detect { 

    /** 
    * Resolves the MediaType using Tika and prints it to the standard output. 
    * @param file the path of the file to probe. 
    * @throws IOException whenever an I/O exception occurs. 
    */ 
    private void detect(Path file) throws IOException { 
     Tika tika = new Tika(); 
     try(InputStream is = Files.newInputStream(file)){ 
      MediaType mediaType = MediaType.parse(tika.detect(is)); 
      System.out.println(mediaType); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     Detect d = new Detect(); 
     d.detect(Paths.get("zip_file")); 
     d.detect(Paths.get("csv_file")); 
    } 
} 
5

あなたはコンストラクタがZipExceptionをスローした場合、それはzipファイルではありません、java.util.zip.ZipFileを使用することができます...

try(ZipFile zip = new ZipFile(filename)) { 
    // It's a zip file 
} 
catch(ZipException e) { 
    // Not a valid zip 
} 
関連する問題