Java NIO - Panduan Cepat

Paket Java.nio diperkenalkan di java 1.4. Berbeda dengan java I / O di java NIO, buffer dan aliran data berorientasi saluran untuk operasi I / O diperkenalkan yang menghasilkan eksekusi lebih cepat dan performa yang lebih baik.

Selain itu, NIO API menawarkan pemilih yang memperkenalkan fungsionalitas mendengarkan beberapa saluran untuk kejadian IO secara asinkron atau non pemblokiran. Di NIO, aktivitas I / O yang paling memakan waktu termasuk mengisi dan menguras buffer ke sistem operasi yang meningkatkan kecepatan.

Abstraksi utama dari NIO API adalah sebagai berikut -

  • Buffer, yang merupakan wadah untuk data, charset, serta decoder dan encoder yang terkait, yang menerjemahkan antara byte dan karakter Unicode.

  • Berbagai jenis saluran, yang mewakili koneksi ke entitas yang mampu melakukan operasi I / O

  • Selektor dan tombol pilihan, yang bersama dengan saluran yang dapat dipilih menentukan fasilitas I / O multiplexing dan non-pemblokiran.

Bagian ini memandu Anda tentang cara mengunduh dan mengatur Java di komputer Anda. Harap ikuti langkah-langkah berikut untuk menyiapkan lingkungan.

Java SE tersedia secara gratis dari tautan Unduh Java . Jadi, Anda mengunduh versi berdasarkan sistem operasi Anda.

Ikuti petunjuk untuk mengunduh java dan menjalankan .exeuntuk menginstal Java di komputer Anda. Setelah Anda menginstal Java di komputer Anda, Anda perlu mengatur variabel lingkungan agar mengarah ke direktori instalasi yang benar -

Menyiapkan jalur untuk windows 2000 / XP

Dengan asumsi Anda telah menginstal Java di direktori c: \ Program Files \ java \ jdk -

  • Klik kanan pada 'My Computer' dan pilih 'Properties'.

  • Klik tombol 'Variabel lingkungan' di bawah tab 'Lanjutan'.

  • Sekarang ubah variabel 'Path' sehingga juga berisi path ke Java yang dapat dieksekusi. Contoh, jika jalur saat ini disetel ke 'C: \ WINDOWS \ SYSTEM32', ubah jalur Anda menjadi 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin'.

Menyiapkan jalur untuk windows 95/98 / ME

Dengan asumsi Anda telah menginstal Java di direktori c: \ Program Files \ java \ jdk -

  • Edit file 'C: \ autoexec.bat' dan tambahkan baris berikut di bagian akhir:
    'SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin'

Menyiapkan jalur untuk Linux, UNIX, Solaris, FreeBSD

Variabel lingkungan PATH harus disetel untuk menunjukkan tempat binari java telah dipasang. Lihat dokumentasi shell Anda jika Anda kesulitan melakukan ini.

Contoh, jika Anda menggunakan bash sebagai shell Anda, maka Anda akan menambahkan baris berikut di akhir '.bashrc: export PATH = / path / to / java: $ PATH'

Editor Java Populer

Untuk menulis program java Anda, Anda memerlukan editor teks. Bahkan ada IDE yang lebih canggih tersedia di pasaran. Tetapi untuk saat ini, Anda dapat mempertimbangkan salah satu dari yang berikut -

  • Notepad - Pada mesin Windows Anda dapat menggunakan editor teks sederhana seperti Notepad (Disarankan untuk tutorial ini), TextPad.

  • Netbeans - adalah IDE Java yang open source dan gratis yang dapat diunduh dari http://www.netbeans.org/index.html.

  • Eclipse - juga merupakan java IDE yang dikembangkan oleh komunitas open source eclipse dan dapat diunduh https://www.eclipse.org/.

Seperti yang kita ketahui bahwa java NIO diperkenalkan untuk kemajuan Java IO API konvensional.Peningkatan utama yang membuat NIO lebih efisien daripada IO adalah model aliran data saluran yang digunakan dalam NIO dan penggunaan sistem operasi untuk tugas-tugas IO konvensional.

Perbedaan antara Java NIO dan Java IO dapat dijelaskan sebagai berikut -

  • Seperti disebutkan dalam posting sebelumnya di buffer NIO dan aliran data berorientasi saluran untuk operasi I / O yang memberikan eksekusi lebih cepat dan kinerja yang lebih baik dibandingkan dengan IO. Juga NIO menggunakan sistem operasi untuk tugas-tugas I / O konvensional yang sekali lagi membuatnya lebih efisien.

  • Aspek lain dari perbedaan antara NIO dan IO adalah IO ini menggunakan aliran data jalur aliran yaitu satu byte lagi pada satu waktu dan bergantung pada mengubah objek data menjadi byte dan sebaliknya sementara NIO berurusan dengan blok data yang merupakan potongan byte.

  • Di java IO stream objek adalah unidirectional sedangkan di NIO channel adalah bidirectional artinya saluran dapat digunakan untuk membaca dan menulis data.

  • Aliran data streamline di IO tidak memungkinkan untuk bergerak maju dan mundur dalam data.Jika kasus perlu bergerak maju dan mundur dalam membaca data dari aliran perlu cache di buffer terlebih dahulu, sedangkan dalam kasus NIO kami menggunakan berorientasi buffer yang memungkinkan untuk mengakses data bolak-balik tanpa perlu cache.

  • NIO API juga mendukung multi threading sehingga data dapat dibaca dan ditulis secara asynchronous sedemikian rupa sehingga saat melakukan operasi IO, thread saat ini tidak diblokir. Ini sekali lagi membuatnya lebih efisien daripada Java IO API konvensional.

  • Konsep multi threading diperkenalkan dengan pengenalan Selectors di java NIO yang memungkinkan untuk mendengarkan beberapa saluran untuk acara IO dengan cara asynchronous atau non blocking.

  • Multi threading di NIO membuatnya Non blocking yang berarti bahwa utas diminta untuk membaca atau menulis hanya ketika data tersedia jika tidak utas dapat digunakan dalam tugas lain untuk sementara waktu, tetapi ini tidak mungkin dalam kasus java IO konvensional karena tidak ada multi threading didukung di dalamnya yang menjadikannya sebagai Pemblokiran.

  • NIO memungkinkan untuk mengelola beberapa saluran hanya dengan menggunakan satu utas, tetapi biayanya adalah penguraian data mungkin agak lebih rumit daripada ketika membaca data dari aliran pemblokiran dalam kasus java IO. Jadi jika koneksi yang lebih sedikit dengan bandwidth yang sangat tinggi diperlukan dengan mengirimkan banyak data pada satu waktu, daripada dalam hal ini Java IO API mungkin paling cocok.

Deskripsi

Seperti namanya channel digunakan sebagai alat pengaliran data dari satu ujung ke ujung lainnya. Di sini di java NIO channel berfungsi sama antara buffer dan entitas di ujung lainnya dengan kata lain channel digunakan untuk membaca data ke buffer dan juga menulis data dari buffer.

Berbeda dengan stream yang digunakan pada channel IO Java konvensional yang dua cara yaitu dapat membaca sekaligus menulis. Channel NIO Java mendukung aliran data asynchronous baik dalam mode blocking maupun non blocking.

Penerapan Channel

Saluran Java NIO diimplementasikan terutama di kelas-kelas berikut -

  • FileChannel- Untuk membaca data dari file kami menggunakan saluran file. Objek saluran file dapat dibuat hanya dengan memanggil metode getChannel () pada objek file karena kita tidak dapat membuat objek file secara langsung.

  • DatagramChannel - Saluran datagram dapat membaca dan menulis data melalui jaringan melalui UDP (User Datagram Protocol). Objek DataGramchannel dapat dibuat menggunakan metode pabrik.

  • SocketChannel- Saluran SocketChannel dapat membaca dan menulis data melalui jaringan melalui TCP (Transmission Control Protocol). Ia juga menggunakan metode pabrik untuk membuat objek baru.

  • ServerSocketChannel- ServerSocketChannel membaca dan menulis data melalui koneksi TCP, sama seperti server web. Untuk setiap koneksi masuk, SocketChannel dibuat.

Contoh

Contoh berikut membaca dari file teks dari C:/Test/temp.txt dan mencetak konten ke konsol.

temp.txt

Hello World!

ChannelDemo.java

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class ChannelDemo {
   public static void main(String args[]) throws IOException {
      RandomAccessFile file = new RandomAccessFile("C:/Test/temp.txt", "r");
      FileChannel fileChannel = file.getChannel();
      ByteBuffer byteBuffer = ByteBuffer.allocate(512);
      while (fileChannel.read(byteBuffer) > 0) {
         // flip the buffer to prepare for get operation
         byteBuffer.flip();
         while (byteBuffer.hasRemaining()) {
            System.out.print((char) byteBuffer.get());
         }
      }
      file.close();
   }
}

Keluaran

Hello World!

Deskripsi

Seperti yang telah disebutkan, implementasi FileChannel dari saluran Java NIO diperkenalkan untuk mengakses properti meta data dari file termasuk pembuatan, modifikasi, ukuran, dll. Bersamaan dengan Saluran File ini adalah multi-utas yang sekali lagi membuat Java NIO lebih efisien daripada Java IO.

Secara umum kita dapat mengatakan bahwa FileChannel adalah saluran yang terhubung ke file di mana Anda dapat membaca data dari file, dan menulis data ke file. Karakteristik penting lainnya dari FileChannel adalah tidak dapat diatur ke mode non-pemblokiran dan selalu berjalan dalam mode pemblokiran.

Kita tidak bisa mendapatkan objek saluran file secara langsung, Objek saluran file diperoleh dengan -

  • getChannel() - metode pada FileInputStream, FileOutputStream atau RandomAccessFile.

  • open() - Metode saluran File yang secara default membuka saluran.

Jenis objek saluran File bergantung pada jenis kelas yang dipanggil dari pembuatan objek, yaitu jika objek dibuat dengan memanggil metode getchannel dari FileInputStream, maka saluran File dibuka untuk membaca dan akan menampilkan NonWritableChannelException jika mencoba menulis ke sana.

Contoh

Contoh berikut menunjukkan cara membaca dan menulis data dari Java NIO FileChannel.

Contoh berikut membaca dari file teks dari C:/Test/temp.txt dan mencetak konten ke konsol.

temp.txt

Hello World!

FileChannelDemo.java

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.Set;

public class FileChannelDemo {
   public static void main(String args[]) throws IOException {
      //append the content to existing file 
      writeFileChannel(ByteBuffer.wrap("Welcome to TutorialsPoint".getBytes()));
      //read the file
      readFileChannel();
   }
   public static void readFileChannel() throws IOException {
      RandomAccessFile randomAccessFile = new RandomAccessFile("C:/Test/temp.txt",
      "rw");
      FileChannel fileChannel = randomAccessFile.getChannel();
      ByteBuffer byteBuffer = ByteBuffer.allocate(512);
      Charset charset = Charset.forName("US-ASCII");
      while (fileChannel.read(byteBuffer) > 0) {
         byteBuffer.rewind();
         System.out.print(charset.decode(byteBuffer));
         byteBuffer.flip();
      }
      fileChannel.close();
      randomAccessFile.close();
   }
   public static void writeFileChannel(ByteBuffer byteBuffer)throws IOException {
      Set<StandardOpenOption> options = new HashSet<>();
      options.add(StandardOpenOption.CREATE);
      options.add(StandardOpenOption.APPEND);
      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path, options);
      fileChannel.write(byteBuffer);
      fileChannel.close();
   }
}

Keluaran

Hello World! Welcome to TutorialsPoint

Java NIO Datagram digunakan sebagai channel yang dapat mengirim dan menerima paket UDP melalui koneksi tanpa protokol. Secara default datagram channel adalah blocking sementara dapat digunakan dalam mode non-blocking. Untuk membuatnya menjadi non-blocking kita dapat menggunakan configureBlocking ( false). Saluran DataGram dapat dibuka dengan memanggil salah satu metode statisnya yang bernama open() yang juga dapat mengambil alamat IP sebagai parameter sehingga dapat digunakan untuk multi casting.

Saluran datagram seperti FileChannel tidak terhubung secara default untuk membuatnya terhubung kita harus secara eksplisit memanggil metode connect (). Namun saluran datagram tidak perlu terhubung agar metode kirim dan terima dapat digunakan saat harus terhubung untuk menggunakan metode baca dan tulis, karena metode tersebut tidak menerima atau mengembalikan alamat soket.

Kita dapat memeriksa status koneksi saluran datagram dengan memanggil its isConnected() metode. Setelah terhubung, saluran datagram tetap terhubung sampai terputus atau ditutup. saluran datagram aman untuk benang dan mendukung multi-threading dan konkurensi secara bersamaan.

Metode penting saluran datagram

  • bind(SocketAddress local) - Metode ini digunakan untuk mengikat soket saluran datagram ke alamat lokal yang disediakan sebagai parameter untuk metode ini.

  • connect(SocketAddress remote) - Metode ini digunakan untuk menghubungkan soket ke alamat jarak jauh.

  • disconnect() - Metode ini digunakan untuk memutuskan soket ke alamat jarak jauh.

  • getRemoteAddress() - Metode ini mengembalikan alamat lokasi jauh di mana soket saluran terhubung.

  • isConnected() - Seperti yang telah disebutkan, metode ini mengembalikan status koneksi saluran datagram, yaitu apakah itu terhubung atau tidak.

  • open() and open(ProtocolFamily family) - Metode terbuka digunakan untuk membuka saluran datagram untuk satu alamat sedangkan metode terbuka parametrized saluran terbuka untuk beberapa alamat direpresentasikan sebagai keluarga protokol.

  • read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran datagram.

  • receive(ByteBuffer dst) - Metode ini digunakan untuk menerima datagram melalui saluran ini.

  • send(ByteBuffer src, SocketAddress target) - Metode ini digunakan untuk mengirim datagram melalui saluran ini.

Contoh

Contoh berikut menunjukkan cara mengirim data dari Java NIO DataGramChannel.

Server: DatagramChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelServer {
   public static void main(String[] args) throws IOException {
      DatagramChannel server = DatagramChannel.open();
      InetSocketAddress iAdd = new InetSocketAddress("localhost", 8989);
      server.bind(iAdd);
      System.out.println("Server Started: " + iAdd);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      //receive buffer from client.
      SocketAddress remoteAdd = server.receive(buffer);
      //change mode of buffer
      buffer.flip();
      int limits = buffer.limit();
      byte bytes[] = new byte[limits];
      buffer.get(bytes, 0, limits);
      String msg = new String(bytes);
      System.out.println("Client at " + remoteAdd + "  sent: " + msg);
      server.send(buffer,remoteAdd);
      server.close();
   }
}

Keluaran

Server Started: localhost/127.0.0.1:8989

Klien: DatagramChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelClient {
   public static void main(String[] args) throws IOException {
      DatagramChannel client = null;
      client = DatagramChannel.open();

      client.bind(null);

      String msg = "Hello World!";
      ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
      InetSocketAddress serverAddress = new InetSocketAddress("localhost",
        8989);

      client.send(buffer, serverAddress);
      buffer.clear();
      client.receive(buffer);
      buffer.flip();
    
      client.close();
   }
}

Keluaran

Menjalankan klien akan mencetak keluaran berikut di server.

Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857  sent: Hello World!

Saluran soket Java NIO adalah saluran jenis yang dapat dipilih yang berarti dapat dimultipleks menggunakan selektor, digunakan untuk soket penghubung aliran data berorientasi aliran. Saluran soket dapat dibuat dengan memanggil statisnya open() metode, menyediakan soket yang sudah ada sebelumnya belum ada Saluran soket dibuat dengan memanggil metode terbuka tetapi belum terhubung Untuk menghubungkan saluran soket connect() Salah satu poin yang akan disebutkan di sini adalah jika saluran tidak terhubung dan operasi I / O apa pun dicoba untuk dicoba, maka NotYetConnectedException dilemparkan oleh saluran ini. Jadi, seseorang harus memastikan bahwa saluran terhubung sebelum melakukan IO apa pun operasi.Setelah saluran terhubung, itu tetap terhubung sampai ditutup. Status saluran soket dapat ditentukan dengan memanggilnya isConnected metode.

Sambungan saluran soket dapat diselesaikan dengan menjalankannya finishConnect() Metode. Apakah operasi koneksi sedang berlangsung atau tidak, dapat ditentukan dengan memanggil metode isConnectionPending. Secara default saluran soket mendukung koneksi non-pemblokiran. Juga mendukung pematian asinkron, yang mirip dengan operasi penutupan asinkron yang ditentukan di kelas Saluran.

Saluran soket aman untuk digunakan oleh beberapa utas bersamaan. Mereka mendukung pembacaan dan penulisan secara bersamaan, meskipun paling banyak satu utas mungkin membaca dan paling banyak satu utas dapat menulis pada waktu tertentu. Metode connect dan finishConnect saling disinkronkan satu sama lain, dan upaya untuk memulai operasi baca atau tulis saat pemanggilan salah satu metode ini sedang berlangsung akan memblokir hingga pemanggilan tersebut selesai.

