Java Nio (yeni giriş/çıkış) söz konusu olduğunda, tampon odaklı, bloke edici olmayan bir G/Ç sistemi sağlayan güçlü bir Java API setidir. Bir NIO tedarikçisi olarak, geliştiricilerin Java Nio'yu kullanırken yaptıkları çeşitli yaygın hatalara ilk elden tanık oldum. Bu blog yazısında, bu hataları inceleyeceğim ve bunlardan nasıl kaçınacağınıza dair bilgiler sunacağım.
1. Bloke edici doğayı yanlış anlama
Java Nio'daki en temel kavramlardan biri, engellemeyen doğasıdır. Ancak, birçok geliştirici bu kavramı yanlış anlıyor. Geleneksel G/Ç'de, bir soket veya dosyadan okuma gibi işlemler bloke ediyor, yani işlem tamamlanana kadar iş parçacığı beklemeye alındı. Buna karşılık, Java Nio, bir ipliğin bir G/Ç işleminin bitirmesini beklerken diğer görevleri gerçekleştirmesine izin verir.
Yaygın bir hata, engellemeyen kanalları avantajlarını ortadan kaldıracak şekilde kullanmaktır. Örneğin, bazı geliştiriciler, verilerin mevcut olup olmadığını kontrol etmek için sürekli olarak engellemeyen bir kanalı anket yapan kod yazabilir. Bu, yüksek CPU kullanımına yol açabilir, çünkü iş parçacığı sürekli olarak sıkı bir döngüde çalışıyor, yeni veri olmasa bile kaynakları tüketiyor.
java.nio.channels.socketchannel'i içe aktarın; ithal java.io.ioException; public class badnonblockingExample {public static void main (String [] args) ioException {Socketchannel Channel = Socketchannel.open (); kanal.ConfigureBlocking (false); while (true) {if (kanal.read (null)> 0) {// işlem verileri}}}}}
Bu hatadan kaçınmak için geliştiriciler kullanmalıdırSeçiciJava Nio'da. ASeçicitek bir iş parçacığının çeşitli etkinlikler için birden fazla kanalı izlemesine izin verir.Op_read-Op_writeBu şekilde, iş parçacığı, kayıtlı kanallardan birinde bir olay gerçekleşene kadar verimli bir şekilde bekleyebilir.


