Dalam pengembangan Java, kita sering perlu menentukan jenis berkas, misalnya untuk memeriksa apakah berkas yang diunggah pengguna memenuhi persyaratan jenis berkas dalam fitur unggah. Artikel ini akan menjelaskan secara terperinci cara mendapatkan jenis berkas menggunakan Java.
Satu、Menentukan jenis berkas berdasarkan ekstensi nama berkas
Cara paling umum untuk menentukan jenis berkas adalah berdasarkan ekstensinya. Sebagian besar berkas memiliki ekstensi tertentu dalam sistem operasi, misalnya ekstensi berkas teks biasanya adalah .txt,ekstensi nama berkas gambar biasanya adalah .jpg atau.png dan sebagainya.
Mendapatkan ekstensi berkas melalui program Java sangatlah mudah, cukup gunakan String milik kelas substring metode tersebut sudah cukup, kodenya ditunjukkan di bawah ini:
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 "";
}
}Metode ini menerima sebuah File objek sebagai parameter, lalu menggunakan lastIndexOf untuk menemukan posisi titik terakhir pada nama berkas, yaitu posisi awal ekstensi, kemudian menggunakan substring Metode mengambil string ekstensi nama berkas dan mengembalikannya. Jika berkas tidak memiliki ekstensi, string kosong akan dikembalikan.
Metode ini dapat diuji dengan kode berikut:
File file = new File("C:/path/to/file.txt");
String extension = getFileExtension(file);
System.out.println(extension);Hasil eksekusinya adalah:
txt
Menggunakan metode ini untuk menentukan jenis berkas memiliki kelebihan berikut:
Mudah digunakan, dengan implementasi kode yang ringkas.
Berlaku untuk sebagian besar berkas, karena sebagian besar berkas memiliki ekstensi nama.
Namun, metode ini juga memiliki beberapa kekurangan:
Ekstensi berkas mungkin telah diubah, sehingga hasil identifikasinya keliru.
Beberapa berkas tidak memiliki ekstensi, misalnya berkas yang dapat dieksekusi tanpa ekstensi.
Untuk menentukan jenis berkas dengan lebih akurat, kita dapat turut memeriksa angka ajaib berkas tersebut.

