Java NIO ile Yüksek Performanslı Dosya İşleme

Java NIO (Non-blocking I/O), geleneksel I/O'dan çok daha hızlı dosya işleme sunar. Özellikle büyük dosyalar veya yüksek trafikli uygulamalarda fark belirgin olur. Temel fark, buffer ve channel kullanarak veriyi bloklamadan işlemesidir.

NIO'nun avantajı şu: geleneksel FileInputStream satır satır veya küçük parçalarla okur. NIO ise chunk halinde, bellek-verimli bir şekilde işler. Binlerce dosyayı eşzamanlı okurken sistem kaynaklarını çok daha iyi kullanır.

Bir dosyayı NIO ile okumak için FileChannel ve ByteBuffer kullanırız. pratik bir örnek:

1import java.io.*;
2import java.nio.ByteBuffer;
3import java.nio.channels.FileChannel;
4import java.nio.file.StandardOpenOption;
5import java.nio.file.Files;
6import java.nio.file.Paths;
7
8public class NIOFileCopy {
9public static void main(String[] args) throws IOException {
10String source = "kaynak.txt";
11String dest = "hedef.txt";
12
13// Dosyayı kopyala (NIO ile)
14try (FileChannel sourceChannel = FileChannel.open(Paths.get(source), StandardOpenOption.READ);
15FileChannel destChannel = FileChannel.open(Paths.get(dest),
16StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
17
18ByteBuffer buffer = ByteBuffer.allocate(1024 * 64); // 64 KB buffer
19
20while (sourceChannel.read(buffer) > 0) {
21buffer.flip();
22destChannel.write(buffer);
23buffer.clear();
24}
25}
26
27System.out.println("Dosya başarıyla kopyalandı!");
28}
29}

Beklenen çıktı: "Dosya başarıyla kopyalandı!" mesajı ve hedef.txt dosyası oluşturulur.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Bu kod 64 KB'lık buffer kullanarak dosyayı parça parça okur ve yazar. `flip()` metodu buffer'ı okuma moduna çevirir, `clear()` ise yazma moduna hazırlar. Geleneksel I/O ile aynı işlem çok daha yavaş olurdu.

Daha büyük dosyalar için `transferFrom()` metodunu da kullanabilirsin:

1long transferred = destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
2System.out.println("Aktarılan byte: " + transferred);

Bu yöntem işletim sistemi seviyesinde optimize edilmiş olduğu için en hızlı seçenektir.

Sık yapılan hata: buffer'ı flip() yapmadan write() çağırmak. Bu durumda hiçbir veri yazılmaz çünkü position sıfırda kalır. Ayrıca çok küçük buffer (örneğin 1024 byte) kullanmak performansı düşürür; 64 KB veya daha büyük buffer tercih et. Dosya boyutu biliniyorsa `allocateDirect()` ile doğrudan bellek buffer'ı kullanarak daha da hızlı işlem yapabilirsin.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz