代码改变世界

nio通道

2018-09-12 12:55  kill-9  阅读(164)  评论(0编辑  收藏  举报

nio通道的创建方式一:

通过IO流创建nio通道package edzy.nio;

 
 1 package edzy.nio;
 2 
 3 import org.junit.Test;
 4 
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.nio.ByteBuffer;
 9 import java.nio.MappedByteBuffer;
10 import java.nio.channels.FileChannel;
11 import java.nio.file.Paths;
12 import java.nio.file.StandardOpenOption;
13 
14 public class Channel {
15 
16     @Test
17     public void channel(){
18         FileInputStream fis = null;
19         FileOutputStream fos = null;
20         FileChannel in = null;
21         FileChannel out = null;
22 
23         try{
24             fis = new FileInputStream("./src/main/java/edzy/nio/s.jpg");
25             fos = new FileOutputStream("./src/main/java/edzy/nio/sb.jpg");
26             in = fis.getChannel();
27             out = fos.getChannel();
28 
29             ByteBuffer buf = ByteBuffer.allocate(1024);
30 
31             while (in.read(buf) !=-1){
32 
33                 buf.flip();
34                 out.write(buf);
35                 buf.clear();
36             }
37 
38 
39 
40         } catch (IOException e) {
41             e.printStackTrace();
42         }  finally {
43 
44             if (out != null){
45                 try {
46                     out.close();
47                 } catch (IOException e) {
48                     e.printStackTrace();
49                 }
50             }
51 
52             if (in != null){
53                 try {
54                     in.close();
55                 } catch (IOException e) {
56                     e.printStackTrace();
57                 }
58             }
59 
60             if (fos != null){
61                 try {
62                     fos.close();
63                 } catch (IOException e) {
64                     e.printStackTrace();
65                 }
66             }
67 
68             if (fis != null){
69                 try {
70                     fis.close();
71                 } catch (IOException e) {
72                     e.printStackTrace();
73                 }
74             }
75         }
76     }
77

 

nio通道的创建方式二:

内存映射文件

 1 package edzy.nio;
 2 
 3 import org.junit.Test;
 4 
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.nio.ByteBuffer;
 9 import java.nio.MappedByteBuffer;
10 import java.nio.channels.FileChannel;
11 import java.nio.file.Paths;
12 import java.nio.file.StandardOpenOption;
13 
14 public class Channel {
15 
16     @Test
17     public void channel(){
18 FileChannel in = null;
19     FileChannel out = null;
20     try {
21      //使用FileChannel的open方法创建通道
22         in = FileChannel.open(Paths.get("./src/main/java/edzy/nio/s.jpg"), StandardOpenOption.READ);
23         out = FileChannel.open(Paths.get("./src/main/java/edzy/nio/s3.jpg"),StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE);
24 
25         //内存映射文件
26         MappedByteBuffer mapIn = in.map(FileChannel.MapMode.READ_ONLY,0,in.size());
27         MappedByteBuffer mapOut = out.map(FileChannel.MapMode.READ_WRITE,0,in.size());
28 
29         byte[] dest = new byte[mapIn.limit()];
30         mapIn.get(dest);
31         mapOut.put(dest);
32 
33     } catch (IOException e) {
34         e.printStackTrace();
35     }finally {
36         if (in != null){
37             try {
38                 in.close();
39             } catch (IOException e) {
40                 e.printStackTrace();
41             }
42         }
43 
44         if (out != null){
45             try {
46                 out.close();
47             } catch (IOException e) {
48                 e.printStackTrace();
49             }
50         }
51     }
52 }
53 }