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 में, फ़ाइल का बाइनरी डेटा पढ़कर उसका मैजिक नंबर प्राप्त किया जा सकता है।
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 जैसी तृतीय-पक्ष लाइब्रेरी का उपयोग करके फ़ाइल का प्रकार अधिक आसानी से पता किया जा सकता है। विशेष प्रकार की फ़ाइलों की सटीक पहचान के लिए अनुकूलित फ़ाइल प्रकार डिटेक्टर बनाया जा सकता है।
फ़ाइल का प्रकार जानने के लिए उपयुक्त विधि का चयन विशिष्ट उपयोग-परिस्थिति और आवश्यकताओं पर निर्भर करता है। वास्तविक विकास में फ़ाइल की विशेषताओं और आवश्यकताओं के आधार पर सबसे उपयुक्त पहचान विधि चुनें और विस्तार-क्षमता तथा संगतता का ध्यान रखें।