Java - File e I / O

Il pacchetto java.io contiene quasi tutte le classi di cui potresti aver bisogno per eseguire input e output (I / O) in Java. Tutti questi flussi rappresentano una sorgente di input e una destinazione di output. Il flusso nel pacchetto java.io supporta molti dati come primitive, oggetti, caratteri localizzati, ecc.

Stream

Un flusso può essere definito come una sequenza di dati. Esistono due tipi di stream:

  • InPutStream - InputStream viene utilizzato per leggere i dati da una sorgente.

  • OutPutStream - OutputStream viene utilizzato per scrivere dati su una destinazione.

Java fornisce un supporto forte ma flessibile per l'I / O relativo a file e reti, ma questo tutorial copre funzionalità di base relative a flussi e I / O. Vedremo uno per uno gli esempi più comunemente usati:

Byte Streams

I flussi di byte Java vengono utilizzati per eseguire l'input e l'output di byte a 8 bit. Sebbene ci siano molte classi relative ai flussi di byte, ma le classi utilizzate più di frequente sono,FileInputStream e FileOutputStream. Di seguito è riportato un esempio che utilizza queste due classi per copiare un file di input in un file di output:

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {  
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Ora facciamo un file input.txt con il seguente contenuto -

This is test for copy file.

Come passaggio successivo, compila il programma sopra ed eseguilo, il che si tradurrà nella creazione del file output.txt con lo stesso contenuto che abbiamo in input.txt. Quindi mettiamo il codice sopra nel file CopyFile.java e facciamo quanto segue:

$javac CopyFile.java
$java CopyFile

Flussi di personaggi

Giava Byte i flussi vengono utilizzati per eseguire input e output di byte a 8 bit, mentre Java Characteri flussi vengono utilizzati per eseguire input e output per Unicode a 16 bit. Sebbene ci siano molte classi relative ai flussi di personaggi, ma le classi utilizzate più di frequente sono,FileReader e FileWriter. Sebbene internamente FileReader utilizzi FileInputStream e FileWriter utilizzi FileOutputStream, ma qui la differenza principale è che FileReader legge due byte alla volta e FileWriter scrive due byte alla volta.

Possiamo riscrivere l'esempio precedente, che utilizza queste due classi per copiare un file di input (con caratteri Unicode) in un file di output -

Example

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Ora facciamo un file input.txt con il seguente contenuto -

This is test for copy file.

Come passaggio successivo, compila il programma sopra ed eseguilo, il che si tradurrà nella creazione del file output.txt con lo stesso contenuto che abbiamo in input.txt. Quindi mettiamo il codice sopra nel file CopyFile.java e facciamo quanto segue:

$javac CopyFile.java
$java CopyFile

Stream standard

Tutti i linguaggi di programmazione forniscono supporto per I / O standard in cui il programma dell'utente può ricevere input da una tastiera e quindi produrre un output sullo schermo del computer. Se sei a conoscenza dei linguaggi di programmazione C o C ++, devi essere a conoscenza di tre dispositivi standard STDIN, STDOUT e STDERR. Allo stesso modo, Java fornisce i seguenti tre flussi standard:

  • Standard Input - Viene utilizzato per fornire i dati al programma dell'utente e di solito viene utilizzata una tastiera come flusso di input standard e rappresentata come System.in.

  • Standard Output - Viene utilizzato per produrre i dati prodotti dal programma dell'utente e di solito lo schermo di un computer viene utilizzato per il flusso di output standard e rappresentato come System.out.

  • Standard Error - Viene utilizzato per visualizzare i dati di errore prodotti dal programma dell'utente e di solito lo schermo di un computer viene utilizzato per il flusso di errore standard e rappresentato come System.err.

Di seguito è riportato un semplice programma, che crea InputStreamReader per leggere il flusso di input standard fino a quando l'utente non digita una "q" -

Example

import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

Manteniamo il codice sopra nel file ReadConsole.java e proviamo a compilarlo ed eseguirlo come mostrato nel seguente programma. Questo programma continua a leggere e produrre lo stesso carattere finché non premiamo 'q' -

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

Lettura e scrittura di file

Come descritto in precedenza, un flusso può essere definito come una sequenza di dati. IlInputStream viene utilizzato per leggere i dati da una sorgente e il file OutputStream viene utilizzato per scrivere dati in una destinazione.

Ecco una gerarchia di classi per gestire i flussi di input e output.

I due flussi importanti sono FileInputStream e FileOutputStream, che sarà discusso in questo tutorial.

FileInputStream

Questo flusso viene utilizzato per leggere i dati dai file. Gli oggetti possono essere creati utilizzando la parola chiavenew e sono disponibili diversi tipi di costruttori.

Il seguente costruttore prende un nome file come stringa per creare un oggetto flusso di input per leggere il file -

InputStream f = new FileInputStream("C:/java/hello");

Il seguente costruttore prende un oggetto file per creare un oggetto flusso di input per leggere il file. Per prima cosa creiamo un oggetto file usando il metodo File () come segue:

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

Una volta che hai l' oggetto InputStream in mano, c'è un elenco di metodi di supporto che possono essere usati per leggere nel flusso o per fare altre operazioni sul flusso.

Sr.No. Metodo e descrizione
1

public void close() throws IOException{}

Questo metodo chiude il flusso di output del file. Rilascia tutte le risorse di sistema associate al file. Genera un'IOException.

2

protected void finalize()throws IOException {}

Questo metodo elimina la connessione al file. Assicura che il metodo di chiusura di questo flusso di output del file venga chiamato quando non ci sono più riferimenti a questo flusso. Genera un'IOException.

3

public int read(int r)throws IOException{}

Questo metodo legge il byte di dati specificato da InputStream. Restituisce un int. Restituisce il prossimo byte di dati e -1 se è la fine del file.

4

public int read(byte[] r) throws IOException{}

Questo metodo legge i byte r.length dal flusso di input in un array. Restituisce il numero totale di byte letti. Se è la fine del file, verrà restituito -1.

5

public int available() throws IOException{}

Fornisce il numero di byte che possono essere letti da questo flusso di input di file. Restituisce un int.

Sono disponibili altri importanti flussi di input, per maggiori dettagli è possibile fare riferimento ai seguenti collegamenti:

FileOutputStream

FileOutputStream viene utilizzato per creare un file e scrivere dati in esso. Il flusso creerebbe un file, se non esiste già, prima di aprirlo per l'output.

Ecco due costruttori che possono essere usati per creare un oggetto FileOutputStream.

Il seguente costruttore prende un nome file come stringa per creare un oggetto flusso di input per scrivere il file -

OutputStream f = new FileOutputStream("C:/java/hello")

Il costruttore seguente prende un oggetto file per creare un oggetto flusso di output per scrivere il file. Innanzitutto, creiamo un oggetto file utilizzando il metodo File () come segue:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

Una volta che hai in mano l'oggetto OutputStream , c'è un elenco di metodi di supporto, che possono essere usati per scrivere nello stream o per eseguire altre operazioni sullo stream.

Sr.No. Metodo e descrizione
1

public void close() throws IOException{}

Questo metodo chiude il flusso di output del file. Rilascia tutte le risorse di sistema associate al file. Genera un'IOException.

2

protected void finalize()throws IOException {}

Questo metodo elimina la connessione al file. Assicura che il metodo di chiusura di questo flusso di output del file venga chiamato quando non ci sono più riferimenti a questo flusso. Genera un'IOException.

3

public void write(int w)throws IOException{}

Questo metodo scrive il byte specificato nel flusso di output.

4

public void write(byte[] w)

Scrive w.length byte dall'array di byte menzionato in OutputStream.

Sono disponibili altri importanti flussi di output, per maggiori dettagli è possibile fare riferimento ai seguenti collegamenti:

Example

Di seguito è riportato l'esempio per dimostrare InputStream e OutputStream -

import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {
   
      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );   // writes the bytes
         }
         os.close();
     
         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      }	
   }
}

