JavaRush /Java Blog /Random-ID /I/O di Jawa. Kelas FileInputStream, FileOutputStream, Buf...

I/O di Jawa. Kelas FileInputStream, FileOutputStream, BufferedInputStream

Dipublikasikan di grup Random-ID
Halo! Dalam kuliah hari ini kita akan melanjutkan pembicaraan tentang aliran input dan output di Java, atau disingkat Java I/O (“input-output”). Ini bukan kuliah pertama mengenai topik ini, dan ini bukan yang terakhir :) Kebetulan Java sebagai bahasa memberikan banyak peluang untuk bekerja dengan input/output. Kelas yang mengimplementasikan fungsi ini cukup banyak, jadi kami membaginya menjadi beberapa kuliah agar Anda tidak bingung pada awalnya :) I/O di Jawa.  Kelas FileInputStream, FileOutputStream, BufferedInputStream - 1Pada kuliah sebelumnya kita telah menyentuh BufferedReader , serta kelas abstrak InputStream & OutputStream dan beberapa keturunan. Hari ini kita akan melihat 3 kelas baru: FileInputStream , FileOutputStream dan BufferedInputStream .

kelas FileOutputStream

Tujuan utama dari kelas FileOutputStream adalah untuk menulis byte ke file. Tidak ada yang rumit :) FileOutputStream adalah salah satu implementasi dari kelas abstrak OutputStream . Di konstruktor, objek kelas ini mengambil jalur ke file target (yang byte perlu ditulis) atau objek kelas File. Mari kita lihat kedua contoh:
public class Main {

   public static void main(String[] args) throws IOException {


       File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
       FileOutputStream fileOutputStream = new FileOutputStream(file);

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Saat membuat objek, Filekami menentukan di konstruktor jalur di mana objek tersebut seharusnya ditempatkan. Tidak perlu membuatnya terlebih dahulu: jika tidak ada, program akan membuatnya sendiri. Anda dapat melakukannya tanpa membuat objek tambahan dan cukup meneruskan string dengan alamat:
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Hasil dalam kedua kasus tersebut akan sama. Kita dapat membuka file kita dan melihat di sana:

Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Namun, ada satu peringatan di sini. Coba jalankan kode dari contoh di atas beberapa kali berturut-turut, lalu lihat file tersebut dan jawab pertanyaan: berapa baris yang Anda lihat tertulis di dalamnya? Hanya satu. Namun Anda menjalankan kode tersebut beberapa kali. Namun, ternyata data tersebut selalu ditimpa, menggantikan yang lama. Bagaimana jika kita tidak puas dengan ini dan memerlukan perekaman berurutan? Bagaimana jika kita ingin menulis salam pada sebuah file tiga kali berturut-turut? Semuanya sederhana di sini. Karena bahasa itu sendiri tidak dapat mengetahui jenis perilaku yang kita perlukan dalam setiap kasus, FileOutputStreamAnda dapat meneruskan parameter tambahan ke konstruktor - boolean append. Jika nilainya benar , data akan ditulis di akhir file. Jika false (dan nilai defaultnya adalah false ), data lama akan dihapus dan data baru akan ditulis. Mari kita uji dan jalankan kode yang telah dimodifikasi sebanyak tiga kali:
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);

       String greetings = "Hi! Welcome to JavaRush - the best site for those who want to become a programmer!\r\n";

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Hasil dalam file:

Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hal lain! Ingatlah fitur ini saat menggunakan kelas I/O. Pada suatu waktu, saya harus duduk berjam-jam mengerjakan tugas untuk memahami ke mana perginya data lama saya dari file :) Dan tentu saja, seperti halnya kelas I/O lainnya, jangan lupa untuk melepaskan sumber daya melalui close().

kelas FileInputStream

Kelas memiliki FileInputStreamtujuan sebaliknya - membaca byte dari file. Sama seperti FileOutputStreammewarisi OutputStream, kelas ini berasal dari kelas abstrak InputStream. Mari kita tulis beberapa baris teks ke dalam teks kita “ test.txt ”:

«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
I/O di Jawa.  Kelas FileInputStream, FileOutputStream, BufferedInputStream - 2 Berikut implementasi pembacaan data dari sebuah file dengan menggunakan FileInputStream:
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       int i;

       while((i=fileInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
Kami membaca satu byte dari file, mengubah byte yang dibaca menjadi karakter dan mengeluarkannya ke konsol. Dan inilah hasilnya di konsol:

So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters

kelas BufferedInputStream

Saya rasa, dengan pengetahuan dari perkuliahan sebelumnya, Anda dapat dengan mudah mengetahui mengapa kelas tersebut diperlukan BufferedInputStreamdan apa kelebihannya FileInputStream:) Kita telah bertemu dengan aliran buffer, jadi coba tebak (atau ingat) sebelum melanjutkan membaca :) Aliran buffer diperlukan terutama untuk mengoptimalkan I/O. Mengakses sumber data, seperti membaca dari file, adalah operasi yang memerlukan kinerja intensif. Dan mengakses file untuk membaca satu byte setiap kali adalah pemborosan. Oleh karena itu, BufferedInputStreamia membaca data bukan satu byte pada satu waktu, tetapi dalam blok dan menyimpannya untuk sementara dalam buffer khusus. Hal ini memungkinkan kami untuk mengoptimalkan pengoperasian program dengan mengurangi jumlah akses ke file. Mari kita lihat seperti apa:
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
Di sini kita telah membuat sebuah objek BufferedInputStream. Ia menerima suatu objek atau penerusnya sebagai masukan InputStream, sehingga masukan sebelumnya FileInputStreamakan diterima. Dibutuhkan ukuran buffer dalam byte sebagai parameter tambahan. Sekarang, berkat ini, data akan dibaca dari file bukan satu byte dalam satu waktu, tetapi 200 byte sekaligus! Bayangkan betapa kita telah mengurangi jumlah akses file. Untuk membandingkan kinerja, Anda dapat mengambil beberapa file teks besar berukuran beberapa megabyte dan membandingkan berapa lama waktu yang dibutuhkan untuk membacanya dan mengeluarkannya ke konsol dalam milidetik menggunakan FileInputStreamdan BufferedInputStream. Berikut kedua contoh kodenya:
public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}



public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");


       int i;

       while((i = fileInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}
Saat membaca file 1,5 MB di komputer saya, FileInputStreamia berhasil dalam ~3500 milidetik, tetapi di sini BufferedInputStreamia berhasil dalam ~1700 milidetik. Seperti yang Anda lihat, aliran buffer mengoptimalkan kinerja program sebanyak 2 kali lipat! :) Kami akan terus mempelajari kelas I/O - sampai jumpa lagi!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION