|
分類:[Java]
javaで拡張子不明の画像ファイルを読み込みその種類を表示するプログラムを作成しているのですが下記のプログラムでPNG判定の時だけエラーが起きます.読み込みファイル名はコマンドライン引数で指定しています.PNG以外の判定をなくすとPNGはうまく判定できます.なにがおかしいのでしょうか?
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Task {
public static void main(String args[]) {
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(args[0]); // ファイル入力バイトストリーム
bis = new BufferedInputStream(fis); // 入力用バッファ
/*読み込みファイルの拡張子判定に利用*/
final byte[] BMP_SIGNATURE ={0x42, 0x4D}; //BMP
final byte[] JPEG_SIGNATURE ={(byte)0xFF, (byte)0xD8}; //JPEG
final byte[] PNG_SIGNATURE ={(byte)0x89, 0x50, 0x4E, 0x47}; //PNG
final byte[] GIF_SIGNATURE ={0x47, 0x49, 0x46, 0x38, 0x37, 0x61};//GIF
int ch, k = 0;
int flg1 = 0, flg2 = 0, flg3 = 0, flg4 = 0;
while (((ch = bis.read()) != -1)) {
/*BMP判定*/
if((byte)ch == BMP_SIGNATURE[k]) {
flg1++;
if(flg1 == BMP_SIGNATURE.length) {
System.out.println(args[0] + "はBMP形式のファイルです.");
break;
}
}
/*JPEG判定*/
if((byte)ch == JPEG_SIGNATURE[k]) {
flg2++;
if(flg2 == JPEG_SIGNATURE.length) {
System.out.println(args[0] + "はJPEG形式のファイルです.");
break;
}
}
/*PNG判定*/
if((byte)ch == PNG_SIGNATURE[k]) {
flg3++;
if(flg3 == PNG_SIGNATURE.length) {
System.out.println(args[0] + "はPNG形式のファイルです.");
break;
}
}
/*GIF判定*/
if((byte)ch == GIF_SIGNATURE[k] ) {
flg4++;
if(flg4 == GIF_SIGNATURE.length) {
System.out.println(args[0] + "はGIF形式のファイルです.");
break;
}
}
k++;
}
} catch (FileNotFoundException e) {
System.out.println("ファイル" + args[0] + "が見つかりません.");
System.exit(1);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {}
}
}
}
}
|