File

  1. Scrivere un programma che stampi il contenuto di una directory, il cui pathname dovrà essere specificato come argomento del metodo main. La stampa deve essere il più possibile uguale a quella prodotta dal comando di shell ls -lsa, includendo quindi il nome dei file, la loro dimensione e l'indicazione della presenza di directory e dei permessi di acccesso. Suggerimento: leggere nelle API la documentazione della classe java.io.File.
  2. Scrivere un programma che permetta di effettuare la copia di un file, in analogia con il comando di shell cp. Come nell'esercizio precedente, i due argomenti necessari per portare a termine l'operazione (il pathname del file da copiare e il pathname della copia) devono essere specificati coma argomenti di main all'atto dell'esecuzione. Suggerimento: leggere nelle API la documentazione delle classi FileInputStream e FileOutputStream (entrambe nel package java.io), con particolare attenzione ai metodi da invocare per leggere e scrivere un byte, facendo attenzione al fatto che tali metodi utilizzano int come tipo per argomento o valore restituito e verificando opportunamente quando tutti i byte del file da copiare sono stati letti.
  3. Scrivere un programma che stampi a video il contenuto di un file, in analogia con il comando di shell cat ma con la funzionalità aggiuntiva di numerazione delle linee. Tale programma dovrà ricevere il pathname del file da esaminare come argomento di main e leggerlo riga per riga, stampando di volta in volta la riga letta preceduta da un numero che verrà incrementato di un'unità a ogni lettura, partendo da 1. Non dimenticare di aggiungere uno (e un solo) spazio tra numero e linea del file.
  4. Leggere nelle API la documentazione della classe java.lang.System, in particolare per quanto riguarda le sue variabili di istanza in, out ed err. Leggere anche la documentazione dei metodi setIn, setOut e setErr della stessa classe e scrivere un programma che rediriga le stampe fatte invocando System.out.println a un file piuttosto che a video.
  5. Nella prima lezione è stato spiegato un metodo che permette di redirigere l'output di un comando di shell. Utilizzare tale metodo per ottenere lo stesso effetto del programma descritto al punto precedente.
  6. Scrivere un programma Conta che permetta di contare il numero di righe, di parole o di caratteri contenuti in un file. Il programma dovrà accettare uno oppure due argomenti passati a main. Nel caso in cui vi siano due argomenti, il primo dovrà necessariamente essere uguale alla stringa "-r", "-w" oppure "-c" (pena l'emissione di un'eccezione opportuna, la cui classe andrà corrispondentemente creata), e il secondo dovrà essere interpretato come il pathname di un file di cui andrà letto il numero di righe, parole o caratteri (a seconda che il valore del primo argomento sia rispettivamente "-r", "-w" oppure "-c"). Quando invece sarà presente un solo argomento questo andrà interpretato come il pathname di un file di cui bisogna contare il numero di righe, di parole e di caratteri, stampando a video i tre valori (ognuno su una riga).
  7. Scrivere una classe Console che implementi le funzionalità delle classi prog.io.ConsoleInputManager e prog.io.ConsoleOutputManager, e cioè: Implementare Console come una cosiddetta classe utility, caratterizzata dal fatto che tutti i suoi metodi risultano invocabili senza che sia necessario costuire un'istanza della classe, a differenza di quanto succede con ConsoleInputManager e ConsoleOutputManager.
  8. Modificare il programma relativo al punto 3 in modo che ogni volta che un file risulta essere troppo lungo per essere interamente contenuto nella finestra del terminale, la stampa dei suoi contenuti venga interrotta ogni volta che la finestra stessa risulta riempita, in attesa che l'utente prema il tasto di ‘a capo’. Suggerimento: utilizzare la classe Console realizzata al punto 7 e ipotizzare di conoscere a priori il numero di righe del proprio terminale (contandole `a mano').
  9. Scrivere un programma che calcoli le frequenze delle lettere contenute in un file. Più precisamente, il programma accetterà come argomenti di main due stringhe, che indicheranno rispettivamente il pathname del file da leggere e quello di un secondo file in cui scrivere i risultati. Il file dovrà essere letto carattere per carattere, scartando i caratteri non alfabetici e tenendo traccia del numero di occorrenze di ogni lettera, indipendentemente dal fatto che questa sia maiuscola oppure minuscola. Una volta terminata la lettura del file, andrà aperto un secondo file in scrittura (il cui pathname sarà specificato come secondo argomento di main). Su tale file andranno scritte ventisei righe (una per ogni lettera dell'alfabeto), ognuna delle quali dovrà contenere la corrispondente lettera scritta in maiuscolo, seguita da uno (e un solo) carattere di spazio e dal numero di occorrenze corrispondenti.