Dua、Menentukan jenis berkas menggunakan angka ajaib berkas
Magic number file adalah byte-byte tertentu di antara beberapa byte pada awal file yang digunakan untuk mengenali jenis file. Dengan mengenali magic number file, kita dapat menentukan jenis file secara akurat tanpa terpengaruh oleh ekstensi nama file.
Di Java, angka ajaib suatu berkas dapat diperoleh dengan membaca data biner berkas tersebut.
2.1 Membaca data biner berkas
Kita dapat menggunakan FileInputStream kelas untuk membaca data biner berkas. Metode berikut akan mengembalikan larik byte yang berisi data biner berkas:
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();
}
}
}Metode di atas menggunakan FileInputStream untuk membuka berkas, membaca data, dan menyimpannya ke dalam larik byte. Perhatikan bahwa setelah selesai membaca berkas, perlu memanggil close metode untuk menutup aliran berkas, guna membebaskan sumber daya sistem.
2.2 Menggunakan magic number berkas untuk menentukan jenis berkas
Dengan data biner berkas, kita dapat menentukan jenis berkasnya. Setiap jenis berkas memiliki angka ajaib tertentu, dan jenis berkas dapat ditentukan berdasarkan angka ajaib tersebut. Berikut adalah angka ajaib beberapa jenis berkas yang umum beserta cara penentuannya:
Angka penanda berkas teks(.txt)adalah
EF BB BF(berkas dengan pengodean UTF-8 memiliki urutan byte ini di awal),dapat diperiksa dengan metode berikut:public static boolean isTextFile(byte[] data) { if (data.length >= 3 && data[0] == -17 && data[1] == -69 && data[2] == -65) { return true; } return false; }Angka penanda gambar JPEG(.jpg)adalah
FF D8 FF,dapat diperiksa menggunakan metode berikut:public static boolean isJPEGFile(byte[] data) { if (data.length >= 3 && data[0] == -1 && data[1] == -40 && data[2] == -1) { return true; } return false; }Magic number gambar PNG(.png)adalah
89 50 4E 47 0D 0A 1A 0A,dapat diperiksa menggunakan metode berikut: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; }
Sesuai kebutuhan, Anda dapat menambahkan lebih banyak jenis berkas beserta metode pemeriksaan angka ajaibnya.
2.3 Contoh lengkap
Berikut contoh lengkap yang menunjukkan cara menggunakan magic number berkas untuk menentukan jenis berkas:
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;
}
}Kode contoh di atas akan menentukan jenis berkas berdasarkan angka ajaibnya, lalu menampilkan hasil yang sesuai.
III、Menggunakan pustaka pihak ketiga untuk mengenali jenis berkas
Selain metode di atas, pustaka pihak ketiga juga dapat digunakan untuk menentukan jenis berkas. Java memiliki sejumlah pustaka pihak ketiga sumber terbuka yang dapat membantu kita mengetahui jenis berkas dengan lebih mudah.
3.1 Tika
Tika adalah proyek Apache Software Foundation yang menyediakan pustaka Java sumber terbuka untuk mengurai berbagai format berkas, termasuk teks, gambar, audio, video, dan sebagainya. Tika dapat digunakan untuk mengekstrak metadata berkas, termasuk jenis berkasnya.
Pertama, perlu menambahkan dependensi pustaka Tika. Jika menggunakan Maven untuk membangun proyek, Anda dapat melakukannya di pom.xml Tambahkan dependensi berikut ke dalam berkas:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>1.27</version> </dependency>
Kemudian, Anda dapat menggunakan kode berikut untuk memperoleh tipe berkas:
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();
}
}
}Menjalankan kode di atas akan menampilkan jenis berkas.
Tika menggunakan berbagai cara untuk mengenali jenis berkas, termasuk ekstensi nama berkas, angka ajaib, dan sebagainya. Tika juga mendukung detektor khusus, sehingga aturan identifikasi jenis berkas dapat ditambahkan sesuai kebutuhan.
3.2 FileTypeDetector
Java menyediakan API standar untuk mendeteksi jenis berkas, yaitu FileTypeDetector antarmuka dan ProbeContentType kelas. Dengan mengimplementasikan antarmuka ini, kita dapat membuat pendeteksi jenis berkas khusus.
Berikut adalah contoh pendeteksi jenis berkas yang dibuat khusus:
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 "";
}
}
}Dalam contoh ini, kita menentukan jenis berkas berdasarkan ekstensi nama berkas dan mengembalikan jenis MIME yang sesuai.
Untuk menggunakan pendeteksi jenis berkas kustom,tambahkan kode berikut di titik masuk program:
File file = new File("C:/path/to/file.jpg");
Path path = file.toPath();
String fileType = Files.probeContentType(path);
System.out.println("File type: " + fileType);Menjalankan kode di atas akan menampilkan jenis berkas.
Perlu diperhatikan,untuk beberapa jenis berkas khusus,misalnya berkas eksekusi tanpa ekstensi,metode berbasis ekstensi ini mungkin kurang akurat,sehingga lebih disarankan menggunakan metode berbasis magic number berkas yang diperkenalkan sebelumnya。
IV、Kesimpulan
Artikel ini memperkenalkan beberapa cara untuk mengetahui tipe berkas di Java. Tipe berkas dapat ditentukan berdasarkan ekstensi maupun magic number berkas. Pustaka pihak ketiga seperti Tika mempermudah identifikasi tipe berkas. Untuk tipe berkas khusus, detektor tipe berkas yang disesuaikan dapat digunakan untuk menghasilkan identifikasi yang tepat.
Pemilihan metode yang tepat untuk memperoleh jenis berkas bergantung pada skenario penggunaan dan kebutuhan spesifik. Dalam pengembangan nyata, pilih metode identifikasi yang paling sesuai berdasarkan karakteristik berkas dan kebutuhan, serta pertimbangkan kemampuan untuk diperluas dan kompatibilitasnya.