Sadurunge, kita kudu ngerti IO API (Input/Output Application Programming Interface) lan paket java.io , sing kelas utamane kanggo nggarap stream ing Jawa. Tombol ing kene yaiku konsep aliran .

Dina iki kita bakal miwiti nimbang NIO API (New Input/Output).

Bentenipun utama antarane loro pendekatan kanggo I / O iku IO API iku stream-oriented nalika NIO API buffer-oriented. Dadi konsep utama sing kudu dingerteni yaiku buffer lan saluran .

Apa buffer lan apa saluran?

Saluran minangka portal logis ing ngendi data mlebu lan metu, dene buffer minangka sumber utawa tujuan data sing dikirim . Sajrone output, data sing arep dikirim dilebokake menyang buffer, lan buffer ngirim data menyang saluran. Sajrone input, data saka saluran bakal dilebokake menyang buffer.

Ing tembung liya:

  • buffer mung minangka blok memori sing bisa nulis informasi lan saka ngendi kita bisa maca informasi ,
  • saluran minangka gateway sing nyedhiyakake akses menyang piranti I / O kayata file utawa soket .

Saluran meh padha karo stream ing paket java.io. Kabeh data sing menyang ngendi wae (utawa teka saka ngendi wae) kudu ngliwati obyek saluran. Umumé, kanggo nggunakake sistem NIO, sampeyan entuk saluran menyang entitas I / O lan buffer kanggo nyimpen data. Banjur sampeyan nggarap buffer, input utawa output data yen perlu.

Sampeyan bisa maju lan mundur ing buffer, IE "mlaku" buffer, kang soko sampeyan ora bisa nindakake ing lepen. Iki menehi luwih keluwesan nalika ngolah data. Ing perpustakaan standar, buffer diwakili dening kelas Buffer abstrak lan sawetara turunane:

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • FloatBuffer
  • DoubleBuffer
  • LongBuffer

Bentenane utama ing antarane subkelas yaiku jinis data sing disimpen - byte , ints , longs lan jinis data primitif liyane.

Sifat buffer

A buffer nduweni papat sifat utama. Iki minangka kapasitas, watesan, posisi, lan tandha.

Kapasitas minangka jumlah maksimum data / bita sing bisa disimpen ing buffer. Kapasitas buffer ora bisa diganti . Sawise buffer kebak, iku kudu dibusak sadurunge nulis liyane kanggo iku.

Ing mode nulis, watesan buffer padha karo kapasitas, nuduhake jumlah maksimum data sing bisa ditulis menyang buffer. Ing mode maca, watesan buffer nuduhake jumlah maksimum data sing bisa diwaca saka buffer.

Posisi nuduhake posisi saiki kursor ing buffer . Kaping pisanan, disetel dadi 0 nalika buffer digawe. Ing tembung liyane, iku indeks saka unsur sabanjuré bakal diwaca utawa ditulis.

Tandha digunakake kanggo nyimpen posisi kursor . Nalika kita ngapusi buffer, posisi kursor diganti terus-terusan, nanging kita bisa tansah bali menyang posisi sadurunge ditandhani.

Cara kanggo nggarap buffer

Saiki ayo goleki metode utama sing ngidini kita nggarap buffer (blok memori) kanggo maca lan nulis data menyang lan saka saluran.

  1. allocate(int capacity) - cara iki digunakake kanggo nyedhiakke buffer anyar karo kapasitas kasebut. Cara allocate () mbuwang IllegalArgumentException yen kapasitas liwati minangka integer negatif.

  2. kapasitas () ngasilake kapasitas buffer saiki .

  3. position() ngasilake posisi kursor saiki. Operasi maca lan nulis mindhah kursor menyang mburi buffer. Nilai bali tansah kurang saka utawa padha karo watesan.

  4. limit () ngasilake watesan buffer saiki.

  5. tandha () digunakake kanggo tandha (nyimpen) posisi kursor saiki.

  6. reset () ngasilake kursor menyang posisi sing wis ditandhani (disimpen).

  7. cetha () nyetel posisi kanggo nul lan nyetel watesan kanggo kapasitas. Cara iki ora mbusak data ing buffer. Iku mung reinitializes posisi, watesan, lan tandha.

  8. flip () ngalih buffer saka mode nulis kanggo mode maca. Iku uga nyetel watesan kanggo posisi saiki lan banjur nempatno posisi bali ing nul.

  9. diwaca () - Cara maca saluran digunakake kanggo nulis data saka saluran menyang buffer, nalika buffer sijine () cara digunakake kanggo nulis data menyang buffer.

  10. nulis () - Cara nulis saluran digunakake kanggo nulis data saka buffer kanggo saluran, nalika buffer njaluk () cara digunakake kanggo maca data saka buffer.

  11. mundur () mundur buffer. Cara iki digunakake nalika sampeyan kudu maca maneh buffer - nyetel posisi menyang nul lan ora ngganti watesan.

Lan saiki sawetara tembung babagan saluran.

Implementasi saluran sing paling penting ing Java NIO yaiku kelas ing ngisor iki:

  1. FileChannel - Saluran kanggo maca lan nulis data saka / menyang file.

  2. DatagramChannel - Kelas iki maca lan nulis data liwat jaringan liwat UDP (User Datagram Protocol).

  3. SocketChannel - Saluran kanggo maca lan nulis data liwat jaringan liwat TCP (Transmission Control Protocol).

  4. ServerSocketChannel - Saluran kanggo maca lan nulis data liwat sambungan TCP, kaya sing ditindakake server web. A SocketChannel digawe kanggo saben sambungan mlebu.

Laku

Wektu kanggo nulis saperangan baris kode. Pisanan, ayo maca file kasebut lan nampilake isine ing konsol, banjur tulis sawetara string menyang file kasebut.

Kode kasebut ngemot akeh komentar - muga-muga bisa mbantu sampeyan ngerti cara kerjane:


// Create a RandomAccessFile object, passing in the file path
// and a string that says the file will be opened for reading and writing
try (RandomAccessFile randomAccessFile = new RandomAccessFile("text.txt", "rw");
    // Get an instance of the FileChannel class
    FileChannel channel = randomAccessFile.getChannel();
) {
// Our file is small, so we'll read it in one go   
// Create a buffer of the required size based on the size of our channel
   ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
   // Read data will be put into a StringBuilder
   StringBuilder builder = new StringBuilder();
   // Write data from the channel to the buffer
   channel.read(byteBuffer);
   // Switch the buffer from write mode to read mode
   byteBuffer.flip();
   // In a loop, write data from the buffer to the StringBuilder
   while (byteBuffer.hasRemaining()) {
       builder.append((char) byteBuffer.get());
   }
   // Display the contents of the StringBuilder on the console
   System.out.println(builder);
 
   // Now let's continue our program and write data from a string to the file
   // Create a string with arbitrary text
   String someText = "Hello, Amigo!!!!!";
   // Create a new buffer for writing,
   // but let the channel remain the same, because we're going to the same file
   // In other words, we can use one channel for both reading and writing to a file
   // Create a buffer specifically for our string — convert the string into an array and get its length
   ByteBuffer byteBuffer2 = ByteBuffer.allocate(someText.getBytes().length);
   // Write our string to the buffer
   byteBuffer2.put(someText.getBytes());
   // Switch the buffer from write mode to read mode
   // so that the channel can read from the buffer and write our string to the file
   byteBuffer2.flip();
   // The channel reads the information from the buffer and writes it to our file
   channel.write(byteBuffer2);
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

Coba NIO API — sampeyan bakal seneng!