τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Περιγράφει τις βασικές γνώσεις του NIO σε επίπεδο ava, για βασική αναθεώρηση
Στην Java, το NIO (Non-blocking I/O or New I/O) είναι ένα νέο σύνολο API λειτουργίας εισόδου/εξόδου που εισήχθη στην Java SE 1.4 και σε επόμενες εκδόσεις.
Σε σύγκριση με το παραδοσιακό μοντέλο IO, παρέχει υψηλότερη απόδοση και καλύτερες δυνατότητες ταυτόχρονης επεξεργασίας. Το βασικό χαρακτηριστικό του NIO είναι η δυνατότητα μη αποκλεισμού, η οποία επιτρέπει σε ένα νήμα να διαχειρίζεται πολλαπλά κανάλια I/O, βελτιώνοντας έτσι σημαντικά την απόδοση της εφαρμογής σε σενάρια υψηλού συγχρονισμού.
Το σενάριο χρήσης του Java NIO είναι ιδιαίτερα κατάλληλο για περιπτώσεις όπου απαιτείται επεξεργασία μεγάλου αριθμού ταυτόχρονων συνδέσεων, για παράδειγμα, σε έναν διακομιστή δικτύου, ένα νήμα μπορεί να διαχειριστεί χιλιάδες συνδέσεις πελάτη χωρίς να χρειάζεται να εκχωρηθεί ένα ανεξάρτητο νήμα για κάθε σύνδεση. Μπορεί να μειώσει σημαντικά την κατανάλωση πόρων του συστήματος και να βελτιώσει τις δυνατότητες επεξεργασίας
Το κανάλι είναι το μέσο ροής δεδομένων στο Java NIO Είναι αμφίδρομο και μπορεί να χρησιμοποιηθεί για την ανάγνωση δεδομένων ή την εγγραφή δεδομένων. Το κύριο πλεονέκτημα των καναλιών είναι ότι δεν αποκλείονται, πράγμα που σημαίνει ότι ένα νήμα μπορεί να διαχειριστεί πολλά κανάλια Όταν δεν συμβαίνουν συμβάντα σε ένα κανάλι, το νήμα δεν θα αποκλειστεί και μπορεί να χειριστεί άλλες εργασίες. Οι κύριοι τύποι καναλιών περιλαμβάνουν:
FileChannel
: Χρησιμοποιείται για λειτουργίες ανάγνωσης και εγγραφής αρχείων. Μπορεί να χρησιμοποιηθεί για την εγγραφή δεδομένων από το buffer στο αρχείο ή για την ανάγνωση δεδομένων από το αρχείο στο buffer.SocketChannel
: Χρησιμοποιείται για συνδέσεις TCP σε επικοινωνίες δικτύου και μπορεί να χρησιμοποιηθεί για ανάγνωση και εγγραφή δεδομένων.ServerSocketChannel
: Χρησιμοποιείται για την αποδοχή νέων συνδέσεων SocketChannel, παρόμοια με το παραδοσιακό ServerSocket.DatagramChannel
: Χρησιμοποιείται για επικοινωνία UDP, η οποία μπορεί να στείλει και να λάβει datagrams.Το buffer είναι ένα αντικείμενο που χρησιμοποιείται για την αποθήκευση δεδομένων στο NIO Είναι ένας πίνακας byte που μπορεί να γράψει δεδομένα και να διαβάσει δεδομένα από αυτό. Ένα buffer έχει μια συγκεκριμένη χωρητικότητα και έχει δύο σημαντικές ιδιότητες: θέση και όριο.
Οι κύριοι τύποι buffer είναιByteBuffer
、CharBuffer
、ShortBuffer
、IntBuffer
、LongBuffer
、FloatBuffer
καιDoubleBuffer
, κάθε τύπος αντιστοιχεί σε έναν πρωτόγονο τύπο δεδομένων.
Ένας επιλογέας είναι ένας πολυπλέκτης στο NIO που επιτρέπει σε ένα νήμα να παρακολουθεί συμβάντα από πολλά κανάλια, όπως ανάγνωση, εγγραφή, σύνδεση και λήψη συμβάντων. Ο επιλογέας ειδοποιεί την εφαρμογή όταν ένα από τα κανάλια είναι έτοιμο για λειτουργίες I/O. Η χρήση επιλογέων βελτιώνει σημαντικά τις δυνατότητες επεξεργασίας ταυτόχρονης χρήσης των εφαρμογών δικτύου επειδή δεν χρειάζεται να δημιουργηθεί ένα νήμα για κάθε σύνδεση.
Οι κύριες μέθοδοι επιλογής περιλαμβάνουν:
select()
: Αποκλείεται έως ότου τουλάχιστον ένα κανάλι είναι έτοιμο για λειτουργίες I/O.selectedKeys()
: Επιστρέφει ένα σύνολο που περιέχει τα αντικείμενα SelectionKey όλων των προετοιμασμένων καναλιών.wakeup()
: Η διακοπή μπλοκαρίστηκεselect()
ΜΕΤΑΦΟΡΑ.SelectionKey
Είναι η συσχέτιση μεταξύ επιλογέων και καναλιών Αντιπροσωπεύει την κατάσταση εγγραφής ενός καναλιού στον επιλογέα, συμπεριλαμβανομένων των καναλιών, των επιλογέων, των συλλογών ενδιαφερομένων συμβάντων και των έτοιμων συλλογών συμβάντων.
Αυτό είναι το πιο παραδοσιακό μοντέλο I/O Στην Java, τα παραδοσιακά API Socket και ServerSocket βασίζονται στον αποκλεισμό I/O. Σε αυτήν τη λειτουργία, όταν ένα νήμα ξεκινά μια λειτουργία ανάγνωσης ή εγγραφής, το νήμα μπλοκάρεται μέχρι να ολοκληρωθεί η λειτουργία I/O. Εάν δεν υπάρχουν δεδομένα προς ανάγνωση για τη λειτουργία ανάγνωσης ή η λειτουργία εγγραφής δεν μπορεί να ολοκληρωθεί αμέσως, το νήμα θα περιμένει μέχρι να ολοκληρωθεί η λειτουργία.
Χαρακτηριστικά:
Το μη αποκλειστικό I/O είναι μέρος του πλαισίου Java NIO (New I/O), το οποίο επιτρέπει στα νήματα να ξεκινούν λειτουργίες ανάγνωσης και εγγραφής χωρίς αποκλεισμό. Εάν δεν υπάρχουν δεδομένα προς ανάγνωση για μια λειτουργία ανάγνωσης ή η λειτουργία εγγραφής δεν μπορεί να ολοκληρωθεί αμέσως, το νήμα δεν θα τεθεί σε αναστολή και μπορεί να συνεχίσει να εκτελεί άλλες εργασίες.
Χαρακτηριστικά:
Η πολυπλεξία είναι η παρακολούθηση πολλών περιγραφέων αρχείων ταυτόχρονα μέσω ενός νήματος και λειτουργεί μόνο σε έναν περιγραφέα όταν είναι έτοιμος (συνήθως σημαίνει ότι τα δεδομένα είναι αναγνώσιμα ή η προσωρινή μνήμη εγγραφής είναι εγγράψιμο). Οι επιλογείς χρησιμοποιούνται στην Java για την υλοποίηση της πολυπλεξίας.
Χαρακτηριστικά:
Ειδοποίηση:
Σε πρακτικές εφαρμογές, η μη αποκλειστική I/O χρησιμοποιείται συχνά σε συνδυασμό με την πολυπλεξία. Για παράδειγμα, ένας διακομιστής μπορεί να χρησιμοποιήσει έναν Επιλογέα για την παρακολούθηση πολλών SocketChannel Όταν ένα SocketChannel έχει δεδομένα που μπορούν να διαβαστούν ή να γραφτούν, ο Επιλογέας θα ειδοποιήσει τον διακομιστή και ο διακομιστής θα επεξεργαστεί αυτό το συγκεκριμένο SocketChannel με μη αποκλειστικό τρόπο.
Στην Java, το Stream και το Channel είναι δύο διαφορετικοί τρόποι επεξεργασίας ροών δεδομένων. Ανήκουν στην τυπική βιβλιοθήκη IO της Java και στη βιβλιοθήκη NIO αντίστοιχα. Ακολουθεί μια λεπτομερής σύγκριση των δύο εννοιών:
Το Stream είναι μέρος του τυπικού μοντέλου IO (blocking IO) της Java, το οποίο παρέχει έναν τρόπο διαδοχικής ανάγνωσης και εγγραφής δεδομένων. Το Stream χωρίζεται σε δύο τύπους: InputStream και OutputStream, που χρησιμοποιούνται για την ανάγνωση και εγγραφή δεδομένων αντίστοιχα.Αυτές οι ροές μπορεί να είναι ροές byte (όπως πInputStream
, OutputStream
) ή μια ροή χαρακτήρων (όπωςReader
, Writer
)。
Χαρακτηριστικά:
close()
μέθοδος απελευθέρωσης πόρων.Ξεκινώντας από την Java 7, η δήλωση try-with-resources μπορεί να κλείσει αυτόματα την υλοποίησηAutoCloseable
Πόροι διεπαφής, συμπεριλαμβανομένης της ροής. Το κανάλι είναι μέρος του μοντέλου Java NIO (New IO), το οποίο παρέχει υψηλότερο επίπεδο αφαίρεσης από το Stream, επιτρέποντας πιο αποτελεσματική επεξεργασία δεδομένων. Τα κανάλια μπορεί να είναι αμφίδρομα, που σημαίνει ότι μπορούν να χρησιμοποιηθούν για ανάγνωση και εγγραφή δεδομένων.Οι κύριοι τύποι καναλιών περιλαμβάνουνFileChannel
、SocketChannel
、ServerSocketChannel
καιDatagramChannel
。
Χαρακτηριστικά:
Συνοψίζω
Στην Java, τα μοντέλα λειτουργίας I/O μπορούν να ταξινομηθούν με βάση τις δύο διαστάσεις σύγχρονη/ασύγχρονη και αποκλειστική/μη αποκλειστική.
ορισμός : Ο σύγχρονος αποκλεισμός I/O είναι το πιο παραδοσιακό μοντέλο I/O Όταν ένα νήμα καλεί μια λειτουργία I/O (όπως ανάγνωση ή εγγραφή), το νήμα θα αποκλειστεί μέχρι να ολοκληρωθεί η λειτουργία. Αυτό σημαίνει ότι το νήμα δεν μπορεί να εκτελέσει άλλες εργασίες μέχρι να ολοκληρωθεί η λειτουργία.
Χαρακτηριστικά:
InputStream
、OutputStream
、Socket
καιServerSocket
σκηνή.Παράδειγμα:
Χρησιμοποιήστε το παραδοσιακόInputStream
καιOutputStream
Για να διαβάσετε και να γράψετε αρχεία:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SyncBlockingIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ορισμός : Σε σύγχρονες I/O χωρίς αποκλεισμό, το νήμα δεν θα αποκλειστεί μετά την κλήση της λειτουργίας I/O. Εάν η λειτουργία δεν μπορεί να ολοκληρωθεί αμέσως, η μέθοδος θα επιστρέψει αμέσως, συνήθως επιστρέφοντας μια ειδική τιμή (όπως -1 ή 0) ή ρίχνοντας μια εξαίρεση για να υποδείξει ότι η λειτουργία δεν έχει ολοκληρωθεί.
Χαρακτηριστικά:
Channels
καιBuffers
, καλώνταςconfigureBlocking(false)
Ρυθμίστε το κανάλι σε λειτουργία μη αποκλεισμού.Παράδειγμα:
Χρησιμοποιώντας το NIOFileChannel
Για μη αποκλεισμό ανάγνωσης και γραφής:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
public class SyncNonBlockingIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
inChannel.configureBlocking(false);
while (inChannel.read(buffer) > 0) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ορισμός: Χρήση μοντέλου σύγχρονης πολυπλεξίας I/OSelector
(επιλογέας) για παρακολούθηση πολλαπλώνChannel
Εκδήλωση.Όταν καλεί το νήμαSelector.select()
, θα μπλοκάρει μέχρι να υπάρξει τουλάχιστον έναChannel
Προκύπτουν συμβάντα (όπως αναγνώσιμο, εγγράψιμο, αίτημα σύνδεσης κ.λπ.).
Χαρακτηριστικά:
Channel
, βελτιώνει τη συγχρονικότητα.Selector
καιSelectionKey
Μηχανισμός που μπορεί να χειριστεί αποτελεσματικά μεγάλο αριθμό ταυτόχρονων συνδέσεων.Παράδειγμα:
Χρησιμοποιώντας το NIOFileChannel
Για μη αποκλεισμό ανάγνωσης και γραφής:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Set;
public class SyncMultiplexingIOExample {
public static void main(String[] args) throws IOException {
try (Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() > 0) {
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = ssc.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
}
}
keys.clear();
}
}
}
}
}
ορισμός : Στο ασύγχρονο μοντέλο I/O χωρίς αποκλεισμό, το νήμα επιστρέφει αμέσως μετά την έναρξη της λειτουργίας I/O χωρίς να περιμένει να ολοκληρωθεί η λειτουργία. Όταν ολοκληρωθεί η λειτουργία, το νήμα θα ειδοποιηθεί ασύγχρονα μέσω μιας λειτουργίας επανάκλησης ή μιας ειδοποίησης συμβάντος.
Χαρακτηριστικά:
AsynchronousChannel
Η διεπαφή και η υλοποίηση της υποκατηγορίας της, όπως π.χAsynchronousFileChannel
καιAsynchronousSocketChannel
。Παράδειγμα:
Χρησιμοποιώντας το NIOAsynchronousFileChannel
Εκτελέστε ασύγχρονη ανάγνωση και εγγραφή αρχείων:
import java.io.IOException;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
public class AsyncNonBlockingIOExample {
public static void main(String[] args) throws IOException, InterruptedException {
AsynchronousFileChannel inChannel = AsynchronousFileChannel.open(Paths.get("input.txt"), StandardOpenOption.READ);
AsynchronousFileChannel outChannel = AsynchronousFileChannel.open(Paths.get("output.txt"), StandardOpenOption.WRITE);
ByteBuffer buffer = ByteBuffer.allocate(1024);
CountDownLatch latch = new CountDownLatch(1);
inChannel.read(buffer, 0, buffer, 0, (channel, result) -> {
buffer.flip();
outChannel.write(buffer, 0, buffer, 0, null);
latch.countDown();
});
latch.await();
inChannel.close();
outChannel.close();
}
}
Σημείωση: Το ασύγχρονο μοντέλο απαιτεί υποστήριξη από το υποκείμενο λειτουργικό σύστημα (Kernel)
ορισμός : Θεωρητικά, αυτό το μοντέλο δεν υπάρχει, γιατί "ασύγχρονο" σημαίνει ότι η λειτουργία εκτελείται στο παρασκήνιο και το νήμα δεν είναι μπλοκαρισμένο. Επομένως, ο ασύγχρονος αποκλεισμός εισόδου/εξόδου είναι μια αντιφατική έννοια και δεν θα εμφανιστεί στην πράξη.
Η επιλογή του κατάλληλου μοντέλου εισόδου/εξόδου είναι κρίσιμη για τη διαχείριση απόδοσης και πόρων. Σε σενάρια υψηλής συγχρονισμού, τα μοντέλα σύγχρονων I/O χωρίς αποκλεισμό ή σύγχρονης πολυπλεξίας I/O είναι κοινές επιλογές Σε σενάρια που απαιτούν εξαιρετική απόδοση και ταχύτητα απόκρισης, το μοντέλο ασύγχρονης I/O χωρίς αποκλεισμό είναι η πρώτη επιλογή.
Έννοια μηδενικού αντιγράφου
Η τεχνολογία μηδενικού αντιγράφου σημαίνει ότι κατά τη διαδικασία μετάδοσης δεδομένων από το ένα μέρος στο άλλο, τα δεδομένα δεν χρειάζεται να αντιγραφούν μεταξύ του χώρου χρήστη και του χώρου πυρήνα, ή τουλάχιστον μειώνει τον αριθμό τέτοιων αντιγράφων, βελτιώνοντας έτσι την απόδοση του συστήματος. Στις παραδοσιακές λειτουργίες I/O, όταν τα δεδομένα διαβάζονται από το δίκτυο ή τον δίσκο, πρώτα αντιγράφονται στην προσωρινή μνήμη στο χώρο του πυρήνα και στη συνέχεια αντιγράφονται από το χώρο του πυρήνα στην προσωρινή μνήμη στο χώρο χρήστη. Αντίθετα, σε μηδενικό αντίγραφο, τα δεδομένα μπορούν να υποβληθούν σε επεξεργασία απευθείας στον χώρο του πυρήνα ή να μεταφερθούν απευθείας από τον χώρο του πυρήνα στη συσκευή δικτύου, μειώνοντας έτσι τη λειτουργία αντιγραφής της CPU, μειώνοντας την επιβάρυνση του συστήματος και βελτιώνοντας την αποτελεσματικότητα της μετάδοσης δεδομένων.
Πηγή μηδενικού αντιγράφου
Η έννοια του μηδενικού αντιγράφου εμφανίστηκε για πρώτη φορά στο σχεδιασμό του λειτουργικού συστήματος, με στόχο να λύσει το στενό σημείο απόδοσης που προκαλείται από την αντιγραφή δεδομένων σε παραδοσιακές λειτουργίες I/O. Στα πρώιμα συστήματα υπολογιστών, όλες οι λειτουργίες εισόδου/εξόδου απαιτούσαν πολλαπλά αντίγραφα δεδομένων στο χώρο του χρήστη και στον πυρήνα.
Βασικά τεχνικά σημεία
Υλοποίηση σε Java:
Η Java υποστηρίζει τεχνολογία μηδενικής αντιγραφής μέσω του πλαισίου NIO (New I/O). εισήγαγε το NIOFileChannel
καιSocketChannel
και άλλες κλάσεις, οι οποίες παρέχουν πιο αποτελεσματικές λειτουργίες I/O. ΕΙΔΙΚΑ,FileChannel.transferTo()
καιFileChannel.transferFrom()
Οι μέθοδοι μπορούν να μεταφέρουν δεδομένα απευθείας από ένα κανάλι αρχείου σε ένα κανάλι υποδοχής ή αντίστροφα χωρίς να φορτώνουν τα δεδομένα σε ένα buffer, επιτυγχάνοντας έτσι μηδενικό αντίγραφο.
Για παράδειγμα, ας υποθέσουμε ότι πρέπει να στείλετε τα περιεχόμενα ενός μεγάλου αρχείου στο δίκτυο Η παραδοσιακή προσέγγιση είναι να διαβάσετε πρώτα τα περιεχόμενα του αρχείου σε ένα buffer και μετά να γράψετε τα περιεχόμενα του buffer στο δίκτυο. Αυτό περιλαμβάνει δύο λειτουργίες αντιγραφής: μία από το δίσκο στο buffer και μία άλλη από την προσωρινή μνήμη στο δίκτυο.κατά τη χρήσηtransferTo()
Κατά τη χρήση αυτής της μεθόδου, τα δεδομένα μπορούν να μεταφερθούν απευθείας από το δίσκο στο δίκτυο χωρίς την ανάγκη ενδιάμεσου buffer, που μειώνει τον αριθμό των αντιγράφων και επιτυγχάνει μηδενικό αντίγραφο.
Ένα παράδειγμα που χρησιμοποιεί το ByteBuffer:
ByteBuffer
και άλλεςBuffer
τάξη (όπωςCharBuffer
,ShortBuffer
κ.λπ.) παρέχουν buffer που μπορούν να γεμίσουν ή να αδειάσουν χωρίς να εμπλέκεται άμεσα ένα αντίγραφο μεταξύ του χώρου χρήστη και του χώρου του πυρήνα.ByteBuffer
Μπορεί να χρησιμοποιηθεί άμεσα ή έμμεσα στην τεχνολογία μηδενικής αντιγραφής:
ByteBuffer.allocateDirect(size)
ΔημιουργήθηκεByteBuffer
Τα στιγμιότυπα αντιστοιχίζονται απευθείας στη φυσική μνήμη, παρακάμπτοντας το σωρό Java.Όταν ένα τέτοιο buffer συγκρίνεται μεFileChannel
ήSocketChannel
Όταν χρησιμοποιούνται μαζί, τα δεδομένα μπορούν να μεταφερθούν απευθείας μεταξύ φυσικής μνήμης και συσκευών υλικού χωρίς την ανάγκη πρόσθετων αντιγράφων μέσω του σωρού Java. Αυτό επιτρέπει την πραγματική μηδενική αντιγραφή σε ορισμένες πλατφόρμες.FileChannel
τουtransferTo()
καιtransferFrom()
: Αυτές οι μέθοδοι επιτρέπουν την απευθείας αποθήκευση δεδομένωνFileChannel
καιSocketChannel
μεταδίδεται μεταξύByteBuffer
ως ενδιάμεσος. Αυτό σημαίνει ότι τα δεδομένα μπορούν να μεταφερθούν απευθείας από το δίσκο στο δίκτυο ή το αντίστροφο χωρίς να χρειάζεται να αντιγραφούν μεταξύ του χώρου χρήστη και του χώρου του πυρήνα.ByteBuffer
τουwrap()
μέθοδος:wrap()
Η μέθοδος σάς επιτρέπει να τυλίξετε έναν υπάρχοντα πίνακα byte ή άλλο buffer σε έναByteBuffer
, επομένως δεν χρειάζεται να αντιγράψετε τα δεδομένα σε νέο buffer. Αυτό είναι χρήσιμο για την αποφυγή περιττής αντιγραφής δεδομένων.ByteBuffer
τουslice()
μέθοδος:slice()
Η μέθοδος δημιουργεί μια προβολή του buffer χωρίς να αντιγράφει τα υποκείμενα δεδομένα.Αυτό σημαίνει ότι ένα μεγάλοByteBuffer
Διαχωρισμός σε πολλά μικρότερα buffer χωρίς αντιγραφή δεδομένων.Συνδυάστε το ByteBuffer με το FileChannel:
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class ZeroCopyExample {
public static void main(String[] args) {
Path path = Path.of("example.txt");
try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
long transferred = fileChannel.transferTo(0, fileChannel.size(), System.out);
System.out.println("Transferred bytes: " + transferred);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ειδοποίηση:
Θα πρέπει να σημειώσουμε ότι στην πραγματικότητα, δεν υπάρχει πλήρες μηδενικό αντίγραφο Το μηδενικό αντίγραφο που αναφέρεται εδώ είναι μόνο για την ίδια την εφαρμογή μας, η οποία δεν έχει αντίγραφο σε επίπεδο χρήστη. Αλλά ακόμη και σε επίπεδο χρήστη, είναι αδύνατο να μην υπάρχουν καθόλου λειτουργίες αντιγραφής, αλλά να μειωθούν όσο το δυνατόν περισσότερο τα αντίγραφα, επομένως, μπορούμε να καταλάβουμε ότι ο όρος μηδενικό αντίγραφο αναφέρεται στην τεχνολογία μείωσης του αριθμού των αντιγράφων δεδομένων. και δεν σημαίνει ότι δεν υπάρχει λειτουργία αληθινής αντιγραφής.