Определение типа файла по его содержимому (сигнатуре)

Создание простой программы на java для определения типа файла по сигнатуре. Обычно, для определения типа достаточно знать не более 20 байт и плюс их смещение от начала файла. Эти данные я поместил в текстовый файл FileTypes.txt, чтобы была возможность добавлять и изменять их. Поля разделены символом ; .
<pre>
//Расширение;Смещение;Размер байт;Признак доп. обработки;Регулярное выражение;Иконка;Описание типа
MDB;0;19;0;000100005374616E64617264204A6574204442;db.png;Microsoft Access file

ASF, WMA, WMV;0;16;0;3026B2758E66CF11A6D900AA0062CE6C;video.png;Microsoft Windows Media Audio/Video File

LNK;0;16;0;4C0000000114020000000000C0000000;link.png;Ярлык (ссылка на файл) Windows

AVI;0;16;0;52494646.{5,8}415649204C495354;video.png;Resource Interchange File Format — Windows Audio Video Interleave file, where 5-8 bytes is the file size (little endian)

ZIP;0;14;0;504B030414000100630000000000;zip.png;ZLock Pro encrypted ZIP

M4V;0;12;0;00000018667479706D703432;video.png;MPEG-4 video/QuickTime file

SDOC, SXLS;0;10;0;4F7261636C652049524D;irm.png;Oracle IRM Desktop

DOCX, PPTX, XLSX;0;8;9999;504B030414000600;office.png;Microsoft Office Open XML Format (OOXML) Document

MP4;4;8;0;6674797069736F6D;video.png;ISO Base Media file (MPEG-4) v1

PPT;0;8;512;006E1EF0;ppt.png;PowerPoint presentation subheader (MS Office)

DOC, DOT, PPS, PPT, XLA, XLS, MSI, WIZ;0;8;0;D0CF11E0A1B11AE1;office.png;Microsoft Office 97-2003 applications (Word, Powerpoint, Excel, Wizard).[See also Word, Powerpoint, and Excel «subheaders» at byte offset 512. There appear to several subheader formats and a dearth of documentation. There have been reports that there are different subheaders for Windows and Mac versions of MS Office but I cannot confirm that.]

OPT,XLS;512;8;0;8;xls.png;Developer Studio File Workspace Options subheader (MS Office), Excel spreadsheet subheader (MS Office)

XLS;512;8;0;0908100000060500;xls.png;Excel spreadsheet subheader (MS Office)

PNG;0;8;0;89504E470D0A1A0A;img.png;Portable Network Graphics file

RAR;0;8;0;526172211A070100;rar.png;RAR (v5.x) compressed archive file

DjVu;0;8;0;41542654464F524D;djvu.png;DjVu (от фр. déjà vu — «уже виденное») — технология сжатия изображений с потерями, разработанная специально для хранения сканированных документов — книг, журналов, рукописей и прочее, где обилие формул, схем, рисунков и рукописных символов делает чрезвычайно трудоёмким их полноценное распознавание.

EPUB;0;8;0;504B03040A000200;ebook.png;Open Publication Structure eBook file. (Should also include the string: mimetypeapplication/epub+zip)

JAR;0;8;0;504B030414000808;jar.png;Java archive

MHT;0;8;0;46726F6D3A203D3F;ie.png;Сохраненная web-страница MIME HTML

EXE, DLL, SYS;0;8;0;4D5A900003000000;exe.png;Исполняемый или системный файл Windows (драйвер,библиотека)

RAR;0;7;0;526172211A0700;rar.png;RAR — проприетарный формат сжатия данных и условно-бесплатная программа-архиватор. Версия для Microsoft Windows распространяется в составе многоформатного архиватора с графическим интерфейсом WinRAR.

7Z;0;6;0;377ABCAF271C;7z.png;Архив 7zip. 7-Zip — свободный файловый архиватор с высокой степенью сжатия данных. Поддерживает несколько алгоритмов сжатия и множество форматов данных, включая собственный формат 7z c высокоэффективным алгоритмом сжатия LZMA. Программа разрабатывается с 1999 года и является бесплатной, а также имеет открытый исходный код, большая часть которого свободно распространяется на условиях лицензии GNU LGPL, за исключением кода декомпрессора unRAR, который имеет ограничения.

RTF;0;6;0;7B5C72746631;Rich Text Format, RTF (англ. rich — богатый; «формат обогащённого текста») — проприетарный[3][4] межплатформенный формат хранения размеченных текстовых документов, предложенный группами программистов, основавшими компании Microsoft и Adobe, как мета-тэговый формат для редактора Word в 1982 году. С тех пор спецификация формата несколько раз изменялась. После разрыва отношений с Microsoft компания Adobe продолжила самостоятельное развитие метатэгового языка, заложенного в основу RTF, создав в 1985 году язык PostScript.

ISO;32769;5;0;4344303031;iso.png;ISO 9660 — стандарт, выпущенный Международной организацией по стандартизации, описывающий файловую систему для дисков CD-ROM. Также известен как CDFS (Compact Disc File System). Целью стандарта является обеспечить совместимость носителей под разными операционными системами, такими как Unix, Mac OS, Windows.

ISO;34817;5;0;4344303031;iso.png;ISO 9660 — стандарт, выпущенный Международной организацией по стандартизации, описывающий файловую систему для дисков CD-ROM. Также известен как CDFS (Compact Disc File System). Целью стандарта является обеспечить совместимость носителей под разными операционными системами, такими как Unix, Mac OS, Windows.

ISO;36865;5;0;4344303031;iso.png;ISO 9660 — стандарт, выпущенный Международной организацией по стандартизации, описывающий файловую систему для дисков CD-ROM. Также известен как CDFS (Compact Disc File System). Целью стандарта является обеспечить совместимость носителей под разными операционными системами, такими как Unix, Mac OS, Windows.

PDF, FDF;0;4;0;25504446;pdf.png;Adobe Portable Document Format and Forms Document file

JPG;0;4;0;FFD8FFE1;img.png;Digital camera JPG using Exchangeable Image File Format (EXIF)

JPG;0;4;0;FFD8FFE8;img.png;Still Picture Interchange File Format (SPIFF)

ICO,SPL;0;4;0;00000100;img.png;Windows icon file(ICO) OR Windows NT/2000/XP printer spool file(SPL)

JFIF, JPE, JPEG, JPG;0;4;0;img.png;FFD8FFE0;JPEG/JFIF graphics file

XLS;512;4;0;FDFFFFFF;xls.png;Excel spreadsheet subheader (MS Office)

ZIP;0;4;0;504B0304;zip.png;PKZIP archive fileZIP Apple Mac OS X Dashboard Widget, Aston Shell theme, Oolite eXpansion Pack, Opera Widget, Pivot Style Template, Rockbox Theme package, Simple Machines Forums theme, SubEthaEdit Mode, Trillian zipped skin, Virtual Skipper skin JAR Java archive; compressed file package for classes and data KMZ Google Earth saved working session file KWD KWord document ODT, ODP, OTT OpenDocument text document, presentation, and text document template, respectively. SXC, SXD, SXI, SXW OpenOffice spreadsheet (Calc), drawing (Draw), presentation (Impress), and word processing (Writer) files, respectively. SXC StarOffice spreadsheet WMZ Windows Media compressed skin file XPI Mozilla Browser Archive XPS XML paper specification file XPT eXact Packager Models

MP4, MOV, M4V, M4A, 3GG, 3GP, 3G2;4;4;0;66747970|000001B[0-9A-F];video.png;Audio/Video files

MP3, KOZ;0;3;0;494433;audio.png;MPEG-1 Audio Layer 3 (MP3) audio file OR Sprint Music Store audio file (for mobile devices)

COM, DLL, DRV, EXE, PIF, QTS, QTX, SYS,…;0;2;0;4D5A;exe.png;Windows/DOS executable file (See The MZ EXE File Format page for the structure of an EXE file, with coverage of NE, TLINK, PE, self-extracting archives, and more.)

