Java NIO - ช่องไฟล์
คำอธิบาย
ดังที่ได้กล่าวไปแล้วการใช้งาน FileChannel ของ Java NIO channel ถูกนำมาใช้เพื่อเข้าถึงคุณสมบัติข้อมูลเมตาของไฟล์รวมถึงการสร้างการปรับเปลี่ยนขนาดและอื่น ๆ นอกจากนี้ File Channels ยังมีมัลติเธรดซึ่งทำให้ Java NIO มีประสิทธิภาพมากกว่า Java IO อีกครั้ง
โดยทั่วไปเราสามารถพูดได้ว่า FileChannel เป็นช่องทางที่เชื่อมต่อกับไฟล์ที่คุณสามารถอ่านข้อมูลจากไฟล์และเขียนข้อมูลลงในไฟล์ได้ลักษณะสำคัญอื่น ๆ ของ FileChannel คือไม่สามารถตั้งค่าเป็นโหมดไม่ปิดกั้นได้ และทำงานในโหมดบล็อกเสมอ
เราไม่สามารถรับวัตถุช่องไฟล์ได้โดยตรงวัตถุของช่องไฟล์จะได้รับโดย -
getChannel() - วิธีการใด ๆ บน FileInputStream, FileOutputStream หรือ RandomAccessFile
open() - วิธีการของ File channel ซึ่งโดยค่าเริ่มต้นจะเปิดช่อง
ประเภทอ็อบเจ็กต์ของ File channel ขึ้นอยู่กับประเภทของคลาสที่เรียกจากการสร้างอ็อบเจ็กต์เช่นถ้าอ็อบเจ็กต์ถูกสร้างโดยเรียกเมธอด getchannel ของ FileInputStream จากนั้น File channel จะเปิดขึ้นสำหรับการอ่านและจะโยน NonWritableChannelException ในกรณีที่พยายามเขียนไป
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการอ่านและเขียนข้อมูลจาก Java NIO FileChannel
ตัวอย่างต่อไปนี้อ่านจากไฟล์ข้อความจาก C:/Test/temp.txt และพิมพ์เนื้อหาไปยังคอนโซล
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();
}
}
เอาต์พุต
Hello World! Welcome to TutorialsPoint