Does any one know how to read the header of a file in java using "magic numbers" or ascii values to get the name of the extension of a file
-
do you mean the file name by "header of a file"? – talnicolas Nov 19 '11 at 03:45
-
2He means the first few bytes, specifically in an image or media file. Technically you probably could consider it a "header" I suppose. Judging by his previous question he doesn't seem to understand that the "extension" is part of the filename. – Brian Roach Nov 19 '11 at 03:46
-
@BrianRoach I am a girl...and u r right I should identify the file type by readin the first few bytes like a header. I dont understand it much so al the help is appreciated – sue yin Nov 19 '11 at 04:03
-
@talnicolas I should identify the first few bytes of a file by reading its header in order to know the file extension – sue yin Nov 19 '11 at 04:05
-
@sue yin, the general solution to the problem you are describing is not at all simple. Do you have some specific file types you want to distinguish between? – clstrfsck Nov 19 '11 at 04:18
-
@sue yin: While the start of a file can be used fairly reliably for determining a [file type](http://en.wikipedia.org/wiki/File_type), on every system with which I am familiar, the file extension cannot be definitively determined from [magic numbers](http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) at the start of a file. For example nothing prevents you from putting a .txt extension on an executable file. – PTBNL Nov 19 '11 at 06:36
-
@PTBNL Yeah ...even if u change the name of the extension it should still be able to tell u the correct extension o fthe file by reading the header of that file... – sue yin Nov 19 '11 at 12:49
-
@msandiford kinda..like pdf, mp3, docx, mp4, mov, jpeg, png, gif – sue yin Nov 19 '11 at 12:49
-
@talnicolas: https://en.wikipedia.org/wiki/File_format#File_header – hippietrail May 16 '20 at 00:49
2 Answers
Maybe not the answer you wanted, but as you gave us very little information ...
In unixoid systems (Linux, Mac, *BSD) you have the file command, that
tests each argument in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic tests, and language tests. The first test that succeeds causes the file type to be printed.
E.g.
$ file linux-image-3.1.0-030100rc10-generic_3.1.0-030100rc10.201110200610_amd64.deb
linux-image-3.1.0-030100rc10-generic_3.1.0-030100rc10.201110200610_amd64.deb: Debian binary package (format 2.0)
Using Runtime.exec(...) you could invoke that program and parse its output.
Edit 1:
To determine if a given file is a PNG:
import java.io.*;
public class IsPng {
public static void main(String ...filenames) throws Exception {
if(filenames.length == 0) {
System.err.println("Please supply filenames.");
return;
}
for(String filename : filenames) {
if(isPng(new File(filename))) {
System.out.println(filename + " is a png.");
} else {
System.out.println(filename + " is _not_ a png.");
}
}
}
private static final int MAGIC[] = new int[] { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };
private static boolean isPng(File filename) throws Exception {
FileInputStream ins = new FileInputStream(filename);
try {
for(int i = 0; i < MAGIC.length; ++i) {
if(ins.read() != MAGIC[i]) {
return false;
}
}
return true;
} finally {
ins.close();
}
}
}
Edit 2:
Sometimes URLConnection.getContentType() works, too, for local files:
new File(name).toURI().toURL().openConnection().getContentType()
But your comments sound like you have to implement the method by yourself, not using external programs (?).

- 25,517
- 12
- 101
- 143
-
I do not understand wat u jus typed..I dont think that code is what am lookin for.. I think it is a bit simpler tahn that...at least i hope...thanks still – sue yin Nov 19 '11 at 04:04
-
I added an example which determines if a given file is a [.png](http://en.wikipedia.org/wiki/Portable_Network_Graphics). You would need to test many magics, though, if you want to support multiple filetypes. – Kijewski Nov 19 '11 at 04:15
You can try JFileChooser. Here is an example.
import java.io.*;
import javax.swing.*;
class GetFileType {
public static void main(String[] args){
JFileChooser chooser = new JFileChooser();
File file = new File("Hello.txt");
String fileTypeName = chooser.getTypeDescription(file);
System.out.println("File Type= "+fileTypeName);
}
}
This will output Text Document. If it is a MP3 file passed then the output will be MP3 Format Sound.

- 321
- 1
- 15
- 32