Java - File dan I / O

Paket java.io berisi hampir setiap kelas yang mungkin Anda perlukan untuk melakukan input dan output (I / O) di Java. Semua aliran ini mewakili sumber masukan dan tujuan keluaran. Aliran dalam paket java.io mendukung banyak data seperti primitif, objek, karakter lokal, dll.

Aliran

Aliran dapat didefinisikan sebagai urutan data. Ada dua jenis Arus -

  • InPutStream - InputStream digunakan untuk membaca data dari sumber.

  • OutPutStream - OutputStream digunakan untuk menulis data ke tujuan.

Java menyediakan dukungan yang kuat namun fleksibel untuk I / O yang terkait dengan file dan jaringan, tetapi tutorial ini mencakup fungsionalitas yang sangat mendasar yang terkait dengan stream dan I / O. Kita akan melihat contoh yang paling umum digunakan satu per satu -

Aliran Byte

Aliran byte Java digunakan untuk melakukan input dan output byte 8-bit. Meskipun ada banyak kelas yang terkait dengan aliran byte tetapi kelas yang paling sering digunakan adalah,FileInputStream dan FileOutputStream. Berikut adalah contoh yang menggunakan kedua kelas ini untuk menyalin file input ke file 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();
         }
      }
   }
}

Sekarang mari kita punya file input.txt dengan konten berikut -

This is test for copy file.

Sebagai langkah selanjutnya, kompilasi program di atas dan jalankan, yang akan menghasilkan file output.txt dengan konten yang sama seperti yang kita miliki di input.txt. Jadi mari kita letakkan kode di atas dalam file CopyFile.java dan lakukan hal berikut -

$javac CopyFile.java
$java CopyFile

Aliran Karakter

Jawa Byte stream digunakan untuk melakukan input dan output sebesar 8-bit byte, sedangkan Java Characterstream digunakan untuk melakukan input dan output untuk unicode 16-bit. Meskipun ada banyak kelas yang terkait dengan aliran karakter tetapi kelas yang paling sering digunakan adalah,FileReader dan FileWriter. Meskipun secara internal FileReader menggunakan FileInputStream dan FileWriter menggunakan FileOutputStream tetapi di sini perbedaan utamanya adalah FileReader membaca dua byte sekaligus dan FileWriter menulis dua byte sekaligus.

Kita dapat menulis ulang contoh di atas, yang menggunakan kedua kelas ini untuk menyalin file input (memiliki karakter unicode) ke file 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();
         }
      }
   }
}

Sekarang mari kita punya file input.txt dengan konten berikut -

This is test for copy file.

Sebagai langkah selanjutnya, kompilasi program di atas dan jalankan, yang akan menghasilkan file output.txt dengan konten yang sama seperti yang kita miliki di input.txt. Jadi mari kita letakkan kode di atas dalam file CopyFile.java dan lakukan hal berikut -

$javac CopyFile.java
$java CopyFile

Streaming Standar

Semua bahasa pemrograman menyediakan dukungan untuk I / O standar di mana program pengguna dapat mengambil input dari keyboard dan kemudian menghasilkan output di layar komputer. Jika Anda mengetahui bahasa pemrograman C atau C ++, maka Anda harus mengetahui tiga perangkat standar STDIN, STDOUT dan STDERR. Demikian pula, Java menyediakan tiga aliran standar berikut -

  • Standard Input - Ini digunakan untuk memasukkan data ke program pengguna dan biasanya keyboard digunakan sebagai aliran input standar dan direpresentasikan sebagai System.in.

  • Standard Output - Ini digunakan untuk mengeluarkan data yang dihasilkan oleh program pengguna dan biasanya layar komputer digunakan untuk aliran keluaran standar dan direpresentasikan sebagai System.out.

  • Standard Error - Ini digunakan untuk mengeluarkan data kesalahan yang dihasilkan oleh program pengguna dan biasanya layar komputer digunakan untuk aliran kesalahan standar dan direpresentasikan sebagai System.err.

Berikut ini adalah program sederhana, yang membuat InputStreamReader untuk membaca aliran masukan standar sampai pengguna mengetik "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();
         }
      }
   }
}

Mari simpan kode di atas dalam file ReadConsole.java dan coba kompilasi dan jalankan seperti yang ditunjukkan pada program berikut. Program ini terus membaca dan mengeluarkan karakter yang sama sampai kita menekan 'q' -

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

Membaca dan Menulis File

Sebagaimana dijelaskan sebelumnya, aliran dapat didefinisikan sebagai urutan data. ItuInputStream digunakan untuk membaca data dari sumber dan OutputStream digunakan untuk menulis data ke suatu tujuan.

Berikut adalah hierarki kelas untuk menangani aliran Input dan Output.

Dua aliran penting tersebut adalah FileInputStream dan FileOutputStream, yang akan dibahas dalam tutorial ini.

FileInputStream

Aliran ini digunakan untuk membaca data dari file. Objek dapat dibuat dengan menggunakan kata kuncinew dan ada beberapa jenis konstruktor yang tersedia.

Mengikuti konstruktor mengambil nama file sebagai string untuk membuat objek aliran input untuk membaca file -

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

