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;78public class NIOFileCopy {9public static void main(String[] args) throws IOException {10String source = "kaynak.txt";11String dest = "hedef.txt";1213// 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)) {1718ByteBuffer buffer = ByteBuffer.allocate(1024 * 64); // 64 KB buffer1920while (sourceChannel.read(buffer) > 0) {21buffer.flip();22destChannel.write(buffer);23buffer.clear();24}25}2627System.out.println("Dosya başarıyla kopyalandı!");28}29}Beklenen çıktı: "Dosya başarıyla kopyalandı!" mesajı ve hedef.txt dosyası oluşturulur.
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.
0 yorum