Java geliştirmede dosya türünü belirleme gereksinimiyle sık karşılaşılır; örneğin dosya yükleme özelliğinde, kullanıcının yüklediği dosyanın gerekli türe uygun olup olmadığını belirlemek gerekir. Bu yazıda Java ile dosya türünü öğrenme yöntemleri ayrıntılı olarak açıklanacaktır.
I、Dosya türünü dosya uzantısıyla belirleme
Dosya türünü belirlemenin en yaygın yolu dosya uzantısına bakmaktır. Çoğu dosyanın işletim sisteminde belirli bir uzantısı vardır; örneğin metin dosyalarının uzantısı genellikle.txt,görüntü dosyalarının uzantısı genellikle .jpg veya.png vb.
Bir Java programıyla dosya uzantısını almak çok kolaydır; yalnızca şunu kullanmanız yeterlidir: String sınıfın substring metodunu kullanmak yeterlidir; kod aşağıda gösterilmiştir:
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 "";
}
}Bu yöntem bir File nesnesini parametre olarak alıp ardından lastIndexOf yöntemiyle dosya adındaki son noktanın, yani uzantının başlangıç konumu bulunur, ardından şu kullanılır: substring metodu, dosya uzantısı dizesini alır ve döndürür。Dosyanın uzantısı yoksa boş bir dize döndürür。
Bu yöntemi aşağıdaki kodla test edebilirsiniz:
File file = new File("C:/path/to/file.txt");
String extension = getFileExtension(file);
System.out.println(extension);Çalıştırma sonucu şöyledir:
txt
Dosya türünü bu yöntemle belirlemenin şu avantajları vardır:
Kullanımı kolaydır, kodla uygulanması sadedir.
Dosyaların büyük çoğunluğunda işe yarar, çünkü dosyaların büyük çoğunluğunun uzantısı vardır.
Ancak bu yöntemin bazı dezavantajları da vardır:
Dosyanın uzantısı değiştirilmiş olabilir ve bu da değerlendirmenin yanlış sonuç vermesine yol açabilir.
Bazı dosyaların uzantısı yoktur, örneğin uzantısız çalıştırılabilir dosyalar.
Dosya türünü daha doğru belirlemek için dosyanın sihirli baytlarını da değerlendirmeye katabiliriz.

II、Dosya türünü dosyanın sihirli sayısıyla belirleme
Dosya sihirli numarası, dosyanın başındaki ilk birkaç bayt arasında yer alan ve dosya türünü tanımlamak için kullanılan belirli baytlardır. Dosya sihirli numarasını tanıyarak dosyanın türünü, dosya uzantısından etkilenmeden doğru biçimde belirleyebiliriz.
Java'da dosyanın ikili verileri okunarak dosyanın sihirli numarası elde edilebilir.
2.1 Dosyanın ikili verilerini okuma
Şunu kullanabiliriz: FileInputStream sınıfını kullanarak dosyanın ikili verilerini okuyabiliriz. Aşağıdaki metot, dosyanın ikili verilerini içeren bir bayt dizisi döndürür:
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();
}
}
}Yukarıdaki yöntemlerde kullanılan FileInputStream ile dosyayı açmak, verileri okumak ve bir bayt dizisine kaydetmek için. Dosya okuma işlemi tamamlandıktan sonra şu çağrının yapılması gerektiğine dikkat edin:close yöntemi dosya akışını kapatarak sistem kaynaklarını serbest bırakır.
2.2 Dosya türünü sihirli baytlarla belirleme
Dosyanın ikili verilerini elde ettiğimizde dosya türünü belirleyebiliriz. Her dosya türünün belirli bir sihirli sayısı vardır ve dosyanın türü bu sayıdan anlaşılabilir. Aşağıda bazı yaygın dosya türlerinin sihirli sayıları ve bunlara karşılık gelen belirleme yöntemleri yer alıyor:
Metin dosyasının(.txt)sihirli sayısı
EF BB BF(UTF-8 kodlamalı dosyaların başında bu bayt dizisi bulunur),tespit etmek için şu yöntem kullanılabilir:public static boolean isTextFile(byte[] data) { if (data.length >= 3 && data[0] == -17 && data[1] == -69 && data[2] == -65) { return true; } return false; }JPEG görsellerinin (.jpg) sihirli sayısı
FF D8 FF,aşağıdaki yöntemlerle belirlenebilir:public static boolean isJPEGFile(byte[] data) { if (data.length >= 3 && data[0] == -1 && data[1] == -40 && data[2] == -1) { return true; } return false; }PNG görsellerinin (.png) sihirli sayısı
89 50 4E 47 0D 0A 1A 0A,aşağıdaki yöntemlerle belirlenebilir: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; }
İhtiyaca göre daha fazla dosya türü ve bunlara karşılık gelen sihirli sayı denetleme yöntemleri eklenebilir.
2.3 Tam örnek
Aşağıda, dosya türünü belirlemek için dosya sihirli sayılarının nasıl kullanılacağını gösteren eksiksiz bir örnek bulunmaktadır:
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;
}
}Yukarıdaki örnek kod, dosyanın sihirli sayısına göre dosya türünü belirler ve ilgili sonucu çıktı olarak verir.
III、Dosya türünü üçüncü taraf kütüphanelerle belirleme
Yukarıdaki yöntemlerin yanı sıra dosya türünü belirlemek için üçüncü taraf kütüphaneler de kullanılabilir. Java'da dosya türünü daha kolay öğrenmemize yardımcı olabilecek bazı açık kaynaklı üçüncü taraf kütüphaneler vardır.
3.1 Tika
Tika Apache Software Foundation'ın bir projesidir; metin, görüntü, ses, video ve benzeri çeşitli dosya biçimlerini ayrıştırmak için açık kaynaklı bir Java kütüphanesi sunar. Tika kullanılarak dosya türü dâhil dosyanın üst verileri çıkarılabilir.
Öncelikle Tika kütüphanesinin bağımlılığını eklemek gerekir. Projeyi Maven ile derliyorsanız, şuraya ekleyebilirsiniz: pom.xml dosyasına aşağıdaki bağımlılıkları ekleyin:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>1.27</version> </dependency>
Ardından dosyanın türünü almak için aşağıdaki kod kullanılabilir:
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();
}
}
}Yukarıdaki kod çalıştırıldığında dosyanın türü çıktı olarak verilir.
Tika, dosya türlerini tanımak için dosya uzantısı, sihirli sayılar gibi çeşitli yöntemler kullanır. Özel algılayıcıları da destekler; ihtiyaca göre dosya türünü belirlemek için özel kurallar eklenebilir.
3.2 FileTypeDetector
Java, dosya türünü tespit etmek için standart bir API sunar, yani FileTypeDetector arayüz ve ProbeContentType sınıfı. Bu arayüzü uygulayarak özel dosya türü algılayıcıları oluşturabilirsiniz。
Aşağıda özel bir dosya türü algılayıcısı örneği verilmiştir:
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 "";
}
}
}Bu örnekte dosya türünü dosyanın uzantısına göre belirliyor ve karşılık gelen MIME türünü döndürüyoruz.
Özel dosya türü algılayıcısını kullanmak için aşağıdaki kodu programın giriş noktasına ekleyin:
File file = new File("C:/path/to/file.jpg");
Path path = file.toPath();
String fileType = Files.probeContentType(path);
System.out.println("File type: " + fileType);Yukarıdaki kod çalıştırıldığında dosyanın türü çıktı olarak verilir.
Uzantısı olmayan çalıştırılabilir dosyalar gibi bazı özel dosya türlerinde, uzantıya dayanan bu yöntemin yeterince doğru olmayabileceğini unutmayın; bu nedenle daha önce açıklanan dosyanın sihirli sayısına dayalı yöntemi kullanmanız daha çok önerilir。
IV、Özet
Bu yazıda Java’da dosya türünü belirlemenin birkaç yöntemi tanıtıldı. Dosya türü, dosya uzantısından ya da dosyanın sihirli sayısından belirlenebilir. Tika gibi üçüncü taraf kütüphaneler kullanılarak dosya türü daha kolay belirlenebilir. Özel dosya türleri için, özel bir dosya türü algılayıcısı tanımlanarak kesin tespit yapılabilir.
Dosya türünü belirlemek için uygun yöntemin seçilmesi, somut kullanım senaryosuna ve gereksinimlere bağlıdır. Gerçek geliştirme sürecinde dosyanın özelliklerine ve ihtiyaçlara göre en uygun denetim yöntemini seçin; genişletilebilirliği ve uyumluluğu da göz önünde bulundurun.