java.nio.channels.socketchannel'i içe aktarın; ithal java.nio.channels.selector; java.nio.channels.selectionKey'i içe aktarın; ithal java.io.ioException; ithal java.util.iterator; public class goodnonblockingExample {public static void main (String [] args) IOException {Socketchannel Channel = Socketchannel.open (); kanal.ConfigureBlocking (false); Selector Selector = Selector.open (); kanal.register (Selector, SecectionKey.OP_READ); while (true) {selector.select (); Iterator <SectyKey> Keys = Selector.SelectedKeys (). Yineleyici (); while (Keys.HasNext ()) {SeckLeCKey Key = Keys.next (); if (tuş.isreadable ()) {// işlem verileri} Keys.remove (); }}}}
2. Yanlış tampon yönetimi
Tamponlar Java Nio'nun merkezindedir. Kanallara yazılacak kanallardan veya verilerden okunan verileri depolamak için kullanılırlar. Yaygın bir hata, özellikle uygunsuz tampon yönetimidir.konum-sınırlamak, Vekapasitetampon.
.kapasitebir tamponun tutabileceği maksimum öğe sayısıdır. .konumbir sonraki öğenin okunacağı veya yazılacağı geçerli konumu vesınırlamakson geçerli öğeden sonra dizindir.
Geliştiriciler genellikle okumadan önce veri yazdıktan sonra arabelleği çevirmeyi unuturlar. .Flip ()yöntem ayarlarsınırlamakMevcutkonumve sonra sıfırlarkonumTamponu çevirmeden, okuma işlemi yeni yazılmış verilerin sonundan başlayacak ve beklenmedik sonuçlara yol açacaktır.
java.nio.bytebuffer'ı içe aktarın; public class BufferManagementMistake {public static void main (String [] args) {byTebuffer Buffer = bytebuffer.alocation (1024); String data = "Merhaba, Java Nio!"; Buffer.put (data.getByTes ()); // hata: flip () baytını çağırmıyor [] sonuç = yeni bayt [buffer.capacity ()]; Buffer.get (sonuç); System.out.println (yeni dize (sonuç)); }}
Doğru yol aramaktırFlip ()arabellekten okumadan önce.
java.nio.bytebuffer'ı içe aktarın; public class raserBuffermanagement {public static void main (String [] args) {byTebuffer Buffer = bytebuffer.allocation (1024); String data = "Merhaba, Java Nio!"; Buffer.put (data.getByTes ()); Buffer.flip (); bayt [] sonuç = yeni bayt [buffer.remains ()]; Buffer.get (sonuç); System.out.println (yeni dize (sonuç)); }}
İlgili bir başka hata, artık gerekli olmadığında arabelleğin temizlenmesi veya sıkıştırılması değildir. Bunu yapmamak, özellikle uzun süreli uygulamalarda bellek sızıntılarına yol açabilir.
3. İstisna işlemeyi görmezden gelmek
İstisna işleme herhangi bir programlamada çok önemlidir ve Java Nio bir istisna değildir. Bununla birlikte, birçok geliştirici Java Nio kanalları ve seçicileri ile çalışırken uygun istisna işlemeyi görmezden gelir.
Örneğin, ağ kanallarıyla çalışırken, örneğin çeşitli istisnalar oluşabilir, örneğinIoExceptionBir ağ hatası olduğunda veyaKapalıChannelExceptionKanal zaten kapalı olduğunda. Bu istisnaları görmezden gelmek, uygulamadaki zorluklara neden olabilir.
java.nio.channels.socketchannel'i içe aktarın; ithal java.io.ioException; public class noExceptionHandling {public static void main (String [] args) {try {SocketchAnnel Channel = Socketchannel.open (); // bazı işlemler} catch (istisna e) {// uygun kullanım yok}}}
Geliştiriciler istisnaları zarif bir şekilde ele almalıdır. Örneğin, birIoExceptionBir kanaldan okurken oluşur, uygulama hatayı günlüğe kaydedebilir, kanalı doğru şekilde kapatabilir ve uygun kurtarma işlemlerini yapabilir.
java.nio.channels.socketchannel'i içe aktarın; ithal java.io.ioException; java.util.logging.Level; ithal java.util.logging.logger; public class properExceptionHandling {özel statik son logger logger = logger.getLogger (properExceptionHandling.class.GetName ()); public static void main (String [] args) {try {SocketchAnnel Channel = Socketchannel.open (); // bazı işlemler} catch (ioException e) {logger.log (Level.Severe, "ioException meydana geldi:", e); // Kanalı kapatın ve kurtarma eylemleri gerçekleştir}}}
4. İplik güvenliğini düşünmüyor
Java nio kanalları ve seçicileri her zaman iş parçacığı değildir - güvenlidir. Örneğin, birden fazla iş parçacığı aynı anda bir kanalı kaydetmeye çalışırsa, yarış koşullarına yol açabilir.
Geliştiricilerin paylaşılan NIO kaynaklarına erişirken uygun senkronizasyonu sağlamaları gerekir. Bunu yapmanın bir yolu kilitleri kullanmaktır. Bununla birlikte, kilitlerin aşırı kullanımı da performans bozulmasına yol açabilir.
java.nio.channels.socketchannel'i içe aktarın; ithal java.nio.channels.selector; java.nio.channels.selectionKey'i içe aktarın; ithal java.io.ioException; İçe Aktar Java.util.concurrent.locks.lock; İçe Aktarma Java.util.Concurrent.Locks.ReRenTrocklock; public class threadsAfetetyExample {özel statik son kilidi = new ReentrantLock (); özel statik seçici seçici; public static void main (String [] args) ioException {Selector = Selector.open (); Tweun t1 = yeni iş parçacığı (() -> {try {Socketchannel Channel = Socketchannel.open (); lock.lock (); try {kanal.register (seçici, seeckkey.op_read);} nihayet {lock.unlock ();}} catch (ioException e) {e.printstacktrace (}}); Konu T2 = yeni iş parçacığı (() -> {try {Socketchannel Channel = Socketchannel.open (); Lock.lock (); try {kanal.register (Select.Unlock ();}} nihayet {}}); t1.start (); t2.start (); }}
5. Ölçeklenebilirliğe bakan
Java Nio, özellikle yüksek verim ve düşük gecikme uygulamalarında ölçeklenebilir olacak şekilde tasarlanmıştır. Ancak, bazı geliştiriciler uygulamalarını tasarlarken ölçeklenebilirliği göz ardı eder.
Örneğin, bir uygulama çok sayıda kanalı işlemek için tek bir iş parçacığı kullanıyorsa, bir darboğaz haline gelebilir. Bu gibi durumlarda, geliştiriciler iş yükünü birden çok iş parçacığı arasında dağıtmak için bir iş parçacığı havuzu kullanmayı düşünmelidir.
java.nio.channels.socketchannel'i içe aktarın; ithal java.nio.channels.selector; java.nio.channels.selectionKey'i içe aktarın; ithal java.io.ioException; İçe Aktar Java.util.Concurrent.ExecutorService; ithal java.util.concurrent.executors; public class scalableablexample {private static final int thread_pool_size = 10; Özel Statik Final ExecutorService Executor = Executors.NewFixedThreadPool (Thread_Pool_Size); public static void main (String [] args) ioException {Selector Selector = Selector.open (); // (true) {Selector.select (); for (SecectionKey tuşu: Selector.SelectedKeys ()) {Executor.submit (() -> {if (Key.isreadable ()) {// Process Veri}}); }}}}
Çözüm
Bir NIO tedarikçisi olarak, Java Nio'yu doğru kullanmanın önemini anlıyorum. Bu yaygın hatalardan kaçınarak, geliştiriciler daha verimli, güvenilir ve ölçeklenebilir uygulamalar oluşturabilir. Java Nio hakkında daha fazla bilgi edinmek istiyorsanız veya yüksek kaliteli NIO bileşenleri arıyorsanız, yardımcı olmak için buradayız. Size özel ihtiyaçlarınıza göre uyarlanmış profesyonel tavsiye ve çözümler sunabiliriz. İster küçük ölçekli bir proje ister büyük ölçekli bir kurumsal uygulamada çalışıyor olun, NIO'daki uzmanlığımız önemli bir fark yaratabilir.
Elektrikli otomobillerle de ilgileniyorsanız,Nio ET5 Elektrikli Araba.
Herhangi bir sorunuz varsa veya bir tedarik tartışması başlatmaya hazırsanız, bize ulaşmaktan çekinmeyin. Proje hedeflerinize ulaşmak için sizinle birlikte çalışmayı dört gözle bekliyoruz.
Referanslar
- Ron Hitchens tarafından "Java Nio"
- Nio'da Oracle Java belgeleri



























































