Praktik Mandiri 4: Java I/O dan Networking

1. Java I/O Dasar

Konsep yang Dipelajari:

  • InputStream/OutputStream
  • Reader/Writer
  • File handling
  • Serialization

Latihan:

  1. File Copy
// Salin file menggunakan FileInputStream dan FileOutputStream
try (InputStream in = new FileInputStream("input.txt");
     OutputStream out = new FileOutputStream("output.txt")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
}

2. Baca/Tulis File Teks

// Gunakan BufferedReader dan BufferedWriter untuk memproses file teks
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
     BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        writer.write(line.toUpperCase());
        writer.newLine();
    }
}

3. Serialisasi Objek

// Simpan dan muat objek ke/dari file
class Person implements Serializable {
    private String name;
    // constructor, getter, setter
}

// Serialize
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
    oos.writeObject(new Person("Alice"));
}

// Deserialize
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
    Person p = (Person) ois.readObject();
}

2. Java NIO (New I/O)

Konsep yang Dipelajari:

  • Path dan Files
  • Channel dan Buffer
  • Non-blocking I/O

Latihan:

  1. Baca File dengan NIO
Path path = Paths.get("data.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);

2. Salin File Menggunakan Channel

try (FileChannel src = FileChannel.open(Paths.get("src.txt"), StandardOpenOption.READ);
     FileChannel dest = FileChannel.open(Paths.get("dest.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
    src.transferTo(0, src.size(), dest);
}

3. Java Networking Dasar

Konsep yang Dipelajari:

  • URL dan URLConnection
  • TCP Socket (ServerSocket dan Socket)
  • UDP Datagram

Latihan:

  1. HTTP Client Sederhana
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

2. TCP Echo Server/Client

// Server
try (ServerSocket server = new ServerSocket(12345);
     Socket client = server.accept();
     PrintWriter out = new PrintWriter(client.getOutputStream(), true);
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()))) {
    String input;
    while ((input = in.readLine()) != null) {
        out.println("Echo: " + input);
    }
}

// Client
try (Socket socket = new Socket("localhost", 12345);
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println(in.readLine());
    }
}

3. UDP Chat Sederhana

// Pengirim
DatagramSocket socket = new DatagramSocket();
byte[] buffer = "Hello UDP".getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 9876);
socket.send(packet);

// Penerima
DatagramSocket socket = new DatagramSocket(9876);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());

4. Proyek Integrasi

Aplikasi Chat dengan File Sharing

  • Fitur:
    1. Client-server architecture menggunakan TCP
    2. Bisa mengirim pesan teks
    3. Bisa mengirim file (gunakan Java I/O untuk transfer file)
    4. Log aktivitas disimpan ke file (gunakan BufferedWriter)
    5. Bonus: Enkripsi data menggunakan SSL/TLS

Struktur Kode Contoh:

// Server
public class ChatServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        ExecutorService pool = Executors.newCachedThreadPool();
        
        while (true) {
            Socket clientSocket = serverSocket.accept();
            pool.execute(new ClientHandler(clientSocket));
        }
    }
}

// ClientHandler
class ClientHandler implements Runnable {
    private Socket socket;
    // Implementasi handling pesan dan file
}

5. Tips Belajar

  1. Selalu tambahkan exception handling (try-with-resources)
  2. Gunakan Logger untuk mencatat error
  3. Eksperimen dengan Wireshark untuk analisis traffic jaringan
  4. Bandingkan performa I/O tradisional vs NIO

6. Tantangan Lanjutan

  1. Buat proxy server HTTP sederhana
  2. Implementasikan REST client menggunakan java.net.http.HttpClient (Java 11+)
  3. Buat aplikasi P2P file sharing dengan UDP multicast

Contoh HttpClient (Java 11+):

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/users"))
        .build();

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

Dengan menyelesaikan latihan-latihan ini, Anda akan memahami konsep inti Java I/O dan Networking serta mampu membangun aplikasi berbasis jaringan sederhana.