COM, SYS;0;1;0;E8|E9|EB;exe.png;Windows executable file
</pre>

Признак дополнительной обработки нужен для… ну да, для дополнительной обработки :). Пример «DOCX, PPTX, XLSX» , сигнатура этих файлов одинакова, это OOXML в zip-архиве, а для того чтобы определить тип точнее, нужно вытащить из архива файл [Content_Types].xml и найти в нем строчку «

Eclipse — подключение SQL драйвера (JDBC)

Итак мы уже скачали сам драйвер в виде файла с расширением jar. Как правило, необходимый драйвер надо искать на сайте производителя базы данных. Первый шаг — выделите нужный проект в eclipse, затем нажмите кнопку меню Project и выберите <b>Properties</b>
<b>Свойства</b>
Откроется окно свойств. В левом поле выберите «Java Build Path», а в правом откройте вкладку Libraries и нажмите кнопку подключения внешнего файла jar «ADD External JARs..».
<b>Libraries</b>
Вспоминаем куда мы загрузили нужный файл на своем компьютере и находим его
<b>Path</b>
Жмем кнопку «Открыть» и видим, что драйвер появился в нашем пректе
<b>Result</b>

Java DatePicker ( Выбор даты на java )

Код datepicker найден на просторах сети интернет и немного доработан под нужды российского пользователя.
Класс DatePicker
<pre>
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class DatePicker {
int month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);;
JLabel l = new JLabel(«», JLabel.CENTER);
String day = «»;
JDialog d;
JButton[] button = new JButton[49];

public DatePicker(JFrame parent) {
d = new JDialog();
d.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
d.setModal(true);
String[] header = { «Вс», «Пн», «Вт», «Ср», «Чт», «Пт», «Сб» };
JPanel p1 = new JPanel(new GridLayout(7, 7));
p1.setPreferredSize(new Dimension(360, 120));

for (int i = 0; i < header.length; i++) {
button[i] = new JButton();
if(i==0||i==6){
button[i].setForeground(Color.red);
}
else{
button[i].setForeground(Color.blue);
}
button[i].setText(header[i]);
button[i].setBackground(Color.LIGHT_GRAY);
p1.add(button[i]);
}
for (int x = 7; x < button.length; x++) {
final int selection = x;
button[x] = new JButton();
button[x].setFocusPainted(false);
button[x].setBackground(Color.white);
button[x].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
day = button[selection].getActionCommand();
if(!day.trim().equals(«»)){
d.dispose();
}
}
});
if(x==7||x==13||x==14||x==20||x==21||x==27||x==28||x==34||x==35||x==41||x==42||x==48){
button[x].setBackground(new Color(255, 200, 200));
}
p1.add(button[x]);
}
JPanel p2 = new JPanel(new GridLayout(1, 3));

// Предыдущий месяц
JButton previous = new JButton(«<< Назад»);
previous.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
month—;
displayDate();
}
});
p2.add(previous);

// Текущий месяц
p2.add(l);

// Следующий месяц
JButton next = new JButton(«Вперед >>»);
next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
month++;
displayDate();
}
});
p2.add(next);

d.add(p1, BorderLayout.CENTER);
d.add(p2, BorderLayout.SOUTH);
d.pack();
//parent.setUndecorated(true);
d.setLocationRelativeTo(parent);
displayDate();
//d.setUndecorated(true);
d.setVisible(true);
}

public void displayDate() {
for (int x = 7; x < button.length; x++) {
button[x].setText(«»);
}

java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
«MMMM yyyy»);
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, 1);
int dayOfWeek = cal.get(java.util.Calendar.DAY_OF_WEEK);
int daysInMonth = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);

for (int x = 6 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++) {
//for (int x =5 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++) {
button[x].setText(«» + day);
}

l.setText(sdf.format(cal.getTime()));
d.setTitle(«Выбор даты»);
}

public String setPickedDate() {
if (day.equals(«»)) {
return day;
}

// Set the return date format
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
«yyyy-MM-dd»);

java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, Integer.parseInt(day));
return sdf.format(cal.getTime());
}
}
</pre>