Konstruktor berikut mengambil objek file untuk membuat objek aliran input untuk membaca file. Pertama kita membuat objek file menggunakan metode File () sebagai berikut -

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

Setelah Anda memiliki objek InputStream , maka ada daftar metode pembantu yang dapat digunakan untuk membaca streaming atau melakukan operasi lain di aliran.

Sr.No. Metode & Deskripsi
1

public void close() throws IOException{}

Metode ini menutup aliran keluaran file. Merilis sumber daya sistem apa pun yang terkait dengan file tersebut. Melempar IOException.

2

protected void finalize()throws IOException {}

Metode ini membersihkan koneksi ke file. Memastikan bahwa metode tutup aliran keluaran file ini dipanggil saat tidak ada lagi referensi ke aliran ini. Melempar IOException.

3

public int read(int r)throws IOException{}

Metode ini membaca byte data yang ditentukan dari InputStream. Mengembalikan int. Mengembalikan byte data berikutnya dan -1 akan dikembalikan jika itu akhir file.

4

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

Metode ini membaca r.length byte dari aliran input ke dalam array. Mengembalikan jumlah total byte yang dibaca. Jika ini adalah akhir file, -1 akan dikembalikan.

5

public int available() throws IOException{}

Memberikan jumlah byte yang dapat dibaca dari aliran input file ini. Mengembalikan int.

Ada aliran input penting lainnya yang tersedia, untuk detail lebih lanjut Anda dapat merujuk ke tautan berikut -

  • ByteArrayInputStream

  • DataInputStream

FileOutputStream

FileOutputStream digunakan untuk membuat file dan menulis data ke dalamnya. Aliran akan membuat file, jika belum ada, sebelum membukanya untuk keluaran.

Berikut adalah dua konstruktor yang dapat digunakan untuk membuat objek FileOutputStream.

Mengikuti konstruktor mengambil nama file sebagai string untuk membuat objek aliran input untuk menulis file -

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

Konstruktor berikut mengambil objek file untuk membuat objek aliran output untuk menulis file. Pertama, kita membuat objek file menggunakan metode File () sebagai berikut -

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

Setelah Anda memiliki objek OutputStream , maka ada daftar metode pembantu, yang dapat digunakan untuk menulis ke streaming atau melakukan operasi lain di aliran.

Sr.No. Metode & Deskripsi
1

public void close() throws IOException{}

Metode ini menutup aliran keluaran file. Merilis sumber daya sistem apa pun yang terkait dengan file tersebut. Melempar IOException.

2

protected void finalize()throws IOException {}

Metode ini membersihkan koneksi ke file. Memastikan bahwa metode tutup aliran keluaran file ini dipanggil saat tidak ada lagi referensi ke aliran ini. Melempar IOException.

3

public void write(int w)throws IOException{}

Metode ini menulis byte yang ditentukan ke aliran keluaran.

4

public void write(byte[] w)

Menulis w.length byte dari array byte yang disebutkan ke OutputStream.

Ada aliran keluaran penting lainnya yang tersedia, untuk lebih jelasnya Anda dapat merujuk ke tautan berikut -

  • ByteArrayOutputStream

  • DataOutputStream

Example

Berikut adalah contoh untuk mendemonstrasikan InputStream dan 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");
      }	
   }
}

Kode di atas akan membuat file test.txt dan akan menulis angka yang diberikan dalam format biner. Sama seperti output pada layar stdout.

Navigasi File dan I / O

Ada beberapa kelas lain yang akan kita lalui untuk mengetahui dasar-dasar Navigasi File dan I / O.

  • Kelas File

  • Kelas FileReader

  • Kelas FileWriter

Direktori di Java

Direktori adalah File yang dapat berisi daftar file dan direktori lain. Kau gunakanFileobjek untuk membuat direktori, untuk membuat daftar file yang tersedia dalam direktori. Untuk detail lengkapnya, periksa daftar semua metode yang dapat Anda panggil pada objek File dan apa yang terkait dengan direktori.

Membuat Direktori

Ada dua hal yang berguna File metode utilitas, yang dapat digunakan untuk membuat direktori -

  • Itu mkdir( )metode membuat direktori, mengembalikan nilai true pada kesuksesan dan false pada kegagalan. Kegagalan menunjukkan bahwa jalur yang ditentukan dalam objek File sudah ada, atau direktori tidak dapat dibuat karena seluruh jalur belum ada.

  • Itu mkdirs() metode membuat direktori dan semua induk direktori.

Contoh berikut membuat direktori "/ 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();
   }
}

Kompilasi dan jalankan kode di atas untuk membuat "/ tmp / user / java / bin".

Note- Java secara otomatis menangani pemisah jalur pada UNIX dan Windows sesuai konvensi. Jika Anda menggunakan garis miring (/) pada Java versi Windows, jalur akan tetap terselesaikan dengan benar.

Direktori Pencatatan

Kamu dapat memakai list( ) metode yang disediakan oleh File objek untuk mencantumkan semua file dan direktori yang tersedia dalam direktori sebagai berikut -

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

Ini akan menghasilkan hasil berikut berdasarkan direktori dan file yang tersedia di file /tmp direktori -

Output

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