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

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

Diterbitkan dalam kumpulan
hello! Dalam kuliah hari ini kita akan meneruskan perbualan mengenai aliran input dan output dalam Java, atau singkatannya Java I/O (“input-output”). Ini bukan kuliah pertama mengenai topik ini, dan ia bukan yang terakhir :) Kebetulan Java sebagai bahasa menyediakan banyak peluang untuk bekerja dengan input/output. Terdapat banyak kelas yang melaksanakan fungsi ini, jadi kami membahagikannya kepada beberapa kuliah supaya anda tidak keliru pada mulanya :) I/O di Jawa.  Kelas FileInputStream, FileOutputStream, BufferedInputStream - 1Dalam kuliah sebelum ini kami menyentuh BufferedReader , serta kelas abstrak InputStream & OutputStream dan beberapa keturunan. Hari ini kita akan melihat 3 kelas baharu: FileInputStream , FileOutputStream dan BufferedInputStream .

Kelas FileOutputStream

Tujuan utama kelas FileOutputStream adalah untuk menulis bait pada fail. Tiada yang rumit :) FileOutputStream ialah salah satu pelaksanaan kelas OutputStream abstrak . Dalam pembina, objek kelas ini mengambil sama ada laluan ke fail sasaran (yang mana bait perlu ditulis) atau objek kelas File. Mari kita lihat kedua-dua 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();
   }
}
Apabila mencipta objek, Filekami menentukan dalam pembina laluan di mana ia sepatutnya terletak. Tidak perlu menciptanya terlebih dahulu: jika ia tidak wujud, program akan menciptanya sendiri. Anda boleh lakukan tanpa membuat objek tambahan dan hanya lulus rentetan 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();
   }
}
Keputusan dalam kedua-dua kes adalah sama. Kami boleh membuka fail kami dan melihat di sana:

Hello! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Walau bagaimanapun, terdapat satu kaveat di sini. Cuba jalankan kod daripada contoh di atas beberapa kali berturut-turut, dan kemudian lihat fail dan jawab soalan: berapa banyak baris yang anda lihat tertulis di dalamnya? Hanya satu. Tetapi anda menjalankan kod itu beberapa kali. Walau bagaimanapun, ternyata data telah ditimpa setiap kali, menggantikan yang lama. Bagaimana jika kita tidak berpuas hati dengan ini dan memerlukan rakaman berurutan? Bagaimana jika kita ingin menulis ucapan kita pada fail tiga kali berturut-turut? Semuanya mudah di sini. Oleh kerana bahasa itu sendiri tidak dapat mengetahui jenis tingkah laku yang kita perlukan dalam setiap kes, FileOutputStreamanda boleh menghantar parameter tambahan kepada pembina - boolean append. Jika nilainya benar , data akan ditulis ke penghujung fail. Jika palsu (dan nilai lalainya palsu ), data lama akan dipadamkan dan data baharu akan ditulis. Mari uji dan jalankan kod kami yang diubah suai 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();
   }
}
Keputusan dalam fail:

Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hello! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Perkara lain! Sentiasa ingat ciri ini apabila menggunakan kelas I/O. Pada satu masa, saya terpaksa duduk berjam-jam dalam tugasan untuk memahami ke mana data lama saya pergi dari fail :) Dan sudah tentu, seperti dalam kes kelas I/O lain, jangan lupa tentang melepaskan sumber melalui fail close().

Kelas FileInputStream

Kelas mempunyai FileInputStreamtujuan yang bertentangan - membaca bait daripada fail. Sama seperti FileOutputStreamwarisan OutputStream, kelas ini berasal daripada kelas abstrak InputStream. Mari tulis beberapa baris teks ke dalam teks kami " 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 Inilah pelaksanaan membaca data daripada fail 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 bait daripada fail, menukar bait baca kepada aksara dan mengeluarkannya ke konsol. Dan inilah hasilnya dalam 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 fikir, berdasarkan pengetahuan dari kuliah sebelum ini, anda boleh dengan mudah mengetahui mengapa kelas itu diperlukan BufferedInputStreamdan apa kelebihannya FileInputStream:) Kami telah pun bertemu dengan aliran buffer, jadi cuba teka (atau ingat) sebelum meneruskan bacaan :) Aliran penampan diperlukan terutamanya untuk mengoptimumkan I/O. Mengakses sumber data, seperti membaca daripada fail, ialah operasi intensif prestasi. Dan mengakses fail untuk membaca satu bait setiap kali adalah membazir. Oleh itu, BufferedInputStreamia membaca data bukan satu bait pada satu masa, tetapi dalam blok dan menyimpannya buat sementara waktu dalam penimbal khas. Ini membolehkan kami mengoptimumkan pengendalian program dengan mengurangkan bilangan akses kepada fail. Mari lihat bagaimana rupanya:
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 kami telah mencipta objek BufferedInputStream. Ia menerima objek atau mana-mana penggantinya sebagai input InputStream, jadi yang sebelumnya FileInputStreamakan melakukannya. Ia mengambil saiz penimbal dalam bait sebagai parameter tambahan. Sekarang, terima kasih kepada ini, data akan dibaca daripada fail bukan satu bait pada satu masa, tetapi 200 pada satu masa! Bayangkan betapa kami telah mengurangkan bilangan akses fail. Untuk membandingkan prestasi, anda boleh mengambil beberapa fail teks besar bersaiz beberapa megabait dan membandingkan tempoh masa yang diperlukan untuk membacanya dan mengeluarkannya ke konsol dalam milisaat menggunakan FileInputStreamdan BufferedInputStream. Berikut ialah kedua-dua contoh kod:
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()));
   }
}
Apabila membaca fail 1.5 MB pada komputer saya, FileInputStreamia melakukan kerja dalam ~3500 milisaat, tetapi di sini BufferedInputStreamia melakukan kerja dalam ~1700 milisaat. Seperti yang anda lihat, strim buffer mengoptimumkan prestasi program sebanyak 2 kali! :) Kami akan terus belajar kelas I/O - jumpa lagi!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION