Java Stream、Fail、IO


Pakej Java.io mengandungi hampir semua kelas yang diperlukan untuk mengendalikan input dan output. Semua kelas aliran ini mewakili sumber input dan destinasi output.

Strim dalam pakej Java.io menyokong banyak format, seperti jenis asas, objek, set aksara setempat, dsb.

Strim boleh difahami sebagai jujukan data. Strim input mewakili membaca data daripada sumber, dan aliran output mewakili menulis data ke destinasi.

Java menyediakan sokongan yang kuat dan fleksibel untuk I/O, menjadikannya lebih meluas digunakan dalam pemindahan fail dan pengaturcaraan rangkaian.

Tetapi bahagian ini menerangkan fungsi paling asas yang berkaitan dengan strim dan I/O. Kita akan mempelajari fungsi ini melalui contoh satu persatu.


Baca input konsol

Input konsol Java dilengkapkan oleh System.in.

Untuk mendapatkan strim aksara yang terikat pada konsol, anda boleh mencipta strim aksara dengan membungkus System.in dalam objek BufferedReader.

Berikut ialah sintaks asas untuk mencipta BufferedReader:

BufferedReader br = new BufferedReader(new 
                      InputStreamReader(System.in));

Selepas objek BufferedReader dicipta, kita boleh menggunakan kaedah read() untuk membaca aksara daripada konsol, atau menggunakan kaedah readLine() untuk membaca rentetan.


Baca input berbilang aksara daripada konsol

Untuk membaca aksara daripada objek BufferedReader, gunakan kaedah read() sintaksnya adalah seperti berikut:

int read( ) throws IOException

Setiap Apabila kaedah baca() dipanggil, ia membaca aksara daripada aliran input dan mengembalikan aksara sebagai nilai integer. Mengembalikan -1 apabila strim tamat. Kaedah ini membuang IOException.

Atur cara berikut menunjukkan menggunakan kaedah read() untuk membaca aksara secara berterusan daripada konsol sehingga pengguna memasukkan "q".

// 使用 BufferedReader 在控制台读取字符

import java.io.*;

public class BRRead {
   public static void main(String args[]) throws IOException
   {
      char c;
      // 使用 System.in 创建 BufferedReader 
      BufferedReader br = new BufferedReader(new 
                         InputStreamReader(System.in));
      System.out.println("Enter characters, 'q' to quit.");
      // 读取字符
      do {
         c = (char) br.read();
         System.out.println(c);
      } while(c != 'q');
   }
}

Hasil penyusunan dan larian contoh di atas adalah seperti berikut:

Enter characters, 'q' to quit.
123abcq
1
2
3
a
b
c
q

Membaca rentetan daripada konsol

Membaca rentetan daripada input standard memerlukan menggunakan kaedah readLine of BufferedReader ().

Format amnya ialah:

String readLine( ) throws IOException

Atur cara berikut membaca dan memaparkan baris aksara sehingga anda memasukkan perkataan "end".

// 使用 BufferedReader 在控制台读取字符
import java.io.*;
public class BRReadLines {
   public static void main(String args[]) throws IOException
   {
      // 使用 System.in 创建 BufferedReader 
      BufferedReader br = new BufferedReader(new
                              InputStreamReader(System.in));
      String str;
      System.out.println("Enter lines of text.");
      System.out.println("Enter 'end' to quit.");
      do {
         str = br.readLine();
         System.out.println(str);
      } while(!str.equals("end"));
   }
}

Hasil kompilasi dan larian contoh di atas adalah seperti berikut:

Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end

Dalam versi selepas JDK 5, kami juga boleh menggunakan kelas Pengimbas Java untuk mendapatkan input konsol.

Output konsol

Seperti yang dinyatakan sebelum ini, output konsol dilengkapkan dengan print() dan println(). Kaedah ini ditakrifkan oleh kelas PrintStream, dan System.out ialah rujukan kepada objek kelas ini.

PrintStream mewarisi kelas OutputStream dan melaksanakan kaedah write(). Dengan cara ini, write() juga boleh digunakan untuk menulis operasi ke konsol.

PrintStream Bentuk paling mudah untuk mentakrifkan write() adalah seperti berikut:

void write(int byteval)

Kaedah ini menulis oktet bawah byteval ke strim.

Contoh

Contoh berikut menggunakan write() untuk mengeluarkan aksara "A" dan aksara baris baharu berikut ke skrin:

import java.io.*;

// 演示 System.out.write().
public class WriteDemo {
   public static void main(String args[]) {
      int b; 
      b = 'A';
      System.out.write(b);
      System.out.write('\n');
   }
}

Jalankan contoh di atas untuk mengeluarkan dalam tetingkap keluaran aksara "A"

A

Nota: Kaedah write() tidak selalunya digunakan kerana kaedah print() dan println() lebih mudah digunakan.


Baca dan tulis fail

Seperti yang dinyatakan sebelum ini, strim ditakrifkan sebagai jujukan data. Aliran input digunakan untuk membaca data daripada sumber, dan aliran keluaran digunakan untuk menulis data kepada sasaran.

Rajah berikut ialah rajah hierarki kelas yang menerangkan aliran input dan aliran output.

12-130Q122402I57.jpg

Dua aliran penting yang akan dibincangkan di bawah ialah FileInputStream dan FileOutputStream:


FileInputStream

Strim ini digunakan untuk membaca data daripada fail , objeknya boleh dibuat menggunakan kata kunci new.

Terdapat pelbagai kaedah pembinaan yang digunakan untuk mencipta objek.

Anda boleh menggunakan nama fail rentetan untuk mencipta objek aliran input untuk membaca fail:

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

Anda juga boleh menggunakan objek fail untuk mencipta objek aliran input untuk membaca fail. Mula-mula kita perlu menggunakan kaedah File() untuk mencipta objek fail:

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

Selepas mencipta objek InputStream, anda boleh menggunakan kaedah berikut untuk membaca strim atau melaksanakan operasi strim lain.

序号方法及描述
1public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
2protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
3public int read(int r)throws IOException{}
这个方法从InputStream对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。
4public int read(byte[] r) throws IOException{}
这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
5public int available() throws IOException{}
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。

Selain InputStream, terdapat beberapa aliran input lain Untuk butiran lanjut, sila rujuk pautan di bawah:

  • ByteArrayInputStream

  • DataInputStream


FileOutputStream

Kelas ini digunakan untuk mencipta fail dan menulis data pada fail.

Jika fail sasaran tidak wujud sebelum strim membuka fail untuk output, maka strim akan mencipta fail.

Terdapat dua pembina yang boleh digunakan untuk mencipta objek FileOutputStream.

Gunakan nama fail rentetan untuk mencipta objek strim output:

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

Anda juga boleh menggunakan objek fail untuk mencipta strim output untuk menulis fail. Mula-mula kita perlu menggunakan kaedah File() untuk mencipta objek fail:

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

Selepas mencipta objek OutputStream, anda boleh menggunakan kaedah berikut untuk menulis ke strim atau melaksanakan operasi strim lain.

序号方法及描述
1public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
2protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
3public void write(int w)throws IOException{}
这个方法把指定的字节写到输出流中。
4public void write(byte[] w)
把指定数组中w.length长度的字节写到OutputStream中。

Selain OutputStream, terdapat beberapa aliran keluaran lain Untuk butiran lanjut, sila rujuk pautan di bawah:

  • ByteArrayOutputStream

  • DataOutputStream

Contoh

Berikut ialah 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");
   }	
   }
}

Atur cara di atas mula-mula mencipta ujian fail. txt dan meletakkan yang diberi Nombor ditulis ke dalam fail dalam bentuk binari dan output ke konsol pada masa yang sama.

Oleh kerana kod di atas ditulis dalam binari, mungkin terdapat aksara yang bercelaru Anda boleh menggunakan contoh kod berikut untuk menyelesaikan masalah yang bercelaru:

//文件名 :fileStreamTest2.java
import java.io.*;

public class fileStreamTest2{
	public static void main(String[] args) throws IOException {
		
		File f = new File("a.txt");
		FileOutputStream fop = new FileOutputStream(f);
		// 构建FileOutputStream对象,文件不存在会自动新建
		
		OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
		// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
		
		writer.append("中文输入");
		// 写入到缓冲区
		
		writer.append("\r\n");
		//换行
		
		writer.append("English");
		// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
		
		writer.close();
		//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
		
		fop.close();
		// 关闭输出流,释放系统资源

		FileInputStream fip = new FileInputStream(f);
		// 构建FileInputStream对象
		
		InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
		// 构建InputStreamReader对象,编码与写入相同

		StringBuffer sb = new StringBuffer();
		while (reader.ready()) {
			sb.append((char) reader.read());
			// 转成char加到StringBuffer对象中
		}
		System.out.println(sb.toString());
		reader.close();
		// 关闭读取流
		
		fip.close();
		// 关闭输入流,释放系统资源

	}
}

Fail dan I/O<. 🎜>

Terdapat juga beberapa kelas tentang fail dan I/O yang juga perlu kami ketahui:

  • Kelas Fail (kelas)

  • Kelas Pembaca Fail (kelas )

  • Kelas Penulis Fail (kelas)


Direktori dalam Java

Buat direktori :

Terdapat dua kaedah dalam kelas Fail yang boleh digunakan untuk mencipta folder:

  • mkdir( )Kaedah mencipta folder dan mengembalikan benar jika berjaya, jika tidak Kembali palsu. Kegagalan menunjukkan bahawa laluan yang ditentukan oleh objek Fail sudah wujud, atau bahawa folder tidak boleh dibuat kerana keseluruhan laluan belum wujud. Kaedah

  • mkdirs() mencipta folder dan semua folder induknya.

Contoh berikut mencipta folder "/tmp/user/java/bin":

import java.io.File;

public class CreateDir {
   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      // 现在创建目录
      d.mkdirs();
  }
}

Kompil dan laksanakan kod di atas untuk mencipta direktori "/tmp/ pengguna/ java/bin".

Nota: Java secara automatik membezakan pemisah laluan fail mengikut konvensyen pada UNIX dan Windows. Jika anda menggunakan pemisah (/) dalam versi Windows Java, laluan masih akan dihuraikan dengan betul.


Baca direktori

Direktori sebenarnya ialah objek Fail, yang mengandungi fail dan folder lain.

Jika anda mencipta objek Fail dan ia adalah direktori, memanggil kaedah isDirectory() akan kembali benar.

Senarai fail dan folder yang terkandung di dalamnya boleh diekstrak dengan memanggil kaedah list() pada objek ini.

Contoh yang ditunjukkan di bawah menggambarkan cara menggunakan kaedah list() untuk menyemak kandungan yang terkandung dalam folder:

import java.io.File;

public class DirList {
   public static void main(String args[]) {
      String dirname = "/tmp";
      File f1 = new File(dirname);
      if (f1.isDirectory()) {
         System.out.println( "Directory of " + dirname);
         String s[] = f1.list();
         for (int i=0; i < s.length; i++) {
            File f = new File(dirname + "/" + s[i]);
            if (f.isDirectory()) {
               System.out.println(s[i] + " is a directory");
            } else {
               System.out.println(s[i] + " is a file");
            }
         }
      } else {
         System.out.println(dirname + " is not a directory");
    }
  }
}

Hasil penyusunan dan larian contoh di atas adalah seperti berikut:

rreeee