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)); } }

