CodeBlanks Logo Icon CodeBlanks

Channels

FileChannel ile kanal tabanlı I/O öğrenirsin.

Channels

Channel, NIO'nun temel arayüzüdür; FileChannel dosya işlemleri için kullanılır. ByteBuffer ile veri arabelleğe alınıp kanaldan okunur ya da yazılır.

try (FileChannel ch = FileChannel.open(p,
        StandardOpenOption.READ)) {
    ByteBuffer buf = ByteBuffer.allocate(16);
    ch.read(buf);
    buf.flip();
}

Burada flip() arabelleği okumaya hazırlar. Channel, akışlardan farklı olarak ileri-geri hareket edebilir. Bu, büyük dosyalarda verimli erişim sağlar. Modern NIO API'sinin temelidir.

flip ve rewind

buf.flip() arabelleği okumaya hazırlar: konumu sıfırlar ve sınırını günceller. rewind() ise konumu sıfırlar ama sınırı değiştirmez.

buf.put((byte) 65);  // 'A'
buf.flip();
byte b = buf.get();  // 65

Bu, okuma/yazma geçişlerinde standart bir desendir. clear() ise arabelleği yeniden yazmaya hazırlar. NIO kodunda bu yöntemler sık karşına çıkar; doğru kullanım performans ve doğruluk için kritiktir.

Uygulama FileChannel ile bayt oku

Bir ChannelDemo sınıfında main yaz; Files.createTempFile("c", ".txt") ile dosya oluştur, Files.writeString(p, "AB") ile iki karakter yaz. try (FileChannel ch = FileChannel.open(p, StandardOpenOption.READ)) bloğunda ByteBuffer buf = ByteBuffer.allocate(2) ile arabellek oluştur, ch.read(buf) çağır, buf.flip() yap ve System.out.println((char) buf.get()) ile ilk karakteri yazdır.

Başlangıç kodu

Main.java
import java.nio.file.*;
import java.nio.channels.*;
import java.nio.*;

// ChannelDemo sınıfında main yaz

// createTempFile ve writeString ile kur; FileChannel aç; read+flip+get ile ilk karakteri yazdır

Örnek çözüm

Main.java
import java.nio.file.*;
import java.nio.channels.*;
import java.nio.*;

class ChannelDemo {
    public static void main(String[] args) throws Exception {
        Path p = Files.createTempFile("c", ".txt");
        Files.writeString(p, "AB");
        try (FileChannel ch = FileChannel.open(p, StandardOpenOption.READ)) {
            ByteBuffer buf = ByteBuffer.allocate(2);
            ch.read(buf);
            buf.flip();
            System.out.println((char) buf.get());
        }
    }
}

Beklenen çıktı

A

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 ByteBuffer oluşturmayı tamamla

Soru
ByteBuffer buf = ByteBuffer.____(16);
Cevap
ByteBuffer buf = ByteBuffer.allocate(16);

Açıklama: ByteBuffer.allocate(n) ile arabellek oluşturulur.

2 FileChannel ile dosyayı açmak için ne kullanılır?

  • new FileChannel()
  • Files.openChannel(path)
  • FileChannel.open(path, option) Doğru cevap
  • channel.of(path)

Açıklama: FileChannel.open(path, option) ile açılır.

3 Channel kavramlarını eşleştir

Kavram Anlamı
FileChannel Dosya kanalı
ByteBuffer Veri arabelleği
flip() Okumaya hazırlar
StandardOpenOption Açma seçenekleri

İleri seviye bölümündeki tüm dersler