Dec 01, 2025

Hur utför man asynkron fil I/O i Java NIO?

Lämna ett meddelande

Hej där! Som NIO-leverantör har jag ett och annat att dela med mig av om att utföra asynkron fil-I/O i Java NIO. Det är ett ganska häftigt ämne, och jag är sugen på att gå igenom det.

Först och främst, låt oss prata om varför asynkron fil-I/O är en så stor sak. I traditionella I/O-operationer blockeras tråden tills operationen är klar. Det betyder att den inte kan göra något annat under tiden, vilket kan vara ett rejält drag, speciellt när man hanterar stora filer eller flera I/O-operationer. Asynkron I/O, å andra sidan, tillåter tråden att fortsätta göra andra uppgifter medan I/O-operationen pågår. Det är som att ha en hjälpare som tar hand om det tråkiga samtidigt som man fokuserar på det viktiga.

Så, hur utför vi asynkron fil I/O i Java NIO? Jo, Java NIO (New I/O) tillhandahåller en uppsättning klasser och gränssnitt som gör det relativt enkelt att arbeta med asynkron I/O. En av nyckelklasserna ärAsynchronousFileChannel. Denna klass låter dig utföra asynkrona läs- och skrivoperationer på filer.

Låt oss börja med ett enkelt exempel på att läsa en fil asynkront. Här är lite kod för att komma igång:

importera java.nio.ByteBuffer; importera java.nio.channels.AsynchronousFileChannel; importera java.nio.file.Path; importera java.nio.file.Paths; importera java.nio.file.StandardOpenOption; importera java.util.concurrent.Future; public class AsyncFileReadExample { public static void main(String[] args) { try { Path path = Paths.get("test.txt"); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sökväg, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024); Framtida<heltal>-resultat = fileChannel.read(buffert, 0); while (!result.isDone()) { // Gör andra uppgifter medan läsoperationen pågår System.out.println("Gör andra uppgifter..."); } int bytesRead = result.get(); System.out.println("Bytes lästa: " + bytesRead); buffer.flip(); byte[] data = ny byte[buffer.limit()]; buffer.get(data); System.out.println(ny sträng(data)); fileChannel.close(); } catch (Undantag e) { e.printStackTrace(); } } }

I det här exemplet öppnar vi först enAsynchronousFileChannelför läsning. Sedan tilldelar vi enByteBufferför att hålla data vi ska läsa. Vi använderläsametod förAsynchronousFileChannelför att starta läsoperationen asynkront. Denna metod returnerar enFramtidaobjekt, som representerar resultatet av den asynkrona operationen.

Vi kan användaär klarmetod förFramtidaobjekt för att kontrollera om operationen är klar. Även om operationen inte är klar kan vi göra andra uppgifter. När operationen är klar använder vimetod förFramtidaobjekt för att få antalet lästa byte.

Låt oss nu prata om att skriva en fil asynkront. Här är ett exempel:

importera java.nio.ByteBuffer; importera java.nio.channels.AsynchronousFileChannel; importera java.nio.file.Path; importera java.nio.file.Paths; importera java.nio.file.StandardOpenOption; importera java.util.concurrent.Future; public class AsyncFileWriteExample { public static void main(String[] args) { try { Path path = Paths.get("output.txt"); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sökväg, StandardOpenOption.WRITE, StandardOpenOption.CREATE); String data = "Hej världen!"; ByteBuffer buffer = ByteBuffer.wrap(data.getBytes()); Framtida<Heltal> resultat = fileChannel.write(buffert, 0); while (!result.isDone()) { // Gör andra uppgifter medan skrivoperationen pågår System.out.println("Gör andra uppgifter..."); } int bytesWritten = result.get(); System.out.println("Bytes skrivna: " + bytesWritten); fileChannel.close(); } catch (Undantag e) { e.printStackTrace(); } } }

Processen liknar att läsa en fil asynkront. Vi öppnar enAsynchronousFileChannelför att skriva, tilldela enByteBuffermed de data vi vill skriva, och användskrivametod förAsynchronousFileChannelför att starta skrivoperationen asynkront.

Ett annat sätt att hantera asynkron I/O i Java NIO är att använda en kompletteringshanterare. En färdigställandehanterare är ett objekt som får ett meddelande när den asynkrona operationen är klar. Här är ett exempel på hur man använder en kompletteringshanterare för att läsa en fil asynkront:

importera java.nio.ByteBuffer; importera java.nio.channels.AsynchronousFileChannel; importera java.nio.channels.CompletionHandler; importera java.nio.file.Path; importera java.nio.file.Paths; importera java.nio.file.StandardOpenOption; public class AsyncFileReadWithCompletionHandler { public static void main(String[] args) { try { Path path = Paths.get("test.txt"); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sökväg, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024); fileChannel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() { @Override public void completed(Integer result, ByteBuffer attachment) { System.out.println("Bytes läst: " + resultat); attachment.flip(); byte[] data = new byte(attach data); attachment.get data()); System.out.println(new String(data)); try { fileChannel.close();} catch (Undantag e) {e.printStackTrace(); // Gör andra uppgifter medan läsoperationen pågår System.out.println("Gör andra uppgifter..."); } catch (Undantag e) { e.printStackTrace(); } } }

I det här exemplet passerar vi aCompletionHandlerinvända motläsametod förAsynchronousFileChannel. Deavslutadmetod förCompletionHandleranropas när läsoperationen lyckas, ochmisslyckadesmetoden anropas om operationen misslyckas.

Nio ET5 specificationsNio ET5 price details

Som NIO-leverantör letar vi alltid efter sätt att optimera prestanda och effektivitet. Asynkron fil I/O i Java NIO är ett utmärkt verktyg för att uppnå dessa mål. Det kan avsevärt förbättra din applikations lyhördhet, särskilt när du hanterar I/O-intensiva uppgifter.

Om du är på marknaden för en högpresterande elbil, kolla inNio ET5 elbil. Det är ett elegant och kraftfullt fordon som kombinerar banbrytande teknik med en snygg design.

Om du är intresserad av att lära dig mer om Java NIO eller har några frågor om våra produkter och tjänster, tveka inte att höra av dig. Vi tar alltid gärna en pratstund och ser hur vi kan hjälpa dig med dina behov. Oavsett om du vill optimera din applikations I/O-prestanda eller behöver råd om den senaste Java-tekniken så finns vi här för dig. Så låt oss sätta igång bollen och starta ett samtal om hur vi kan arbeta tillsammans.

Referenser:

  • Java NIO självstudier
  • Oracle Java-dokumentation på AsynchronousFileChannel
Skicka förfrågan