Paket Java.io berisi hampir semua kelas yang diperlukan untuk mengoperasikan input dan output. Semua kelas aliran ini mewakili sumber masukan dan tujuan keluaran.
Aliran dalam paket Java.io mendukung banyak format, seperti tipe dasar, objek, rangkaian karakter yang dilokalkan, dll.
Aliran dapat dipahami sebagai rangkaian data. Aliran input mewakili pembacaan data dari sumber, dan aliran output mewakili penulisan data ke tujuan.
Java memberikan dukungan yang kuat dan fleksibel untuk I/O, sehingga lebih banyak digunakan dalam transfer file dan pemrograman jaringan.
Namun bagian ini mencakup fungsi paling dasar yang terkait dengan stream dan I/O. Kita akan mempelajari fungsi-fungsi ini melalui contoh satu per satu.
Input konsol Java dilakukan oleh System.in.
Untuk mendapatkan aliran karakter yang terikat ke konsol, Anda dapat membungkus System.in dalam objek BufferedReader untuk membuat aliran karakter.
Berikut ini adalah sintaks dasar untuk membuat BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
Setelah objek BufferedReader dibuat, kita dapat menggunakan metode read() untuk membaca karakter dari konsol, atau metode readLine() untuk membaca string.
Untuk membaca karakter dari objek BufferedReader, gunakan metode read(), yang sintaksnya adalah sebagai berikut:
intread()throwsIOException
Setiap kali metode read() dipanggil, ia membaca karakter dari aliran input dan mengembalikan karakter tersebut sebagai nilai integer. Mengembalikan -1 saat streaming berakhir. Metode ini menampilkan IOException.
Program berikut mendemonstrasikan penggunaan metode read() untuk terus membaca karakter dari konsol hingga pengguna memasukkan "q".
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
Membaca string dari input standar memerlukan penggunaan metode readLine() dari BufferedReader.
Format umumnya adalah:
StringreadLine()throwsIOException
Program berikut membaca dan menampilkan baris karakter hingga Anda memasukkan kata "end".
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Seperti disebutkan sebelumnya, keluaran konsol diselesaikan oleh print() dan println(). Metode ini ditentukan oleh kelas PrintStream, dan System.out adalah referensi ke objek kelas ini.
PrintStream mewarisi kelas OutputStream dan mengimplementasikan metode write(). Dengan cara ini, write() juga dapat digunakan untuk menulis operasi ke konsol.
PrintStream mendefinisikan write() dalam bentuk paling sederhana sebagai berikut:
voidwrite(intbyteval)
Metode ini menulis oktet byteval yang lebih rendah ke aliran.
Contoh berikut menggunakan write() untuk mencetak karakter "A" diikuti dengan karakter baris baru ke layar:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Jalankan contoh di atas untuk menampilkan karakter "A" di jendela keluaran.
A
Catatan: Metode write() jarang digunakan karena metode print() dan println() lebih nyaman digunakan.
Seperti disebutkan sebelumnya, aliran didefinisikan sebagai urutan data. Aliran masukan digunakan untuk membaca data dari sumber, dan aliran keluaran digunakan untuk menulis data ke target.
Gambar berikut adalah diagram hierarki kelas yang menggambarkan aliran masukan dan aliran keluaran.
Dua aliran penting yang akan dibahas di bawah ini adalah FileInputStream dan FileOutputStream:
Aliran ini digunakan untuk membaca data dari suatu file, dan objeknya dapat dibuat menggunakan kata kunci baru.
Ada berbagai metode konstruktor yang digunakan untuk membuat objek.
Anda dapat menggunakan nama file string untuk membuat objek aliran input untuk membaca file:
InputStreamf=newFileInputStream("C:/java/hello");
Anda juga dapat menggunakan objek file untuk membuat objek aliran input untuk membaca file. Pertama-tama kita harus membuat objek file menggunakan metode File():
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
Setelah membuat objek InputStream, Anda dapat menggunakan metode berikut untuk membaca aliran atau melakukan operasi aliran lainnya.
nomor seri | Metode dan Deskripsi |
---|---|
1 | public void close() throws IOException{} Menutup aliran masukan file ini dan melepaskan semua sumber daya sistem yang terkait dengan aliran ini. Melemparkan IOException. |
2 | protected void finalize()throws IOException {} Metode ini menghapus koneksi ke file. Pastikan untuk memanggil metode close aliran input file ketika tidak lagi direferensikan. Melemparkan IOException. |
3 | public int read(int r)throws IOException{} Metode ini membaca byte data tertentu dari objek InputStream. Dikembalikan sebagai nilai integer. Mengembalikan byte data berikutnya, atau -1 jika akhir telah tercapai. |
4 | public int read(byte[] r) throws IOException{} Metode ini membaca r.length byte dari aliran input. Mengembalikan jumlah byte yang dibaca. Jika ini adalah akhir file, -1 dikembalikan. |
5 | public int tersedia() throws IOException{} Mengembalikan jumlah byte yang bisa dibaca dari aliran masukan ini tanpa diblokir oleh pemanggilan metode berikutnya pada aliran masukan ini. Mengembalikan nilai integer. |
Selain InputStream, ada beberapa input stream lainnya. Untuk lebih jelasnya, silakan merujuk ke link di bawah ini:
ByteArrayInputStream
Aliran Masukan Data
Kelas ini digunakan untuk membuat file dan menulis data ke file tersebut.
Jika file target tidak ada sebelum aliran membuka file untuk keluaran, aliran akan membuat file tersebut.
Ada dua konstruktor yang dapat digunakan untuk membuat objek FileOutputStream.
Buat objek aliran keluaran menggunakan nama file string:
OutputStreamf=newFileOutputStream("C:/java/hello")
Anda juga dapat menggunakan objek file untuk membuat aliran keluaran untuk ditulis ke file. Pertama-tama kita harus membuat objek file menggunakan metode File():
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
Setelah membuat objek OutputStream, Anda dapat menggunakan metode berikut untuk menulis ke aliran atau melakukan operasi aliran lainnya.
nomor seri | Metode dan Deskripsi |
---|---|
1 | public void close() throws IOException{} Menutup aliran masukan file ini dan melepaskan semua sumber daya sistem yang terkait dengan aliran ini. Melemparkan IOException. |
2 | protected void finalize()throws IOException {} Metode ini menghapus koneksi ke file. Pastikan untuk memanggil metode close aliran input file ketika tidak lagi direferensikan. Melemparkan 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 byte dengan panjang w.length dalam array yang ditentukan ke OutputStream. |
Selain OutputStream, ada beberapa output stream lainnya. Untuk lebih jelasnya, silakan merujuk ke link di bawah ini:
Aliran Keluaran ByteArray
Aliran Keluaran Data
Berikut adalah contoh yang menunjukkan penggunaan 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"); } } }
Program di atas pertama-tama membuat file test.txt, menulis nomor tertentu ke dalam file dalam bentuk biner, dan mengeluarkannya ke konsol.
Karena kode di atas ditulis dalam biner, mungkin terdapat karakter yang kacau. Anda dapat menggunakan contoh kode berikut untuk menyelesaikan masalah kode yang kacau:
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
Ada juga beberapa kelas tentang file dan I/O yang juga perlu kita ketahui:
Kelas File (kelas)
Kelas Pembaca File (kelas)
Kelas Penulis File (kelas)
Ada dua metode di kelas File yang bisa digunakan untuk membuat folder:
Metode mkdir() membuat folder dan mengembalikan nilai true jika berhasil dan false jika gagal. Kegagalan menunjukkan bahwa jalur yang ditentukan oleh objek File sudah ada, atau folder tidak dapat dibuat karena seluruh jalur belum ada.
Metode mkdirs() membuat folder dan semua folder induknya.
Contoh berikut membuat folder "/tmp/user/java/bin":
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Kompilasi dan jalankan kode di atas untuk membuat direktori "/tmp/user/java/bin".
Catatan: Java secara otomatis menyelesaikan pemisah jalur file berdasarkan konvensi di UNIX dan Windows. Jika Anda menggunakan pembatas (/) di Java versi Windows, jalur akan tetap diurai dengan benar.
Direktori sebenarnya adalah objek File yang berisi file dan folder lain.
Jika Anda membuat objek File dan itu adalah direktori, pemanggilan metode isDirectory() akan menghasilkan nilai true.
Anda dapat mengekstrak daftar file dan folder di dalamnya dengan memanggil metode list() pada objek.
Contoh yang ditunjukkan di bawah ini mengilustrasikan cara menggunakan metode list() untuk memeriksa konten folder:
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Untuk menghapus file, gunakan metode java.io.File.delete().
Kode berikut akan menghapus direktori /tmp/java/. Perlu dicatat bahwa ketika menghapus direktori tertentu, Anda harus memastikan bahwa tidak ada file lain di direktori untuk menghapusnya dengan benar, jika tidak, penghapusan akan gagal.
Struktur direktori pengujian:
/tmp/java/ |-- 1.log |-- tes
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }