/* ************************************************************************* * Avrete notato che al main e' passato uno "String args[]", che e' un * array di stringhe... si tratta degli eventuali argomenti (parametri) * passati all'applicazione. Come sapete il comando di copia (si chiami * esso "copy", "cp" o altro) ha solitamente questa sintassi: * * copy filesorgente filedestinazione * * Dato che questo lo scriviamo nello shell del dos, dove finiscono le due * parole "folesorgente" e "filedestinazione"? Naturalmente nell'array * di stringhe args[], dove l'elemento args[0] e' "filesorgente", mentre * l'argomento args[1] e' "filedestinazione", e se si tenta di accedere * a args[2] o superiori si incappa in una arrayIndexOutOfBoundsException. * Naturalmente quando non si passa alcun parametro, come abbiamo fatto * fino ad ora, args[] e' vuoto e anche args[0] genera l'eccezione. * In C la cosa e' un po' diversa, e anche per questo l'argomento non e' * stato trattato. * I listati di copia che abbiamo visto possono agire solo su un dato file, * e per cambiare "azione" si dovrebbe modificare e ricompilare ogni volta * il .java sorgente. Vedremo ora di fare un comando piu' generale, a cui * si possano passare gli argomenti. * Il suo uso sara': * * "java Jlez6c argomento1 argomento2" * * Buona copia, ma fate attenzione. ************************************************************************* */ import java.io.*; // Include le funzioni I/O standard di base. class Jlez6c { // Da qua inizia la classe Jlez6c public static void main(String args[]) // Definiamo il metodo Main. { // Inizio del main() // Come prima cosa dobbiamo controllare se l'utente ha immesso i parametri. // Ce ne devono essere almeno 2, altrimenti mostra istruzioni ed esci. // Per sapere quanti elementi ha l'array args si usa il suo metodo length(). if (args.length < 2) // Se non abbiamo almeno 2 argomenti... { usage(); // ...mostra l'help sull'uso return; // ed esci. } // Se siamo qua significa che abbiamo almeno 2 argomenti. Dunque dobbiamo // leggere il primo per sapere il nome del file sorgente e il secondo per // il file destinazione. Eventuali altri argomenti saranno ignorati. // Attenzione che se si indica lo stesso file come sorgente e destinazione // sovrascriviamo stupidamente il file, che diventera' di lunghezza 0 (quasi // come cancellarlo). State attenti. String filesource = new String (args[0]); // Il primo parametro e' // il filesource, args[0] String filedest = new String (args[1]); // il secondo e' la dest. // Gli input/output stream e la variabile LungFile li dichiaro nel main(), // in modo che siano accessibili ovunque. FileInputStream MioInFilStr = null; FileOutputStream MioOutFilStr = null; int LungFile = 0; // Provo ad aprire il file sorgente in lettura con FileInputStream. try { MioInFilStr = new FileInputStream(filesource); } catch (IOException e) { System.out.println("Errore: " + e + " nella lettura di un file"); System.exit(0); } // Provo ad aprire/creare il file dest. in scrittura con FileOutputStream. try { MioOutFilStr = new FileOutputStream(filedest); } catch (IOException e) { System.out.println("Errore: " + e + " nella creazione di un file"); System.exit(0); } // Se sono arrivato qua senza eccezioni, ho i 2 flussi (stream) attivi. // Per creare il file di copia bastera' leggere dalla sorgente e scrivere // nella destinazione tutti i bytes, uno alla volta. // Per sapere quanti byte posso copiare (cioe' la lunghezza del file) uso // il metodo int available(). try { LungFile = MioInFilStr.available(); // Mi informo sul num. bytes. } catch (IOException e) { System.out.println("Errore: " + e + " determinando la lungh. di un file"); System.exit(0); } // Per leggere/scrivere uso FileInputStream.read(), FileOutPutStream.write(). // So quanti bytes devo copiare, grazie ad available(). try { for(int i=0; i<LungFile; i++) { MioOutFilStr.write(MioInFilStr.read()); // copio un byte. } } catch (IOException e) { System.out.println("Errore: " + e + " nella copia di un file"); System.exit(0); } // File copiato, posso chiudere i due flussi (stream). try { MioInFilStr.close(); // Chiudo l'InputStream. MioOutFilStr.close(); // Chiudo l'OutputStream. } catch (IOException e) { System.out.println("Errore: " + e + " nella chiusura di un file"); System.exit(0); } // Scriviamo un messaggio di felicitazioni System.out.println("File copiato, " + LungFile + " bytes"); } // Fine del metodo principale Main() //------------------------------------------------------------------------ // Il metodo che scrive un help in caso di mancanza di argomenti. //------------------------------------------------------------------------ public static void usage () { System.out.println("\nUso del comando di copia:\n"); System.out.println(" Jlez6c <sorgente> - (path)file sorgente"); System.out.println(" <destinazione> - (path)file destinazione"); System.out.println(); } } // Fine della classe Jlez6c