public class TestNio { public static void main(String[] args) throws IOException { testSlice(); } //fileChannel读文件 public static void testFileChannel() throws IOException { // fileChannel RandomAccessFile aFile = new RandomAccessFile(new File("d:\\aa.txt"), "rw"); FileChannel channel = aFile.getChannel(); // 缓冲区 ByteBuffer buf = ByteBuffer.allocate(1024); // 读数据进缓冲区 int bytesRead = channel.read(buf); while (bytesRead != -1) { System.out.println("file长度:" + bytesRead); buf.flip(); while (buf.hasRemaining()) { System.out.println((char) buf.get()); } buf.clear(); bytesRead = channel.read(buf); } aFile.close(); System.out.println("end"); } //切片 改变子缓冲区内容 public static void testSlice() throws IOException { // fileChannel RandomAccessFile aFile = new RandomAccessFile(new File("d:\\aa.txt"), "rw"); FileChannel channel = aFile.getChannel(); // 缓冲区 ByteBuffer buf = ByteBuffer.allocate(9); // 读数据进缓冲区 channel.read(buf); buf.position(3); buf.limit(7); ByteBuffer slice = buf.slice(); //改变子缓冲区内容。 for (int i = 0; i < slice.capacity(); i++) { byte b = slice.get(i); b *= 2; slice.put(i, b); } buf.position(0); buf.limit(buf.capacity()); while (buf.remaining() > 0) { System.err.println(buf.get()); } } //intBuffer public static void testIntBuffer() { IntBuffer buffer = IntBuffer.allocate(1024); buffer.put(new int[]{1, 2, 3}); buffer.flip(); while (buffer.hasRemaining()) { System.err.println(buffer.get()); } } //fileChannel写文件 public static void writeFileChannel() throws IOException { RandomAccessFile rw = new RandomAccessFile("d:\\fx.txt", "rw"); FileChannel channel = rw.getChannel(); ByteBuffer buf = ByteBuffer.allocate(1024); buf.put("你说过不闪躲,你非要这么做。".getBytes(StandardCharsets.UTF_8)); buf.flip(); while (buf.hasRemaining()) { channel.write(buf); } channel.close(); } //fileChannel通道之间传输 public static void testFileChannelTransfer() throws IOException { RandomAccessFile aFile = new RandomAccessFile("d:\\aa.txt", "rw"); FileChannel channelFrom = aFile.getChannel(); RandomAccessFile bFile = new RandomAccessFile("d:\\fx.txt", "rw"); FileChannel channelTo = bFile.getChannel(); //from 的内容传输到 channelTo channelTo.transferFrom(channelFrom, 0, channelFrom.size()); aFile.close(); bFile.close(); } }
原生JAVA-nio FileChannel Demo 改变子缓冲区内容
最新推荐文章于 2022-06-10 19:27:05 发布