Channel
- Java kursu
- Uzman
- Ders 14/46
- 5 dk
Channel ile NIO kanalını öğrenirsin.
Channel kavramı
Bir Channel (kanal), veriyi bir buffer üzerinden taşır. Akışların (stream) aksine channel çift yönlü olabilir ve bloklamayan (non-blocking) moda geçebilir. Bu, yüksek hacimli IO için daha verimlidir.
Örnek: WritableByteChannel, bir ByteBuffer alıp write yöntemiyle hedefe yazar. Channels.newChannel(out) ile sıradan bir OutputStream bir kanala sarınır. Böylece akış tabanlı kod, NIO kanal API'siyle çalışabilir. Kanallar close ile kapatılır.
Channel ve akım farkı
Akımlar (stream) tek bayt veya bayt dizisiyle çalışır; channel ise ByteBuffer ile blok halinde veri taşır. Akımlar genelde bloklayıcıdır; channel'lar bazı türlerde bloklamayan moda geçebilir.
Örnek: FileChannel bir dosyaya doğrudan kanal açar; read ve write bir buffer alır. Bu, büyük dosyalarda akımdan daha hızlıdır. Ayrıca transferTo gibi yöntemler kanaldan kanala veriyi doğrudan kopyalar. Bu yüzden yüksek performanslı IO'da channel tercih edilir.
Uygulama Kanala bayt yaz
Bir ByteArrayOutputStream out oluştur. WritableByteChannel ch = Channels.newChannel(out) ile kanalı sar. ByteBuffer.wrap(new byte[]{65, 66}) ile iki baytlık tampon hazırla. ch.write(b) ile yaz, ch.close() ile kapat. new String(out.toByteArray()) sonucunu System.out.println ile yazdır.
Başlangıç kodu
// ByteArrayOutputStream oluştur
// Channels.newChannel ile kanalı sar
// yaz ve sonucu yazdırÖrnek çözüm
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.WritableByteChannel;
public class ChannelDemo {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
WritableByteChannel ch = Channels.newChannel(out);
ByteBuffer b = ByteBuffer.wrap(new byte[]{65, 66});
ch.write(b);
ch.close();
System.out.println(new String(out.toByteArray()));
}
}Beklenen çıktı
AB
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Channel kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
Channel |
Veri kanalı |
ByteBuffer |
Taşıdığı veri |
write |
Tamponu yazar |
Channels.newChannel |
Akımdan kanal |
2 Channel hangi veriyle çalışır?
- Dizgiler
- Karakterler
- ByteBuffer Doğru cevap
- Nesneler
Açıklama: Channel, ByteBuffer üzerinden veri taşır.
3 Channels.newChannel çağrısını tamamla
WritableByteChannel ch = Channels.____(out);
WritableByteChannel ch = Channels.newChannel(out);
Açıklama: newChannel bir akımı kanala sarar.