devstory

Le Tutoriel de Java ScatteringByteChannel

  1. ScatteringByteChannel
  2. Methods
  3. read(ByteBuffer[])
  4. read(ByteBuffer[], int, int)
  5. Example 1

1. ScatteringByteChannel

Si vous êtes débutant avec Java NIO, il est utile de lire tout d'abord les articles suivants pour acquérir connaissances de bases:
  • Java Nio
Comme vous le savez, ReadableByteChannel est une interface qui fournit une méthode pour lire les bytes et les affecter aux éléments d'un ByteBuffer. ScatteringByteChannel est une extension de ReadableByteChannel qui fournit des méthodes de diffusion de lecture. Dans un seul appel, les bytes lus seront affectés aux éléments de plusieurs ByteBuffer(s).
public interface ScatteringByteChannel extends ReadableByteChannel
ScatteringByteChannel channel = ...; // (ScatteringByteChannel)Channels.newChannel(fileIS);
ByteBuffer[] buffers = new ByteBuffer[]{buf1, buf2, buf3};
channel.read(buffers);
La hiérarchie des interfaces et des classes relatives à ScatteringByteChannel :

2. Methods

Les méthodes sont définies dans l'interface ScatteringByteChannel:
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException;
    
public long read(ByteBuffer[] dsts) throws IOException;
Les méthodes héritées de l'interface ReadableByteChannel :
public int read(ByteBuffer dst) throws IOException;
Les méthodes héritées de l'interface Channel:
public boolean isOpen();  
public void close() throws IOException;

3. read(ByteBuffer[])

public long read(ByteBuffer[] dsts) throws IOException;
Lire une séquence de bytes à partir de ce ScatteringByteChannel et l'affecte aux éléments du ou des ByteBuffer(s) donnés. La méthode renvoie le nombre de bytes lus, ou renvoie -1 si la fin du canal est atteinte.
Convoquer cette méthode est l'équivalent de :
scatteringByteChannel.write(dsts, 0, dsts.length);
Une seule opération de lecture sur le Channel peut avoir lieu à la fois. Cela signifie que si un thread lance une opération de lecture sur un Channel, les autres threads ne peuvent pas lire sur ce Channel, ils sont bloqués jusqu'à ce que l'opération soit terminée. D'autres opérations d'IO peuvent être effectuées en même temps que l'opération de lecture en fonction du type de Channel.

4. read(ByteBuffer[], int, int)

public long read(ByteBuffer[] dsts, int offset, int length) throws IOException;
Lit une séquence de bytes à partir de ce ScatteringByteChannel et l'affecte aux éléments du ou des ByteBuffer(s) donnés. La méthode renvoie le nombre de bytes lus, ou renvoie -1 si la fin du canal est atteinte.
Convoquer cette méthode est l'équivalent de :
ByteBuffer[] dsts2 = new ByteBuffer[] {dsts[offset], dsts[offset+1], .., dsts[offset+length-1]};  

scatteringByteChannel.read(dsts2);
Une seule opération de lecture sur le Channel peut avoir lieu à la fois. Cela signifie que si un thread lance une opération de lecture sur un Channel, les autres threads ne peuvent pas lire sur ce Channel, ils sont bloqués jusqu'à ce que l'opération soit terminée. D'autres opérations d'IO peuvent être effectuées en même temps que l'opération de lecture en fonction du type de Channel.

5. Example 1

Exemple : Utiliser ScatteringByteChannelpour lire un fichier :
test-file.txt
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ScatteringByteChannel_ex1.java
package org.o7planning.scatteringbytechannel.ex;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ScatteringByteChannel;

public class ScatteringByteChannel_ex1 {

    // Windows: C:/somepath/test-file.txt
    private static final String filePath = "/Volumes/Data/test/test-file.txt";

    public static void main(String[] args) throws IOException {
        try (FileInputStream fis = new FileInputStream(filePath);
                ScatteringByteChannel channel = (ScatteringByteChannel) Channels.newChannel(fis);) {

            ByteBuffer buf1 = ByteBuffer.allocate(10);
            ByteBuffer buf2 = ByteBuffer.allocate(15);
            ByteBuffer buf3 = ByteBuffer.allocate(10);

            ByteBuffer[] buffers = new ByteBuffer[] { buf1, buf2, buf3 };

            channel.read(buffers);

            for (int i = 0; i < buffers.length; i++) {
                System.out.println(" --- buffer[" + i + "] ---");
                ByteBuffer buffer = buffers[i];
                // Set limit = current position; position = 0;
                buffer.flip();
                while (buffer.hasRemaining()) {
                    byte b = buffer.get();
                    int charCode = Byte.toUnsignedInt(b);
                    System.out.println((char) charCode + " --> " + charCode);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Output:
--- buffer[0] ---
a --> 97
b --> 98
c --> 99
d --> 100
e --> 101
f --> 102
g --> 103
h --> 104
i --> 105
j --> 106
 --- buffer[1] ---
k --> 107
l --> 108
m --> 109
n --> 110
o --> 111
p --> 112
q --> 113
r --> 114
s --> 115
t --> 116
u --> 117
v --> 118
w --> 119
x --> 120
y --> 121
 --- buffer[2] ---
z --> 122
A --> 65
B --> 66
C --> 67
D --> 68
E --> 69
F --> 70
G --> 71
H --> 72
I --> 73