Java NIO - Canal de Arquivos
Descrição
Como já mencionado, a implementação de FileChannel do canal Java NIO é introduzida para acessar propriedades de metadados do arquivo, incluindo criação, modificação, tamanho etc. Junto com isso, os canais de arquivo são multiencadeados, o que novamente torna o Java NIO mais eficiente do que o Java IO.
Em geral, podemos dizer que FileChannel é um canal conectado a um arquivo pelo qual você pode ler dados de um arquivo e gravar dados em um arquivo. Outra característica importante de FileChannel é que ele não pode ser configurado no modo sem bloqueio e sempre é executado no modo de bloqueio.
Não podemos obter o objeto do canal de arquivo diretamente, o objeto do canal de arquivo é obtido por
getChannel() - método em qualquer FileInputStream, FileOutputStream ou RandomAccessFile.
open() - método do canal de arquivo que, por padrão, abre o canal.
O tipo de objeto do canal File depende do tipo de classe chamada a partir da criação do objeto, ou seja, se o objeto é criado chamando o método getchannel de FileInputStream, o canal File é aberto para leitura e lançará NonWritableChannelException no caso de tentativa de gravação.
Exemplo
O exemplo a seguir mostra como ler e gravar dados do Java NIO FileChannel.
O exemplo a seguir lê de um arquivo de texto de C:/Test/temp.txt e imprime o conteúdo no console.
temp.txt
Hello World!
FileChannelDemo.java
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.Set;
public class FileChannelDemo {
public static void main(String args[]) throws IOException {
//append the content to existing file
writeFileChannel(ByteBuffer.wrap("Welcome to TutorialsPoint".getBytes()));
//read the file
readFileChannel();
}
public static void readFileChannel() throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile("C:/Test/temp.txt",
"rw");
FileChannel fileChannel = randomAccessFile.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
Charset charset = Charset.forName("US-ASCII");
while (fileChannel.read(byteBuffer) > 0) {
byteBuffer.rewind();
System.out.print(charset.decode(byteBuffer));
byteBuffer.flip();
}
fileChannel.close();
randomAccessFile.close();
}
public static void writeFileChannel(ByteBuffer byteBuffer)throws IOException {
Set<StandardOpenOption> options = new HashSet<>();
options.add(StandardOpenOption.CREATE);
options.add(StandardOpenOption.APPEND);
Path path = Paths.get("C:/Test/temp.txt");
FileChannel fileChannel = FileChannel.open(path, options);
fileChannel.write(byteBuffer);
fileChannel.close();
}
}
Resultado
Hello World! Welcome to TutorialsPoint