Ciao a tutti!!![]()
Ho un problemino con questo Scanner. Il problema è riportato nel codice del messaggio. A dispetto della lunghezza, è molto più semplice di quanto possa sembrare
Ecco cosa prevede la traccia originale
Ecco un esempio di file di testo:Si vuole implementare un programma per l’indicizzazione di documenti multimediali (testo, audio, video o immagini). Un file di indicizzazione, denominato indice.txt, è costrutto come una lista di documenti con alcuni campi comuni ed altri specifici di ogni tipologia di documento.
Per tutte tipologie di documenti sono memorizzati, uno per riga, i seguenti dati:
· Percorso nel file system (es: “C:/Documents/prova.doc”)
· Dimensione in bytes
· Data di creazione
· Data di ultima modifica
· Descrizione
· Formatto del file (es.: “mpg”, “avi”, “gif”, “jpeg”, “mp3”, “txt”, “doc”…)
Inoltre, per i documenti di tipo Audio si memorizza:
· Durata dell’audio in secondi (ad esempio 500, 3600)
Per i documenti di tipo Immagine si memorizzano le seguenti informazioni aggiuntive:
· Larghezza dell’immagine
· Altezza dell’immagine
Infine, per i documenti di tipo Video si memorizza:
· Durata del video in secondi (es.: 500, 3600)
Nel file indice.txt i dati di ciascun documento è preceduto da un’etichetta che ne indica il tipo (Testo, Audio, Immagine o Video).
Scrivere un programma che:
· Data una dimensione soglia, stampi le informazioni relative ai file che hanno una dimensione superiore alla soglia;
· Dati una dimensione ed un tipo di file, stampi i nomi di tutti i file del tipo dato con una dimensione superiore a quella data.
Ho creato la classe MyFile che gestisce un file generico e le sottoclassi AudioFile, VideoFile, ImageFile e TextFile per gestire i vari file. Il problema invece è con questa classe, IndexReader, che dovrebbe leggermi i dati inseriti in questo file e poi stamparmeli a video.Audio
C:/Audio/1.mp3
250000
10-05-2010
11-05-2010
Questo_file_contiene_un_brano_rock
mp3
600
Video
C:/Video/1.mpg
2700000
11-06-2010
12-06-2010
Questo_file_contiene_un_video_divertente
mpg
3600
Testo
C:/Documents/file1
10000
15-08-2009
16-08-2009
Curriculum_vitae
doc
Immagine
C:/Immagine/cielo.gif
15000
09-05-2010
12-05-2010
stellato
gif
600.58
454.45
Testo
C:/Documents/file2
14000
01-01-2011
08-01-2011
Progetto_A
doc
Immagine
C:/Immagine/prato.gif
15700
08-07-2009
12-07-2009
fiorito
gif
700
500
Non capisco perchè non riesce a leggere in input un numero double. Se dò ad un immagine i parametri altezza e larghezza di tipo double (come 600.58codice: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 an hash 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)); } }
454.45) non crea l'oggetto; se li passo senza virgola, invece, fila tutto liscio. Come mai?
Inoltre, vi sembra giusto come procedimento da seguire quello della mia classe IndexReader?
Grazie mille a tutti per le eventuali risposte![]()