Metode penting saluran Socket

  • bind(SocketAddress local) - Metode ini digunakan untuk mengikat saluran soket ke alamat lokal yang disediakan sebagai parameter untuk metode ini.

  • connect(SocketAddress remote) - Metode ini digunakan untuk menghubungkan soket ke alamat jarak jauh.

  • finishConnect() - Metode ini digunakan untuk menyelesaikan proses menghubungkan saluran soket.

  • getRemoteAddress() - Metode ini mengembalikan alamat lokasi jauh di mana soket saluran terhubung.

  • isConnected() - Seperti yang telah disebutkan, metode ini mengembalikan status koneksi saluran soket, yaitu apakah itu terhubung atau tidak.

  • open() and open((SocketAddress remote) - Metode terbuka digunakan untuk membuka saluran soket tanpa alamat yang ditentukan sementara metode terbuka berparameter saluran terbuka untuk alamat jarak jauh yang ditentukan dan juga menghubungkan ke itu. Metode kenyamanan ini bekerja seolah-olah dengan memanggil metode open (), memanggil metode menghubungkan pada hasil saluran soket, melewati jarak jauh, dan kemudian mengembalikan saluran itu.

  • read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran soket.

  • isConnectionPending() - Metode ini memberi tahu apakah operasi koneksi sedang berlangsung di saluran ini atau tidak.

Contoh

Contoh berikut menunjukkan cara mengirim data dari Java NIO SocketChannel.

C: /Test/temp.txt

Hello World!

Klien: SocketChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;

public class SocketChannelClient {
   public static void main(String[] args) throws IOException {
      ServerSocketChannel serverSocket = null;
      SocketChannel client = null;
      serverSocket = ServerSocketChannel.open();
      serverSocket.socket().bind(new InetSocketAddress(9000));
      client = serverSocket.accept();
      System.out.println("Connection Set:  " + client.getRemoteAddress());
      Path path = Paths.get("C:/Test/temp1.txt");
      FileChannel fileChannel = FileChannel.open(path, 
         EnumSet.of(StandardOpenOption.CREATE, 
            StandardOpenOption.TRUNCATE_EXISTING,
            StandardOpenOption.WRITE)
         );      
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(client.read(buffer) > 0) {
         buffer.flip();
         fileChannel.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Received");
      client.close();
   }
}

Keluaran

Menjalankan klien tidak akan mencetak apa pun sampai server dimulai.

Server: SocketChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;

public class SocketChannelServer {
   public static void main(String[] args) throws IOException {
      SocketChannel server = SocketChannel.open();
      SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
      server.connect(socketAddr);

      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(fileChannel.read(buffer) > 0) {
         buffer.flip();
         server.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Sent");
      server.close();
   }
}

Keluaran

Menjalankan server akan mencetak yang berikut ini.

Connection Set:  /127.0.0.1:49558
File Received

Saluran soket server Java NIO juga merupakan saluran jenis yang dapat dipilih yang digunakan untuk soket penghubung aliran data berorientasi aliran. Saluran Soket Server dapat dibuat dengan memanggil statis open() metode, menyediakan soket yang sudah ada sebelumnya belum ada.Server Socket channel dibuat dengan memanggil metode terbuka tetapi belum terikat Untuk mengikat saluran soket bind() metode yang akan dipanggil.

Satu hal yang perlu disebutkan di sini adalah jika saluran tidak terikat dan operasi I / O apa pun dicoba untuk dicoba, maka NotYetBoundException dilempar oleh saluran ini. Jadi, seseorang harus memastikan bahwa saluran dibatasi sebelum melakukan operasi IO.

Koneksi masuk untuk saluran soket server mendengarkan dengan memanggil metode ServerSocketChannel.accept (). Ketika metode accept () kembali, ia mengembalikan SocketChannel dengan koneksi masuk. Dengan demikian, metode accept () memblokir hingga koneksi masuk tiba. Jika channel dalam mode non-blocking maka metode accept akan segera mengembalikan null jika tidak ada koneksi yang tertunda. Jika tidak, itu akan memblokir tanpa batas hingga koneksi baru tersedia atau kesalahan I / O terjadi.

Soket saluran baru awalnya tidak terikat; itu harus terikat ke alamat tertentu melalui salah satu metode mengikat soketnya sebelum koneksi dapat diterima. Juga saluran baru dibuat dengan memanggil metode openServerSocketChannel dari objek SelectorProvider default di seluruh sistem.

Seperti saluran soket server saluran soket dapat membaca data menggunakan read()metode. Pertama buffer dialokasikan. Data yang dibaca dari ServerSocketChannel disimpan ke dalam buffer. Kedua kita memanggil metode ServerSocketChannel.read () dan membaca data dari ServerSocketChannel ke dalam buffer. Nilai integer dari metode read () mengembalikan berapa banyak byte yang ditulis ke dalam buffer

Demikian pula data dapat ditulis ke saluran soket server menggunakan write() metode menggunakan buffer sebagai parameter. Biasanya menggunakan metode tulis dalam loop sementara karena perlu mengulangi metode write () sampai Buffer tidak memiliki byte lagi yang tersedia untuk ditulis.

Metode penting saluran Socket

  • bind(SocketAddress local) - Metode ini digunakan untuk mengikat saluran soket ke alamat lokal yang disediakan sebagai parameter untuk metode ini.

  • accept() - Metode ini digunakan untuk menerima koneksi yang dibuat ke soket saluran ini.

  • connect(SocketAddress remote) - Metode ini digunakan untuk menghubungkan soket ke alamat jarak jauh.

  • finishConnect() - Metode ini digunakan untuk menyelesaikan proses menghubungkan saluran soket.

  • getRemoteAddress() - Metode ini mengembalikan alamat lokasi jauh di mana soket saluran terhubung.

  • isConnected() - Seperti yang telah disebutkan, metode ini mengembalikan status koneksi saluran soket, yaitu apakah itu terhubung atau tidak.

  • open() - Metode terbuka digunakan untuk membuka saluran soket tanpa alamat yang ditentukan. Metode praktis ini bekerja seolah-olah dengan memanggil metode open (), menjalankan metode koneksi pada saluran soket server yang dihasilkan, meneruskannya dari jarak jauh, dan kemudian mengembalikan saluran itu.

  • read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran soket.

  • setOption(SocketOption<T> name, T value) - Metode ini menetapkan nilai opsi soket.

  • socket() - Metode ini mengambil soket server yang terkait dengan saluran ini.

  • validOps() - Metode ini mengembalikan satu set operasi yang mengidentifikasi operasi yang didukung saluran ini. Saluran soket server hanya mendukung penerimaan koneksi baru, jadi metode ini mengembalikan SelectionKey.OP_ACCEPT.

Contoh

Contoh berikut menunjukkan cara mengirim data dari Java NIO ServerSocketChannel.

C: /Test/temp.txt

Hello World!

Klien: SocketChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;

public class SocketChannelClient {
   public static void main(String[] args) throws IOException {
      ServerSocketChannel serverSocket = null;
      SocketChannel client = null;
      serverSocket = ServerSocketChannel.open();
      serverSocket.socket().bind(new InetSocketAddress(9000));
      client = serverSocket.accept();
      System.out.println("Connection Set:  " + client.getRemoteAddress());
      Path path = Paths.get("C:/Test/temp1.txt");
      FileChannel fileChannel = FileChannel.open(path, 
         EnumSet.of(StandardOpenOption.CREATE, 
            StandardOpenOption.TRUNCATE_EXISTING,
            StandardOpenOption.WRITE)
         );      
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(client.read(buffer) > 0) {
         buffer.flip();
         fileChannel.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Received");
      client.close();
   }
}

Keluaran

Menjalankan klien tidak akan mencetak apa pun sampai server dimulai.

Server: SocketChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;

public class SocketChannelServer {
   public static void main(String[] args) throws IOException {
      SocketChannel server = SocketChannel.open();
      SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
      server.connect(socketAddr);
      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(fileChannel.read(buffer) > 0) {
         buffer.flip();
         server.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Sent");
      server.close();
   }
}

Keluaran

Menjalankan server akan mencetak yang berikut ini.

Connection Set:  /127.0.0.1:49558
File Received

Seperti yang kita ketahui bahwa Java NIO adalah API yang lebih dioptimalkan untuk operasi IO data dibandingkan dengan IO API konvensional Java. Satu lagi dukungan tambahan yang disediakan Java NIO adalah membaca / menulis data dari / ke beberapa buffer ke saluran. dan dukungan tulis disebut sebagai Scatter and Gather di mana data tersebar ke beberapa buffer dari satu saluran jika data dibaca sementara data dikumpulkan dari beberapa buffer ke saluran tunggal jika data tulis.

Untuk mencapai beberapa baca dan tulis dari saluran ini, ada API ScatteringByteChannel dan GatheringByteChannel yang disediakan Java NIO untuk membaca dan menulis data seperti yang diilustrasikan pada contoh di bawah ini.

ScatteringByteChannel

Read from multiple channels - Dalam hal ini kami membuat untuk membaca data dari satu saluran menjadi beberapa buffer. Untuk beberapa buffer ini dialokasikan dan ditambahkan ke array tipe buffer. Kemudian array ini diteruskan sebagai parameter ke metode ScatteringByteChannel read () yang kemudian menulis data dari saluran dalam urutan buffer terjadi dalam array. Setelah buffer penuh, saluran bergerak untuk mengisi buffer berikutnya.

Contoh berikut menunjukkan bagaimana penyebaran data dilakukan di Java NIO

C: /Test/temp.txt

Hello World!
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ScatteringByteChannel;

public class ScatterExample {	
   private static String FILENAME = "C:/Test/temp.txt";
   public static void main(String[] args) {
      ByteBuffer bLen1 = ByteBuffer.allocate(1024);
      ByteBuffer bLen2 = ByteBuffer.allocate(1024);
      FileInputStream in;
      try {
         in = new FileInputStream(FILENAME);
         ScatteringByteChannel scatter = in.getChannel();
         scatter.read(new ByteBuffer[] {bLen1, bLen2});
         bLen1.position(0);
         bLen2.position(0);
         int len1 = bLen1.asIntBuffer().get();
         int len2 = bLen2.asIntBuffer().get();
         System.out.println("Scattering : Len1 = " + len1);
         System.out.println("Scattering : Len2 = " + len2);
      } 
      catch (FileNotFoundException exObj) {
         exObj.printStackTrace();
      }
      catch (IOException ioObj) {
         ioObj.printStackTrace();
      }
   }
}

Keluaran

Scattering : Len1 = 1214606444
Scattering : Len2 = 0

Akhirnya dapat disimpulkan bahwa pendekatan pencar / kumpulkan di Java NIO diperkenalkan sebagai yang dioptimalkan dan multitask ketika digunakan dengan benar. Ini memungkinkan Anda untuk mendelegasikan ke sistem operasi pekerjaan kasar memisahkan data yang Anda baca menjadi beberapa keranjang, atau perakitan potongan data yang berbeda menjadi satu kesatuan. Tidak diragukan lagi ini menghemat waktu dan menggunakan sistem operasi secara lebih efisien dengan menghindari salinan buffer, dan mengurangi jumlah kode yang perlu ditulis dan di-debug.

Seperti yang kita ketahui bahwa Java NIO adalah API yang lebih dioptimalkan untuk operasi IO data dibandingkan dengan IO API konvensional Java. Satu lagi dukungan tambahan yang disediakan Java NIO adalah membaca / menulis data dari / ke beberapa buffer ke saluran. dan dukungan tulis disebut sebagai Scatter and Gather di mana data tersebar ke beberapa buffer dari satu saluran jika data dibaca sementara data dikumpulkan dari beberapa buffer ke saluran tunggal jika data tulis.

Untuk mencapai beberapa baca dan tulis dari saluran ini, ada API ScatteringByteChannel dan GatheringByteChannel yang disediakan Java NIO untuk membaca dan menulis data seperti yang diilustrasikan pada contoh di bawah ini.

GatheringByteChannel

write to multiple channels - Dalam hal ini kami membuat untuk menulis data dari beberapa buffer ke dalam satu saluran. Untuk ini lagi beberapa buffer dialokasikan dan ditambahkan ke array tipe buffer. Kemudian array ini diteruskan sebagai parameter ke metode GatheringByteChannel write () yang kemudian menulis data dari beberapa buffer dalam urutan buffer terjadi dalam array. Satu hal yang perlu diingat di sini adalah hanya data antara posisi dan batas buffer yang ditulis.

Contoh berikut menunjukkan bagaimana pengumpulan data dilakukan di Java NIO

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.GatheringByteChannel;

public class GatherExample {
   private static String FILENAME = "C:/Test/temp.txt";
   public static void main(String[] args) {
      String stream1 = "Gather data stream first";
      String stream2 = "Gather data stream second";
      ByteBuffer bLen1 = ByteBuffer.allocate(1024);
      ByteBuffer bLen2 = ByteBuffer.allocate(1024);
      // Next two buffer hold the data we want to write
      ByteBuffer bstream1 = ByteBuffer.wrap(stream1.getBytes());
      ByteBuffer bstream2 = ByteBuffer.wrap(stream2.getBytes());
      int len1 = stream1.length();
      int len2 = stream2.length();
      // Writing length(data) to the Buffer
      bLen1.asIntBuffer().put(len1);
      bLen2.asIntBuffer().put(len2);
      System.out.println("Gathering : Len1 = " + len1);
      System.out.println("Gathering : Len2 = " + len2);
      // Write data to the file
      try { 
         FileOutputStream out = new FileOutputStream(FILENAME);
         GatheringByteChannel gather = out.getChannel();						
         gather.write(new ByteBuffer[] {bLen1, bLen2, bstream1, bstream2});
         out.close();
         gather.close();
      }
      catch (FileNotFoundException exObj) {
         exObj.printStackTrace();
      }
      catch(IOException ioObj) {
         ioObj.printStackTrace();
      }
   }
}

Keluaran

Gathering : Len1 = 24
Gathering : Len2 = 25

Akhirnya dapat disimpulkan bahwa pendekatan pencar / kumpulkan di Java NIO diperkenalkan sebagai yang dioptimalkan dan multitask ketika digunakan dengan benar. Ini memungkinkan Anda untuk mendelegasikan ke sistem operasi pekerjaan kasar memisahkan data yang Anda baca menjadi beberapa keranjang, atau perakitan potongan data yang berbeda menjadi satu kesatuan. Tidak diragukan lagi ini menghemat waktu dan menggunakan sistem operasi secara lebih efisien dengan menghindari salinan buffer, dan mengurangi jumlah kode yang perlu ditulis dan di-debug.

Buffer di Java NIO dapat diperlakukan sebagai objek sederhana yang bertindak sebagai wadah potongan data berukuran tetap yang dapat digunakan untuk menulis data ke saluran atau membaca data dari saluran sehingga buffer bertindak sebagai titik akhir ke saluran.

Ini menyediakan serangkaian metode yang membuat lebih nyaman untuk menangani blok memori untuk membaca dan menulis data ke dan dari saluran.

Buffer membuat paket NIO lebih efisien dan lebih cepat dibandingkan dengan IO klasik seperti dalam kasus data IO ditangani dalam bentuk aliran yang tidak mendukung aliran data yang tidak sinkron dan bersamaan. Juga IO tidak mengizinkan eksekusi data dalam potongan atau kelompok byte .

Parameter utama yang mendefinisikan buffer Java NIO dapat didefinisikan sebagai -

  • Capacity - Jumlah Maksimum data / byte yang dapat disimpan dalam Buffer Kapasitas buffer tidak dapat diubah. Setelah buffer penuh, buffer tersebut harus dibersihkan sebelum menuliskannya.

  • Limit - Limit memiliki arti sesuai dengan mode Buffer yaitu pada mode tulis Buffer Limit adalah sama dengan kapasitas yang berarti data maksimum yang dapat ditulisi dalam buffer, sedangkan pada mode read buffer Limit berarti batasan berapa banyak data yang dapat ditampung. baca dari Buffer.

  • Position - Menunjuk ke lokasi kursor saat ini di buffer. Awalnya ditetapkan sebagai 0 pada saat pembuatan buffer atau dengan kata lain indeks elemen berikutnya yang akan dibaca atau ditulis yang diperbarui secara otomatis oleh get () dan put ( ) metode.

  • Mark - Tandai penanda posisi dalam buffer. Ketika metode mark () dipanggil, posisi saat ini direkam dan ketika reset () disebut posisi yang ditandai dikembalikan.

Jenis Penyangga

Buffer Java NIO dapat diklasifikasikan dalam varian berikut berdasarkan tipe data yang ditangani buffer -

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

Metode penting Buffer

Seperti yang telah disebutkan sebelumnya, Buffer bertindak sebagai objek memori yang menyediakan sekumpulan metode yang membuat lebih nyaman untuk menangani blok memori. Berikut adalah metode penting Buffer -

  • allocate(int capacity) - Metode ini digunakan untuk mengalokasikan buffer baru dengan kapasitas sebagai parameter. Metode alokasi akan melempar IllegalArgumentException jika kapasitas yang diteruskan adalah bilangan bulat negatif.

  • read() and put() - Metode read channel digunakan untuk menulis data dari channel ke buffer sedangkan put adalah metode buffer yang digunakan untuk menulis data dalam buffer.

  • flip() - Metode flip mengubah mode Buffer dari menulis ke mode membaca, juga mengatur posisi kembali ke 0, dan menetapkan batas ke posisi saat penulisan.

  • write() and get() - metode tulis saluran digunakan untuk menulis data dari buffer ke saluran sedangkan get adalah metode buffer yang digunakan untuk membaca data dari buffer.

  • rewind() - Metode rewind digunakan ketika membaca ulang diperlukan karena ini mengatur posisi kembali ke nol dan tidak mengubah nilai batas.

  • clear() and compact() - Jelas dan kompak kedua metode digunakan untuk membuat buffer dari mode baca ke tulis.clear() metode membuat posisi ke nol dan batas sama dengan kapasitas, dalam metode ini data dalam buffer tidak dihapus hanya penanda yang diinisialisasi ulang.

    Di sisi lain compact() Metode digunakan ketika masih ada beberapa data yang belum dibaca dan masih kita menggunakan mode tulis buffer dalam hal ini metode kompak menyalin semua data yang belum dibaca ke awal buffer dan mengatur posisi ke kanan setelah elemen terakhir yang belum dibaca. diatur ke kapasitas.

  • mark() and reset() - Seperti nama yang disarankan, metode tanda digunakan untuk menandai posisi tertentu dalam buffer sementara reset membuat posisi kembali ke posisi yang ditandai.

Contoh

Contoh berikut menunjukkan implementasi metode yang ditentukan di atas.

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class BufferDemo {
   public static void main (String [] args) {
      //allocate a character type buffer.
      CharBuffer buffer = CharBuffer.allocate(10);
      String text = "bufferDemo";
      System.out.println("Input text: " + text);
      for (int i = 0; i < text.length(); i++) {
         char c = text.charAt(i);
         //put character in buffer.
		 buffer.put(c);
      }
      int buffPos = buffer.position();
      System.out.println("Position after data is written into buffer: " + buffPos);
      buffer.flip();
      System.out.println("Reading buffer contents:");
      while (buffer.hasRemaining()) {
         System.out.println(buffer.get());                   
      }
      //set the position of buffer to 5.
      buffer.position(5);
      //sets this buffer's mark at its position
      buffer.mark();
      //try to change the position
      buffer.position(6);
      //calling reset method to restore to the position we marked.
      //reset() raise InvalidMarkException if either the new position is less
      //than the position marked or merk has not been setted.
      buffer.reset();
      System.out.println("Restored buffer position : " + buffer.position());
   }
}

Keluaran

Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5

Seperti yang kita ketahui bahwa Java NIO mendukung banyak transaksi dari dan ke saluran dan buffer. Jadi untuk memeriksa satu atau lebih Saluran NIO, dan menentukan saluran mana yang siap untuk transaksi data yaitu membaca atau menulis Java NIO menyediakan Selector.

Dengan Selector kita dapat membuat utas untuk mengetahui saluran mana yang siap untuk menulis dan membaca data dan dapat menangani saluran tersebut.

Kita bisa mendapatkan contoh pemilih dengan memanggil metode statisnya open()Setelah selektor terbuka, kita harus mendaftarkan saluran mode non-pemblokiran dengannya yang mengembalikan instance dari SelectionKey.

SelectionKey pada dasarnya adalah kumpulan operasi yang dapat dilakukan dengan saluran atau kita dapat mengatakan bahwa kita dapat mengetahui status saluran dengan bantuan tombol pilihan.

Operasi utama atau status saluran yang diwakili oleh tombol pilihan adalah -

  • SelectionKey.OP_CONNECT - Channel yang siap terkoneksi ke server.

  • SelectionKey.OP_ACCEPT - Saluran yang siap menerima koneksi masuk.

  • SelectionKey.OP_READ - Channel yang siap membaca data.

  • SelectionKey.OP_WRITE - Channel yang siap untuk menulis data.

Kunci pilihan yang diperoleh setelah pendaftaran memiliki beberapa metode penting seperti yang disebutkan di bawah -

  • attach() - Metode ini digunakan untuk melampirkan objek dengan kunci. Tujuan utama melampirkan objek ke saluran adalah untuk mengenali saluran yang sama.

  • attachment() - Metode ini digunakan untuk mempertahankan objek yang terpasang dari saluran.

  • channel() - Metode ini digunakan untuk mendapatkan saluran di mana kunci tertentu dibuat.

  • selector() - Metode ini digunakan untuk mendapatkan selektor tempat kunci tertentu dibuat.

  • isValid() - Metode ini mengembalikan apakah kuncinya valid atau tidak.

  • isReadable() - Metode ini menyatakan bahwa saluran kunci cuaca siap untuk dibaca atau tidak.

  • isWritable() - Metode ini menyatakan bahwa saluran kunci cuaca siap untuk ditulis atau tidak.

  • isAcceptable() - Metode ini menyatakan bahwa saluran kunci cuaca siap untuk menerima koneksi masuk atau tidak.

  • isConnectable() - Metode ini menguji apakah saluran kunci ini telah selesai, atau gagal menyelesaikan, operasi koneksi soketnya.

  • isAcceptable() - Metode ini menguji apakah saluran kunci ini siap menerima koneksi soket baru.

  • interestOps() - Metode ini mengambil set minat kunci ini.

  • readyOps() - Metode ini mengambil set siap yang merupakan set operasi yang siap untuk saluran.

Kita dapat memilih saluran dari selektor dengan memanggil metode statisnya select().Metode pilih pemilih kelebihan beban karena -

  • select() - Metode ini memblokir utas saat ini hingga setidaknya satu saluran siap untuk acara yang didaftarkan.

  • select(long timeout) - Metode ini melakukan hal yang sama seperti select () kecuali itu memblokir utas selama maksimum milidetik batas waktu (parameter).

  • selectNow() - Metode ini tidak memblokir sama sekali. Metode ini segera kembali dengan saluran apa pun yang siap.

Juga untuk meninggalkan utas yang diblokir yang memanggil metode pilih,wakeup() metode bisa dipanggil dari contoh selektor setelah itu utas menunggu di dalam select () kemudian akan segera kembali.

Terakhir kita bisa menutup selektor dengan memanggil close() metode yang juga membatalkan semua instance SelectionKey yang terdaftar dengan Selector ini bersama dengan menutup selector.

Contoh

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class SelectorDemo {
   public static void main(String[] args) throws IOException {
      String demo_text = "This is a demo String";	
      Selector selector = Selector.open();
      ServerSocketChannel serverSocket = ServerSocketChannel.open();
      serverSocket.bind(new InetSocketAddress("localhost", 5454));
      serverSocket.configureBlocking(false);
      serverSocket.register(selector, SelectionKey.OP_ACCEPT);
      ByteBuffer buffer = ByteBuffer.allocate(256);
      while (true) {
         selector.select();
         Set<SelectionKey> selectedKeys = selector.selectedKeys();
         Iterator<SelectionKey> iter = selectedKeys.iterator();
         while (iter.hasNext()) {
            SelectionKey key = iter.next();
            int interestOps = key.interestOps();
            System.out.println(interestOps);
            if (key.isAcceptable()) {
               SocketChannel client = serverSocket.accept();
               client.configureBlocking(false);
               client.register(selector, SelectionKey.OP_READ);
            }
            if (key.isReadable()) {
               SocketChannel client = (SocketChannel) key.channel();
               client.read(buffer);
               if (new String(buffer.array()).trim().equals(demo_text)) {
                  client.close();
                  System.out.println("Not accepting client messages anymore");
               }
               buffer.flip();
               client.write(buffer);
               buffer.clear();
            }
            iter.remove();
         }
      }
   }
}

Dalam Java, pipa NIO adalah komponen yang digunakan untuk menulis dan membaca data antara dua utas, pipa terutama terdiri dari dua saluran yang bertanggung jawab untuk penyebaran data.

Di antara dua saluran penyusun satu disebut sebagai saluran Sink yang terutama untuk menulis data dan yang lainnya adalah saluran Sumber yang tujuan utamanya adalah untuk membaca data dari saluran Sink.

Sinkronisasi data dijaga agar selama penulisan dan pembacaan data karena harus dipastikan bahwa data harus dibaca dalam urutan yang sama dengan yang tertulis ke dalam Pipa.

Harus diingat bahwa ini adalah aliran data searah di Pipe yaitu data ditulis dalam saluran Sink saja dan hanya dapat dibaca dari saluran Sumber.

Dalam Java, pipa NIO didefinisikan sebagai kelas abstrak dengan tiga metode utama dimana dua di antaranya adalah abstrak.

Metode kelas Pipa

  • open() - Metode ini digunakan untuk mendapatkan turunan dari Pipa atau dapat dikatakan pipa dibuat dengan memanggil metode ini.

  • sink() - Metode ini mengembalikan saluran sink Pipe yang digunakan untuk menulis data dengan memanggil metode tulisnya.

  • source() - Metode ini mengembalikan saluran sumber Pipe yang digunakan untuk membaca data dengan memanggil metode baca.

Contoh

Contoh berikut menunjukkan implementasi pipa Java NIO.

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

public class PipeDemo {
   public static void main(String[] args) throws IOException {
      //An instance of Pipe is created
      Pipe pipe = Pipe.open();
      // gets the pipe's sink channel
      Pipe.SinkChannel skChannel = pipe.sink();
      String testData = "Test Data to Check java NIO Channels Pipe.";
      ByteBuffer buffer = ByteBuffer.allocate(512);
      buffer.clear();
      buffer.put(testData.getBytes());
      buffer.flip();
      //write data into sink channel.
      while(buffer.hasRemaining()) {
         skChannel.write(buffer);
      }
      //gets  pipe's source channel
      Pipe.SourceChannel sourceChannel = pipe.source();
      buffer = ByteBuffer.allocate(512);
      //write data into console     
      while(sourceChannel.read(buffer) > 0){
         //limit is set to current position and position is set to zero
         buffer.flip();
         while(buffer.hasRemaining()){
            char ch = (char) buffer.get();
            System.out.print(ch);
         }
         //position is set to zero and limit is set to capacity to clear the buffer.
         buffer.clear();
      }
   }
}

Keluaran

Test Data to Check java NIO Channels Pipe.

Dengan asumsi kami memiliki file teks c:/test.txt, yang memiliki konten berikut. File ini akan digunakan sebagai masukan untuk program contoh kita.

Seperti namanya Path adalah lokasi tertentu dari suatu entitas seperti file atau direktori dalam sistem file sehingga seseorang dapat mencari dan mengaksesnya di lokasi tertentu.

Secara teknis dalam hal Java, Path adalah antarmuka yang diperkenalkan dalam paket file Java NIO selama Java versi 7, dan merupakan representasi dari lokasi dalam sistem file tertentu. Sebagai antarmuka jalur dalam paket Java NIO sehingga mendapatkan nama yang memenuhi syarat sebagai java .nio.file.Path.

Secara umum, jalur suatu entitas dapat terdiri dari dua jenis, satu adalah jalur absolut dan yang lainnya adalah jalur relatif.Seperti nama kedua jalur menunjukkan bahwa jalur absolut adalah alamat lokasi dari akar ke entitas di mana ia menempatkannya sedangkan jalur relatif adalah alamat lokasi yang relatif terhadap beberapa jalur lain.Path menggunakan pembatas dalam definisinya sebagai "\" untuk Windows dan "/" untuk sistem operasi unix.

Untuk mendapatkan instance Path kita bisa menggunakan metode statis kelas java.nio.file.Paths get()Metode ini mengonversi string jalur, atau urutan string yang ketika digabungkan membentuk string jalur, menjadi instance Path. Metode ini juga melempar InvalidPathException runtime jika argumen yang diteruskan berisi karakter ilegal.

Seperti yang disebutkan di atas, jalur absolut diambil dengan meneruskan elemen root dan daftar direktori lengkap yang diperlukan untuk menemukan file. Sementara jalur relatif dapat diambil dengan menggabungkan jalur dasar dengan jalur relatif. Penarikan kedua jalur akan diilustrasikan dalam contoh berikut

Contoh

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path relative = Paths.get("file2.txt");
      System.out.println("Relative path: " + relative);
      Path absolute = relative.toAbsolutePath();
      System.out.println("Absolute path: " + absolute);
   }
}

Sejauh ini kita tahu bahwa apa itu antarmuka jalur mengapa kita membutuhkannya dan bagaimana kita bisa mengaksesnya Sekarang kita akan tahu apa metode penting yang disediakan antarmuka Path.

Metode penting dari Path Interface

  • getFileName() - Mengembalikan sistem file yang membuat objek ini.

  • getName() - Mengembalikan elemen nama jalur ini sebagai objek Path.

  • getNameCount() - Mengembalikan jumlah elemen nama di jalur.

  • subpath() - Mengembalikan Path relatif yang merupakan rangkaian dari elemen nama dari path ini.

  • getParent() - Mengembalikan jalur induk, atau null jika jalur ini tidak memiliki induk.

  • getRoot() - Mengembalikan komponen root dari jalur ini sebagai objek Path, atau null jika jalur ini tidak memiliki komponen root.

  • toAbsolutePath() - Mengembalikan objek Path yang mewakili jalur absolut dari jalur ini.

  • toRealPath() - Mengembalikan jalur sebenarnya dari file yang sudah ada.

  • toFile() - Mengembalikan objek File yang mewakili jalur ini.

  • normalize() - Mengembalikan jalur yang merupakan jalur ini dengan elemen nama yang berlebihan dihilangkan.

  • compareTo(Path other) - Membandingkan dua jalur abstrak secara leksikografis. Metode ini mengembalikan nol jika argumen sama dengan jalur ini, nilai kurang dari nol jika jalur ini secara leksikografis lebih kecil dari argumen, atau nilai lebih besar dari nol jika jalur ini secara leksikografis lebih besar dari argumen .

  • endsWith(Path other) - Menguji apakah jalur ini diakhiri dengan jalur yang diberikan Jika jalur yang diberikan memiliki N elemen, dan tidak ada komponen root, dan jalur ini memiliki N atau lebih elemen, jalur ini diakhiri dengan jalur yang diberikan jika N elemen terakhir dari setiap jalur, dimulai dari elemen terjauh dari root, adalah sama.

  • endsWith(String other) - Menguji apakah jalur ini diakhiri dengan sebuah Jalur, yang dibangun dengan mengonversi string jalur yang diberikan, persis dengan cara yang ditentukan oleh metode ENDWith (Path).

Contoh

Contoh berikut mengilustrasikan berbagai metode antarmuka Path yang disebutkan di atas -

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path path = Paths.get("D:/workspace/ContentW/Saurav_CV.docx");
      FileSystem fs =  path.getFileSystem();
      System.out.println(fs.toString());
      System.out.println(path.isAbsolute());
      System.out.println(path.getFileName());
      System.out.println(path.toAbsolutePath().toString());
      System.out.println(path.getRoot());
      System.out.println(path.getParent());
      System.out.println(path.getNameCount());
      System.out.println(path.getName(0));
      System.out.println(path.subpath(0, 2));
      System.out.println(path.toString());
      System.out.println(path.getNameCount());
      Path realPath = path.toRealPath(LinkOption.NOFOLLOW_LINKS);
      System.out.println(realPath.toString());
      String originalPath = "d:\\data\\projects\\a-project\\..\\another-project";
      Path path1 = Paths.get(originalPath);
      Path path2 = path1.normalize();
      System.out.println("path2 = " + path2);
   }
}

Paket Java NIO menyediakan satu lagi API utilitas bernama File yang pada dasarnya digunakan untuk memanipulasi file dan direktori menggunakan metode statisnya yang sebagian besar berfungsi pada objek Path.

Seperti yang disebutkan dalam tutorial Path bahwa antarmuka Path diperkenalkan dalam paket Java NIO selama versi Java 7 dalam paket file. Jadi tutorial ini untuk paket File yang sama.

Kelas ini secara eksklusif terdiri dari metode statis yang beroperasi pada file, direktori, atau jenis file lainnya. Dalam kebanyakan kasus, metode yang ditentukan di sini akan mendelegasikan ke penyedia sistem file terkait untuk melakukan operasi file.

Ada banyak metode yang ditentukan di kelas Files yang juga dapat dibaca dari dokumen Java. Dalam tutorial ini kami mencoba membahas beberapa metode penting di antara semua metode kelas File Java NIO.

Metode penting dari kelas File.

Berikut adalah metode penting yang didefinisikan di kelas File Java NIO.

  • createFile(Path filePath, FileAttribute attrs) - Kelas file menyediakan metode ini untuk membuat file menggunakan Path yang ditentukan.

Contoh

package com.java.nio;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateFile {
   public static void main(String[] args) {
      //initialize Path object
      Path path = Paths.get("D:file.txt");
      //create file
      try {
         Path createdFilePath = Files.createFile(path);
         System.out.println("Created a file at : "+createdFilePath);
      } 
      catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Keluaran

Created a file at : D:\data\file.txt
  • copy(InputStream in, Path target, CopyOption… options) - Metode ini digunakan untuk menyalin semua byte dari aliran input yang ditentukan ke file target yang ditentukan dan mengembalikan jumlah byte yang dibaca atau ditulis sebagai nilai panjang. LinkOption untuk parameter ini dengan nilai berikut -

    • COPY_ATTRIBUTES - salin atribut ke file baru, misalnya atribut waktu modifikasi terakhir.

    • REPLACE_EXISTING - ganti file yang ada jika ada.

    • NOFOLLOW_LINKS - Jika file adalah tautan simbolis, maka tautan itu sendiri, bukan target tautan, yang akan disalin.

Contoh

package com.java.nio;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
public class WriteFile {
   public static void main(String[] args) {
      Path sourceFile = Paths.get("D:file.txt");
      Path targetFile = Paths.get("D:fileCopy.txt");
      try {
         Files.copy(sourceFile, targetFile,
         StandardCopyOption.REPLACE_EXISTING);
      }
      catch (IOException ex) {
         System.err.format("I/O Error when copying file");
      }
      Path wiki_path = Paths.get("D:fileCopy.txt");
      Charset charset = Charset.forName("ISO-8859-1");
      try {
         List<String> lines = Files.readAllLines(wiki_path, charset);
         for (String line : lines) {
            System.out.println(line);
         }
      } 
      catch (IOException e) {
         System.out.println(e);
      }
   }	
}

Keluaran

To be or not to be?
  • createDirectories(Path dir, FileAttribute<?>...attrs) - Metode ini digunakan untuk membuat direktori menggunakan jalur yang diberikan dengan membuat semua direktori induk yang tidak ada.

  • delete(Path path) - Metode ini digunakan untuk menghapus file dari jalur yang ditentukan. Metode ini melempar NoSuchFileException jika file tidak ada di jalur yang ditentukan atau jika file tersebut adalah direktori dan tidak boleh kosong dan tidak dapat dihapus.

  • exists(Path path) - Metode ini digunakan untuk memeriksa apakah file ada di jalur yang ditentukan dan jika file ada maka akan mengembalikan benar atau mengembalikan salah.

  • readAllBytes(Path path) - Metode ini digunakan untuk membaca semua byte dari file di jalur tertentu dan mengembalikan array byte yang berisi byte yang dibaca dari file.

Contoh

package com.java.nio;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class ReadFile {
   public static void main(String[] args) {
      Path wiki_path = Paths.get("D:file.txt");
      Charset charset = Charset.forName("ISO-8859-1");
      try {
         List<String> lines = Files.readAllLines(wiki_path, charset);
         for (String line : lines) {
            System.out.println(line);
         }
      } 
      catch (IOException e) {
         System.out.println(e);
      }
   }	
}

Keluaran

Welcome to file.
  • size(Path path) - Metode ini digunakan untuk mendapatkan ukuran file di jalur yang ditentukan dalam byte.

  • write(Path path, byte[] bytes, OpenOption… options) - Metode ini digunakan untuk menulis byte ke file di jalur yang ditentukan.

Contoh

package com.java.nio;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class WriteFile {
   public static void main(String[] args) {
      Path path = Paths.get("D:file.txt");
      String question = "To be or not to be?";
      Charset charset = Charset.forName("ISO-8859-1");
      try {
         Files.write(path, question.getBytes());
         List<String> lines = Files.readAllLines(path, charset);
         for (String line : lines) {
            System.out.println(line);
         }
      } 
      catch (IOException e) {
         System.out.println(e);
      }
   }
}

Keluaran

To be or not to be?

Seperti yang kita ketahui bahwa Java NIO mendukung konkurensi dan multi-threading yang memungkinkan kita untuk menangani saluran yang berbeda secara bersamaan pada saat yang sama.Jadi API yang bertanggung jawab untuk ini dalam paket Java NIO adalah AsynchronousFileChannel yang didefinisikan di bawah paket saluran NIO. Oleh karena itu nama yang memenuhi syarat untuk AsynchronousFileChannel adalah java.nio.channels.AsynchronousFileChannel.

AsynchronousFileChannel mirip dengan NIO's FileChannel, kecuali bahwa saluran ini memungkinkan operasi file untuk dieksekusi secara asynchronous tidak seperti operasi I / O sinkron di mana thread masuk ke dalam suatu tindakan dan menunggu sampai permintaan selesai. Dengan demikian saluran asinkron aman untuk digunakan dengan beberapa utas bersamaan.

Dalam asynchronous, permintaan diteruskan oleh thread ke kernel sistem operasi untuk menyelesaikannya sementara thread terus memproses pekerjaan lain. Setelah pekerjaan kernel selesai, ia memberi sinyal kepada thread maka thread mengenali sinyal dan mengganggu pekerjaan saat ini dan memproses Pekerjaan I / O sesuai kebutuhan.

Untuk mencapai konkurensi, saluran ini menyediakan dua pendekatan yang mencakup satu sebagai mengembalikan a java.util.concurrent.Future object dan lainnya Meneruskan ke operasi sebuah objek bertipe java.nio.channels.CompletionHandler.

Kami akan memahami kedua pendekatan dengan bantuan contoh satu per satu.

  • Future Object - Dalam contoh ini, Antarmuka Masa Depan dikembalikan dari saluran. Di antarmuka Masa Depan ada get() metode yang mengembalikan status operasi yang ditangani secara asynchronous atas dasar eksekusi lebih lanjut dari tugas lain dapat diputuskan. Kita juga bisa memeriksa apakah tugas selesai atau tidak dengan memanggilnya isDone metode.

Contoh

Contoh berikut menunjukkan cara menggunakan objek Future dan melakukan tugas secara asinkron.

package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class FutureObject {
   public static void main(String[] args) throws Exception {
      readFile();
   }
   private static void readFile() throws IOException, InterruptedException, ExecutionException {
      String filePath = "D:fileCopy.txt";
      printFileContents(filePath);
      Path path = Paths.get(filePath);		
      AsynchronousFileChannel channel =AsynchronousFileChannel.open(path, StandardOpenOption.READ);
      ByteBuffer buffer = ByteBuffer.allocate(400);
      Future<Integer> result = channel.read(buffer, 0); // position = 0
      while (! result.isDone()) {
         System.out.println("Task of reading file is in progress asynchronously.");
      }
      System.out.println("Reading done: " + result.isDone());
      System.out.println("Bytes read from file: " + result.get()); 
      buffer.flip();
      System.out.print("Buffer contents: ");
      while (buffer.hasRemaining()) {
         System.out.print((char) buffer.get());                
      }
      System.out.println(" ");
      buffer.clear();
      channel.close();
   }
   private static void printFileContents(String path) throws IOException {
      FileReader fr = new FileReader(path);
      BufferedReader br = new BufferedReader(fr);
      String textRead = br.readLine();
      System.out.println("File contents: ");
      while (textRead != null) {
         System.out.println("     " + textRead);
         textRead = br.readLine();
      }
   fr.close();
   br.close();
   }
}

Keluaran

File contents: 
   To be or not to be?
   Task of reading file is in progress asynchronously.
   Task of reading file is in progress asynchronously.
   Reading done: true
   Bytes read from file: 19
   Buffer contents: To be or not to be?
  • Completion Handler -

    Pendekatan ini cukup sederhana karena dalam hal ini kami menggunakan antarmuka CompletionHandler dan menimpa dua metode yang satu ini completed() metode yang dipanggil ketika operasi I / O selesai dengan sukses dan lainnya failed() metode yang dipanggil jika operasi I / O gagal. Dalam hal ini penangan dibuat untuk menggunakan hasil dari operasi I / O asinkron seperti setelah tugas selesai maka hanya penangan yang memiliki fungsi yang dijalankan.

Contoh

Contoh berikut menunjukkan cara menggunakan CompletionHandler untuk melakukan tugas secara asynchronous.

package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.channels.CompletionHandler;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class CompletionHandlerDemo {
   public static void main (String [] args) throws Exception {
      writeFile();
   }
   private static void writeFile() throws IOException {
      String input = "Content to be written to the file.";
      System.out.println("Input string: " + input);
      byte [] byteArray = input.getBytes();
      ByteBuffer buffer = ByteBuffer.wrap(byteArray);
      Path path = Paths.get("D:fileCopy.txt");
      AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE);
      CompletionHandler handler = new CompletionHandler() {
         @Override
         public void completed(Object result, Object attachment) {
            System.out.println(attachment + " completed and " + result + " bytes are written.");
         }
         @Override
         public void failed(Throwable exc, Object attachment) {
            System.out.println(attachment + " failed with exception:");
            exc.printStackTrace();
         }
      };
      channel.write(buffer, 0, "Async Task", handler);
      channel.close();
      printFileContents(path.toString());
   }
   private static void printFileContents(String path) throws IOException {
      FileReader fr = new FileReader(path);
      BufferedReader br = new BufferedReader(fr);
      String textRead = br.readLine();
      System.out.println("File contents: ");
      while (textRead != null) {
         System.out.println("     " + textRead);
         textRead = br.readLine();
      }
      fr.close();
      br.close();
   }
}

Keluaran

Input string: Content to be written to the file.
Async Task completed and 34 bytes are written.
File contents: 
Content to be written to the file.

Di Java untuk setiap karakter ada unit kode unicode yang ditentukan dengan baik yang ditangani secara internal oleh JVM. Jadi paket Java NIO mendefinisikan kelas abstrak bernama Charset yang terutama digunakan untuk encoding dan decoding charset dan UNICODE.

Charset standar

Charset yang didukung di java diberikan di bawah ini.

  • US-ASCII - Tujuh karakter ASCII.

  • ISO-8859-1 - Alfabet Latin ISO.

  • UTF-8 - Ini adalah format transformasi UCS 8 bit.

  • UTF-16BE - Ini adalah format transformasi UCS 16 bit dengan urutan byte big endian.

  • UTF-16LE - Ini adalah transformasi UCS 16 bit dengan urutan bit endian kecil.

  • UTF-16 - Format transformasi UCS 16 bit.

Metode penting dari kelas Charset

  • forName() - Metode ini membuat objek charset untuk nama charset yang diberikan. Namanya bisa kanonik atau alias.

  • displayName() - Metode ini mengembalikan nama kanonik charset yang diberikan.

  • canEncode() - Metode ini memeriksa apakah charset yang diberikan mendukung encoding atau tidak.

  • decode() - Metode ini menerjemahkan string dari charset yang diberikan menjadi charbuffer dari charset Unicode.

  • encode() - Metode ini mengkodekan charbuffer dari unicode charset ke dalam buffer byte dari charset yang diberikan.

Contoh

Contoh berikut mengilustrasikan metode penting kelas Charset.

package com.java.nio;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
public class CharsetExample {
   public static void main(String[] args) {
      Charset charset = Charset.forName("US-ASCII");
      System.out.println(charset.displayName());
      System.out.println(charset.canEncode());
      String str = "Demo text for conversion.";
      //convert byte buffer in given charset to char buffer in unicode
      ByteBuffer byteBuffer = ByteBuffer.wrap(str.getBytes());
      CharBuffer charBuffer = charset.decode(byteBuffer);
      //convert char buffer in unicode to byte buffer in given charset
      ByteBuffer newByteBuffer = charset.encode(charBuffer);
      while(newbb.hasRemaining()){
         char ch = (char) newByteBuffer.get();
         System.out.print(ch);
      }
      newByteBuffer.clear();
   }
}

Keluaran

US-ASCII
Demo text for conversion.

Seperti yang kita ketahui bahwa Java NIO mendukung konkurensi dan multi threading yang memungkinkannya menangani beberapa utas yang beroperasi pada banyak file pada waktu yang sama, tetapi dalam beberapa kasus kami mengharuskan file kami tidak dibagikan oleh utas mana pun dan tidak dapat diakses.

Untuk persyaratan seperti itu, NIO kembali menyediakan API yang dikenal sebagai FileLock yang digunakan untuk mengunci seluruh file atau sebagian file, sehingga file atau bagiannya tidak dapat dibagikan atau dapat diakses.

untuk menyediakan atau menerapkan kunci seperti itu, kita harus menggunakan FileChannel atau AsynchronousFileChannel, yang menyediakan dua metode lock() dan tryLock()untuk tujuan ini Kunci yang disediakan mungkin dari dua jenis -

  • Exclusive Lock - Kunci eksklusif mencegah program lain memperoleh kunci yang tumpang tindih dari salah satu jenis.

  • Shared Lock - Kunci bersama mencegah program lain yang berjalan secara bersamaan untuk mendapatkan kunci eksklusif yang tumpang tindih, tetapi memungkinkan mereka memperoleh kunci bersama yang tumpang tindih.

Metode yang digunakan untuk mendapatkan kunci atas file -

  • lock() - Metode FileChannel atau AsynchronousFileChannel ini memperoleh kunci eksklusif atas file yang terkait dengan saluran yang diberikan. Jenis pengembalian metode ini adalah FileLock yang selanjutnya digunakan untuk memantau kunci yang diperoleh.

  • lock(long position, long size, boolean shared) - Metode ini lagi-lagi adalah metode metode penguncian yang kelebihan beban dan digunakan untuk mengunci bagian tertentu dari sebuah file.

  • tryLock() - Metode ini mengembalikan FileLock atau null jika kunci tidak dapat diperoleh dan mencoba untuk mendapatkan kunci eksklusif yang eksplisit pada file saluran ini.

  • tryLock(long position, long size, boolean shared) - Metode ini mencoba memperoleh kunci di wilayah tertentu dari file saluran ini yang mungkin merupakan tipe eksklusif atau bersama.

Metode Kelas FileLock

  • acquiredBy() - Metode ini mengembalikan saluran yang kunci filenya diperoleh.

  • position() - Metode ini mengembalikan posisi di dalam file dari byte pertama dari wilayah yang dikunci. Wilayah yang dikunci tidak perlu berada di dalam, atau bahkan tumpang tindih, file yang mendasari sebenarnya, sehingga nilai yang dikembalikan oleh metode ini mungkin melebihi ukuran file saat ini.

  • size() - Metode ini mengembalikan ukuran wilayah terkunci dalam byte. Wilayah terkunci tidak perlu berada di dalam, atau bahkan tumpang tindih, file yang mendasari sebenarnya, sehingga nilai yang dikembalikan oleh metode ini mungkin melebihi ukuran file saat ini.

  • isShared() - Metode ini digunakan untuk menentukan apakah kunci dibagikan atau tidak.

  • overlaps(long position,long size) - Metode ini memberi tahu apakah kunci ini tumpang tindih dengan rentang kunci yang diberikan.

  • isValid() - Metode ini memberi tahu apakah kunci yang diperoleh valid atau tidak. Objek kunci tetap valid hingga dilepaskan atau saluran file terkait ditutup, mana saja yang lebih dulu.

  • release()- Melepaskan kunci yang diperoleh. Jika objek kunci valid, maka menjalankan metode ini akan melepaskan kunci dan membuat objek menjadi tidak valid. Jika objek kunci ini tidak valid maka pemanggilan metode ini tidak akan berpengaruh.

  • close()- Metode ini memanggil metode release (). Itu ditambahkan ke kelas sehingga bisa digunakan bersama dengan konstruksi blok pengelolaan sumber daya otomatis.

Contoh untuk mendemonstrasikan kunci file.

Contoh berikut membuat kunci di atas file dan menulis konten ke dalamnya

package com.java.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileLockExample {
   public static void main(String[] args) throws IOException {
      String input = "Demo text to be written in locked mode.";  
      System.out.println("Input string to the test file is: " + input);  
      ByteBuffer buf = ByteBuffer.wrap(input.getBytes());  
      String fp = "D:file.txt";  
      Path pt = Paths.get(fp);  
      FileChannel channel = FileChannel.open(pt, StandardOpenOption.WRITE,StandardOpenOption.APPEND);  
      channel.position(channel.size() - 1); // position of a cursor at the end of file       
      FileLock lock = channel.lock();   
      System.out.println("The Lock is shared: " + lock.isShared());  
      channel.write(buf);  
      channel.close(); // Releases the Lock  
      System.out.println("Content Writing is complete. Therefore close the channel and release the lock.");  
      PrintFileCreated.print(fp);  
   }  
}
package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class PrintFileCreated {
   public static void print(String path) throws IOException {  
      FileReader filereader = new FileReader(path);  
      BufferedReader bufferedreader = new BufferedReader(filereader);  
      String tr = bufferedreader.readLine();    
      System.out.println("The Content of testout.txt file is: ");  
      while (tr != null) {      
         System.out.println("    " + tr);  
         tr = bufferedreader.readLine();  
      }  
   filereader.close();  
   bufferedreader.close();  
   }  
}

Keluaran

Input string to the test file is: Demo text to be written in locked mode.
The Lock is shared: false
Content Writing is complete. Therefore close the channel and release the lock.
The Content of testout.txt file is: 
To be or not to be?Demo text to be written in locked mode.