ho migliorato le varie classi come descritto già grosso modo in questo 3d
Inoltre, ho modificato il file IndexReader.java in questo modo

codice:
import java.io.FileReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
import javax.swing.JFileChooser;
import java.util.HashSet;
import java.util.Iterator;

/**
 * A class to read file from an input source and generate a data set of different
 * files
 * @author Simone
 *
 */
public class IndexReader
{
	public static HashSet<AudioFile> audioFiles = new HashSet<AudioFile>();
	public static HashSet<VideoFile> videoFiles = new HashSet<VideoFile>();
	public static HashSet<ImageFile> imageFiles = new HashSet<ImageFile>();
	public static HashSet<TextFile> textFiles = new HashSet<TextFile>();
	
	public static void main(String[] args) throws FileNotFoundException, 
		IOException
	{
		//Creo un nuovo oggetto per scegliere il percorso del file
		JFileChooser chooser = new JFileChooser();
		FileReader in = null;
		if (chooser.showOpenDialog(null) == chooser.APPROVE_OPTION)
		{
			File selectedFile = chooser.getSelectedFile();
			in = new FileReader(selectedFile);
			Scanner input = new Scanner(in);
			while (input.hasNext())
				read(input);
			
			PrintStream p = System.out;
			
			
			for (AudioFile a : audioFiles)
				p.println(a);
			for (VideoFile a : videoFiles)
				p.println(a);
			for (ImageFile a : imageFiles)
				p.println(a);
			for (TextFile a : textFiles)
				p.println(a);
			
			
			input.close();
			in.close();
		}
	}
	
	/*
	 * Il metodo per leggere da dal file di input. In questo caso sarà proprio
	 * il nostro file index.dat
	 */
	public static void read(Scanner s)
	{
		//Leggo tutte le stringhe predefinite per un file generico
		if (!s.hasNext()) return;
		String type = s.next();
		if (!s.hasNext()) return;
		String path = s.next();
		if (!s.hasNextInt()) return;
		int size = s.nextInt();
		if (!s.hasNext()) return;
		String creationData = s.next();
		if (!s.hasNext()) return;
		String lastModifiedData = s.next();
		if (!s.hasNext()) return;
		String description = s.next();
		if (!s.hasNext()) return;
		String format = s.next();
		
		/*Se la prima riga dice che è un file audio, allora se la riga successiva
		* è un intero, recupero la lunghezza in secondi e creo un nuovo oggetto
		* AudioFile, inserendolo nell'HashMap
		*/
		if (type.equalsIgnoreCase("audio"))
		{
			if (!s.hasNextInt()) return;
			int length = s.nextInt();
			audioFiles.add(new AudioFile(type, path, size, creationData, 
					lastModifiedData, description, format, length));
		}
		//Altrimenti se dice che è un file video, procedo allo stesso modo
		else if (type.equalsIgnoreCase("video"))
		{
			if (!s.hasNextInt()) return;
			int length = s.nextInt();
			videoFiles.add(new VideoFile(type, path, size, creationData, 
					lastModifiedData,	description, format, length));
		}
		/*Procedo allo stesso modo con un file immagine
		* In questo metodo c'è un errore, in quanto se ho nelle specifiche del
		* file d'ingresso dei numeri con una parte decimale (per esempio 600.58
		* e 454.45), la lettura del file non continua e non viene aggiunto
		* nulla all'HashMap imageFiles. Se invece i valori sono interi, tutto
		* procede alla perfezione
		*/
		else if (type.equalsIgnoreCase("immagine"))
		{
			if (!s.hasNextLine()) return;
			double width = s.nextDouble();
			if (!s.hasNextLine()) return;
			double height = s.nextDouble();
			imageFiles.add(new ImageFile(type, path, size, creationData, 
					lastModifiedData, description, format, width, height));
		}
		//Altrimenti è un file di testo
		else textFiles.add(new TextFile(type, path, size, creationData, 
				lastModifiedData, description, format));
	}
}