Il codice sopra creerebbe il file test.txt e scriverà i numeri dati in formato binario. Lo stesso sarebbe l'output sullo schermo stdout.

Navigazione file e I / O

Ci sono molte altre classi che vorremmo seguire per conoscere le basi della navigazione dei file e dell'I / O.

Directory in Java

Una directory è un file che può contenere un elenco di altri file e directory. UsateFileoggetto per creare directory, per elencare i file disponibili in una directory. Per i dettagli completi, controlla un elenco di tutti i metodi che puoi chiamare sull'oggetto File e cosa sono correlati alle directory.

Creazione di directory

Ce ne sono due utili File metodi di utilità, che possono essere utilizzati per creare directory -

  • Il mkdir( )metodo crea una directory, restituendo true in caso di successo e false in caso di fallimento. L'errore indica che il percorso specificato nell'oggetto File esiste già o che la directory non può essere creata perché l'intero percorso non esiste ancora.

  • Il mkdirs() metodo crea sia una directory che tutti i genitori della directory.

L'esempio seguente crea la directory "/ tmp / user / java / bin" -

Example

import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      
      // Create directory now.
      d.mkdirs();
   }
}

Compila ed esegui il codice precedente per creare "/ tmp / user / java / bin".

Note- Java si occupa automaticamente dei separatori di percorso su UNIX e Windows secondo le convenzioni. Se si utilizza una barra (/) su una versione Windows di Java, il percorso verrà comunque risolto correttamente.

Directory di elenco

Puoi usare list( ) metodo fornito da File oggetto per elencare tutti i file e le directory disponibili in una directory come segue:

Example

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         // create new file object
         file = new File("/tmp");

         // array of files and directory
         paths = file.list();

         // for each name in the path array
         for(String path:paths) {
            // prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
         // if any error occurs
         e.printStackTrace();
      }
   }
}

Questo produrrà il seguente risultato in base alle directory e ai file disponibili nel tuo /tmp directory -

Output

test1.txt
test2.txt
ReadDir.java
ReadDir.class