精华内容
下载资源
问答
  • java8 源码 nio java8 nio使用的总结 目录 1. NIO_NIO 与 IO 区别 NIO支持面向缓冲区的、基于通道的IO操作 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO...
  • java8 NIO FileChannel例

    2016-06-08 11:15:03
    package com.kd.nio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;...import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileChannelTe
    package com.kd.nio;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    
    public class FileChannelTest {
    	
    	@SuppressWarnings("resource")
    	public static void main(String[] args) throws Exception{
    		FileInputStream fileInputStream = new FileInputStream("f:"+ File.separator +"15000352101265508578.pdf");
    		FileOutputStream fileOutputStream = new FileOutputStream("f:" + File.separator + "test.pdf");
    		   FileChannel inChannel = fileInputStream.getChannel();
    		FileChannel outChannel= fileOutputStream.getChannel();
    
    		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
    
    		 
    		int read = inChannel.read(byteBuffer);
    		while(read!=-1){
    		
    		byteBuffer.flip();
    		outChannel.write(byteBuffer);
    		byteBuffer.clear();
    		read = inChannel.read(byteBuffer);
    		}
    		inChannel.close();
    		outChannel.close();
    	}
    
    }
    

    展开全文
  • nio服务端序列图】 一:nio服务器启动类 1 package com.yeepay.sxf.testnio; 2 /** 3 * nio创建的的timerServer服务器 4 * 5 * @author sxf ... 8 public class NIOTimerServer { 9 10...

    【nio服务端序列图】

    一:nio服务器启动类

     1 package com.yeepay.sxf.testnio;
     2 /**
     3  * nio创建的的timerServer服务器
     4  * 
     5  * @author sxf
     6  *
     7  */
     8 public class NIOTimerServer {
     9     
    10     /**
    11      * nio服务器启动的入口
    12      * @param args
    13      */
    14     public static void main(String[] args) {
    15         //启动服务器绑定的端口号
    16         int port=8000;
    17         //获取端口号
    18         if(args!=null && args.length>0){
    19             try {
    20                 port=Integer.valueOf(args[0]);
    21             } catch (Exception e) {
    22                 e.printStackTrace();
    23             }
    24         }
    25         
    26         //新建nio服务器类
    27         MultiplexerTimerServer timerServer=new MultiplexerTimerServer(port);
    28         
    29         //启动服务类的主线程
    30         new Thread(timerServer,"NIO-MultiplexerTimerServer-001").start();
    31     }
    32 }
    View Code

    二:nio服务器

      1 package com.yeepay.sxf.testnio;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.IOException;
      5 import java.net.InetSocketAddress;
      6 import java.nio.ByteBuffer;
      7 import java.nio.channels.SelectionKey;
      8 import java.nio.channels.Selector;
      9 import java.nio.channels.ServerSocketChannel;
     10 import java.nio.channels.SocketChannel;
     11 import java.util.Date;
     12 import java.util.Iterator;
     13 import java.util.Set;
     14 
     15 import com.sun.org.apache.xml.internal.utils.StopParseException;
     16 
     17 /**
     18  * nio的时间服务器
     19  * @author sxf
     20  *
     21  */
     22 public class MultiplexerTimerServer implements Runnable {
     23     
     24     //选择器
     25     private Selector selector;
     26 
     27     //
     28     private ServerSocketChannel serverSocketChannel;
     29     
     30     private volatile boolean stop;
     31     
     32     //启动服务
     33     public MultiplexerTimerServer(int port){
     34         try {
     35             //初始化多路复用器
     36             selector=Selector.open();
     37             //初始化socket通道
     38             serverSocketChannel=ServerSocketChannel.open();
     39             //设置通道为非阻塞模式
     40             serverSocketChannel.configureBlocking(false);
     41             //将该通道绑定地址和端口号
     42             serverSocketChannel.socket().bind(new InetSocketAddress(port), 1024);
     43             //将该通道注册到多路复用器,并注册链接请求事件
     44             serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
     45             System.out.println("The time server is start in port:"+port);
     46         } catch (Exception e) {
     47             // TODO: handle exception
     48             e.printStackTrace();
     49             System.exit(1);
     50         }
     51     }
     52     
     53     /**
     54      * 停止服务器
     55      */
     56     public void stop(){
     57         this.stop=true;
     58     }
     59     
     60     
     61     /**
     62      * 服务器运行主体
     63      */
     64     @Override
     65     public void run() {
     66         while(!stop){
     67             try {
     68                 System.out.println("MultiplexerTimerServer.run()");
     69                 //select()阻塞到至少有一个通道在你注册的事件上就绪了。
     70                 selector.select();
     71                 //获取注册在这个多路复用器上的已经就绪的通道的集合
     72                 Set<SelectionKey> selectionKeys=selector.selectedKeys();
     73                 //循环迭代已经就绪的通道集合
     74                 Iterator<SelectionKey> it=selectionKeys.iterator();
     75                 SelectionKey key=null;
     76                 while(it.hasNext()){
     77                     key=it.next();
     78                     //防止重复执行通道事件
     79                     it.remove();
     80                     //处理该通道上的事件
     81                     try {
     82                         handleInput(key);
     83                     } catch (Exception e) {
     84                         if(key!=null){
     85                             key.cancel();
     86                             if(key.channel()!=null){
     87                                 key.channel().close();
     88                             }
     89                         }
     90                     }
     91                 }
     92                 
     93             } catch (Exception e) {
     94                 e.printStackTrace();
     95             }
     96         
     97             
     98         }
     99     }
    100 
    101     
    102     /**
    103      * 处理请求的事件
    104      * @param key
    105      * @throws IOException
    106      */
    107     private void handleInput(SelectionKey key) throws IOException{
    108         if(key.isValid()){
    109             //处理新接入的请求消息
    110             if(key.isAcceptable()){
    111                 //请求链接事件就绪
    112                 ServerSocketChannel ssc=(ServerSocketChannel) key.channel();
    113                 SocketChannel  sc=ssc.accept();
    114                 sc.configureBlocking(false);
    115                 //在多路复用器上注册一个soketChannel,当有读事件则触发
    116                 sc.register(selector, SelectionKey.OP_READ);
    117             }
    118             
    119             if(key.isReadable()){
    120                 //读事件就绪
    121                 SocketChannel sc=(SocketChannel) key.channel();
    122                 //声明一个缓冲区
    123                 ByteBuffer readBuffer=ByteBuffer.allocate(1024);
    124                 //从通道里读取数据写入缓冲区
    125                 int readBytes=sc.read(readBuffer);
    126                 //readBytes>0:表示读到了字节,对字节进行编解码。
    127                 //readBytes=0:没有读取到字节,属于正常场景,忽略
    128                 //readBytes=-1;链路已经关闭,需要关闭socketChannel,释放资源
    129                 if(readBytes>0){
    130                     //将ByteBuffer的limit设置为position,position设置为0
    131                     readBuffer.flip();
    132                     //编解码数据
    133                     byte[] bytes=new byte[readBuffer.remaining()];
    134                     //将数据从缓冲区复制到数组里
    135                     readBuffer.get(bytes);
    136                     //翻译请求的内容
    137                     String body=new String(bytes,"UTF-8");
    138                     //打印请求的内容
    139                     System.out.println("the timerserver receive order:"+body);
    140                 
    141                     //处理请求内容
    142                     String currentTime=null;
    143                     if("shangxiaofei".equals(body)){
    144                         currentTime=new Date().toString();
    145                     }else{
    146                         currentTime="request param is error";
    147                     }
    148                     
    149                     //将处理的结果响应给客户端
    150                     doWrite(sc, currentTime);
    151                 }else if(readBytes<0){
    152                     //对链路进行关闭
    153                     key.cancel();
    154                     sc.close();
    155                 }else{
    156                     //忽略
    157                 }
    158             }
    159         }
    160     }
    161     
    162     /**
    163      * 响应请求的内容
    164      * @param channel
    165      * @param response
    166      * @throws IOException 
    167      */
    168     private void doWrite(SocketChannel channel,String response) throws IOException{
    169         if(response!=null&&response.trim().length()>0){
    170             //将响应的内容转化成byte[]
    171             byte[] bytes=response.getBytes();
    172             //声明缓冲区
    173             ByteBuffer writeBuffer=ByteBuffer.allocate(bytes.length);
    174             //将数据写入缓冲区
    175             writeBuffer.put(bytes);
    176             //修改ByteBuffer的imit设置为position,position设置为0
    177             writeBuffer.flip();
    178             //将数据从缓冲区写入通道
    179             channel.write(writeBuffer);
    180         }
    181     }
    182     
    183     
    184 }
    View Code

    【nio客户端序列图】

     

    三:nio服务器客户端启动类

     1 package com.yeepay.sxf.testnio;
     2 
     3 
     4 /**
     5  * 向TimerServer发送请求的客户端
     6  * @author sxf
     7  *
     8  */
     9 public class NIOTimerClient {
    10     
    11     public static void main(String[] args) {
    12         int port=8000;
    13         
    14         if(args!=null&&args.length>0){
    15             port=Integer.valueOf(args[0]);
    16         }
    17         new Thread(new TimerClientHandler("127.0.0.1", port),"TimeClient-001").start();
    18     }
    19 }
    View Code

    四:nio服务器的客户端

      1 package com.yeepay.sxf.testnio;
      2 
      3 import java.io.IOException;
      4 import java.net.InetSocketAddress;
      5 import java.nio.ByteBuffer;
      6 import java.nio.channels.SelectionKey;
      7 import java.nio.channels.Selector;
      8 import java.nio.channels.SocketChannel;
      9 import java.util.Iterator;
     10 import java.util.Set;
     11 
     12 /**
     13  * timerclient请求线程
     14  * @author sxf
     15  *
     16  */
     17 public class TimerClientHandler implements Runnable{
     18     //链接timer服务器的ip地址
     19     private String host;
     20     //链接timer服务器服务的端口号
     21     private int port;
     22     //多路复用器
     23     private Selector selector;
     24     //通道
     25     private SocketChannel socketChannel;
     26     //当前请求线程是否停止
     27     private volatile boolean stop;
     28     
     29     
     30     public TimerClientHandler(String host,int port) {
     31         this.host=host==null?"127.0.0.1":host;
     32         this.port=port;
     33         try {
     34             this.selector=Selector.open();
     35             this.socketChannel=SocketChannel.open();
     36             socketChannel.configureBlocking(false);
     37         } catch (Exception e) {
     38             e.printStackTrace();
     39             System.exit(1);
     40         }
     41     }
     42     
     43     /**
     44      * 链接时间服务器
     45      * @throws IOException 
     46      */
     47     private void doConnect() throws IOException{
     48         if(socketChannel.connect(new InetSocketAddress(host, port))){
     49             socketChannel.register(selector, SelectionKey.OP_READ);
     50             //doWrite(socketChannel);
     51         }else{
     52             socketChannel.register(selector, SelectionKey.OP_CONNECT);
     53         }
     54     }
     55     
     56     /**
     57      * 向时间服务器发送请求
     58      * @param sc
     59      * @throws IOException 
     60      */
     61     private void doWrite(SocketChannel sc) throws IOException{
     62         //发送请求的请求内容
     63         byte[] req="shangxiaofei".getBytes();
     64         //声明缓冲区
     65         ByteBuffer writeBuffer=ByteBuffer.allocate(req.length);
     66         //将请求体写入缓冲区
     67         writeBuffer.put(req);
     68         //设置limit
     69         writeBuffer.flip();
     70         //将缓冲区的内容写入通道
     71         sc.write(writeBuffer);
     72         if(!writeBuffer.hasRemaining()){
     73             System.out.println("send order to server success........");
     74         }
     75         
     76     }
     77     
     78     
     79     private void handleInput(SelectionKey key) throws IOException{
     80         if(key.isValid()){
     81             //判断链接是否成功
     82             SocketChannel sc=(SocketChannel) key.channel();
     83         
     84                 //链接事件就绪
     85                 if(sc.finishConnect()){
     86                     //是否链接完成
     87                     sc.register(selector, SelectionKey.OP_READ);
     88                     doWrite(sc);
     89                 }else{
     90                     //链接失败,进程退出
     91                     System.exit(1);
     92                 }
     93                 
     94                 if(key.isReadable()){
     95                     //读事件就绪
     96                     ByteBuffer readBuffer=ByteBuffer.allocate(1024);
     97                     int readBytes=sc.read(readBuffer);
     98                     if(readBytes>0){
     99                         readBuffer.flip();
    100                         byte[] bytes=new byte[readBuffer.remaining()];
    101                         readBuffer.get(bytes);
    102                         String body=new String(bytes,"UTF-8");
    103                         System.out.println("TimerServer response:"+body);
    104                         this.stop=true;
    105                     }else if(readBytes<0){
    106                         //对端链路关闭
    107                         key.cancel();
    108                         sc.close();
    109                     }else{
    110                         //读到0字节,忽略
    111                     }
    112                 }
    113             
    114         }
    115     }
    116     
    117     @Override
    118     public void run() {
    119         try {
    120             //链接并发送请求
    121             doConnect();
    122         } catch (Exception e) {
    123             // TODO: handle exception
    124             e.printStackTrace();
    125         }
    126         
    127         while(!stop){
    128             try {
    129                 //等待响应
    130                 selector.select();
    131                 //获取已经就绪的通道事件集合,在这个多路复用器上
    132                 Set<SelectionKey> selectedKeys=selector.selectedKeys();
    133                 //循环迭代处理事件集合
    134                 Iterator<SelectionKey> it=selectedKeys.iterator();
    135                 SelectionKey key=null;
    136                 while (it.hasNext()) {
    137                     key=it.next();
    138                     it.remove();
    139                     try {
    140                         handleInput(key);
    141                     } catch (Exception e) {
    142                         e.printStackTrace();
    143                     }
    144                     
    145                 }
    146             } catch (Exception e) {
    147                 e.printStackTrace();
    148             }
    149         }
    150         
    151         //多路复用器关闭后,所有注册在上面的channel和Pipe等资源都会被自动去注册并关闭
    152         //所以不需要重复释放资源
    153 //        if(selector!=null){
    154 //            try {
    155 //                selector.close();
    156 //            } catch (Exception e) {
    157 //                e.printStackTrace();
    158 //            }
    159 //        }
    160         
    161     }
    162     
    163 
    164 }
    View Code

     

    展开全文
  • <p>java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8] <h1>Need Support? <ul><li>Have a feature request for SDKs? Please post it on ...
  • java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer; at org.httpkit.client.HttpClient.doRead(HttpClient.java:186) at org.httpkit.client.HttpClient.run(HttpClient.java:494) ...
  • java.nio.charset.MalformedInputException: Input length = 1 at java.nio.charset.CoderResult.throwException(Unknown Source) 问题:txt文件格式不是utf-8 解决方法:打开txt文件-另存为 将编码格式修改为...

    报错信息:
    java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(Unknown Source)
    MalformedInputException

    问题:txt文件格式不是utf-8
    解决方法:打开txt文件-另存为 将编码格式修改为utf-8

    展开全文
  • JAVA】【NIO8Java NIO FileChannel

    千次阅读 2015-03-20 11:02:08
    Java NIO的FileChannel是连接文件的通道。通过文件通道,你可以从文件读数据,也可以将数据写到文件中。FileChannel类和标准Java IO API都是可用来读文件的。FileChannel不能被设置成非阻塞模式。它总是运行在阻塞...

    Java NIO的FileChannel是连接文件的通道。通过文件通道,你可以从文件读数据,也可以将数据写到文件中。FileChannel类和标准Java IO API都是可用来读文件的。

    FileChannel不能被设置成非阻塞模式。它总是运行在阻塞模式下。

    打开文件通道

    在你使用文件通道之前必须打开它。你不能直接打开文件通道。你需要通过InputStream,OutputStream或者RandomAccessFile来获取文件通道。如下:

    RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");
    FileChannel fromChannel = fromFile.getChannel();

    从文件通道读数据

    通过read方法,如下:

    ByteBuffer buffer = ByteBuffer.allocate(8);
    int bytesRead = channel.read(buffer);

    首先,分配一个Buffer,从FileChannel读取的数据会读到Buffer中。
    其次,调用read方法,将数据读进Buffer,方法返回的int说明有多少字节数据写进Buffer了。如果返回-1,说明文件读完了。

    向文件通道写数据

    通过write方法,如下:

    RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");
    FileChannel channel = fromFile.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(10);
    buffer.clear();
    buffer.put("Hello".getBytes());
    buffer.flip();
    while(buffer.hasRemaining()) {
        channel.write(buffer);
    }
    fromFile.close();

    注意write方法是在一个循环内被调用,不能保证有多少字节写到文件通道里了,所以我们重复调用write方法直到Buffer没有数据了。

    关闭文件通道

    channel.close();

    文件通道的position

    需要对文件通道的特定的位置读写,你可以通过调用position方法获取文件通道当前的位置。
    你也可以通过调用position(long pos)方法设定文件通道的position。如下:

    long pos = channel.position();
    channel.position(pos+2);

    如果你设置的position在文件末尾之后,从通道读数据会返回-1.
    同样如果是写,文件会增大,这可能导致文件空洞,磁盘上的物理文件中写入的数据之间有空隙。

    RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw");
            FileChannel channel = fromFile.getChannel();
            long fileSize = channel.size();
            System.out.println("====="+fileSize);
            long pos = channel.position();
            System.out.println("Current Position: " + pos);
            //重新设定位置
            channel.position(pos+3);//形成文件空洞
            ByteBuffer buffer = ByteBuffer.allocate(10);
            buffer.clear();
            buffer.put("a".getBytes());
            buffer.flip();
            while(buffer.hasRemaining()) {//写文件
                channel.write(buffer);
            }
            buffer.flip();
            int bytesRead = channel.read(buffer);//读文件
            while(bytesRead!=-1) {
                buffer.flip();
                while(buffer.hasRemaining()) {
                    System.out.print((char)buffer.get());
                }
                System.out.println();
                buffer.clear();
                bytesRead = channel.read(buffer);
            }
            channel.close();
            fromFile.close();

    这里写图片描述
    这里写图片描述
    这个图片中的20是空格,和上面的00不一样,本人是想试试这个空洞本质上不是空格。

    这里写图片描述
    这里写图片描述
    以上展示了文件空洞。

    文件通道size

    size方法返回FileChannel所关联的文件大小。如下:

    long fileSize = channel.size();

    channel.size和file.length返回的结果是一样的,都是文件的大小,字节数。

    文件通道的truncate

    截取文件。当你截取文件时,必须指定长度。如下:

    channel.truncate(10);

    这里写图片描述
    如果给定大小小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。如果给定大小大于等于该文件的当前大小,则不修改文件。无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。

    文件通道的force

    force方法会将channel里未写入磁盘的数据全部flush到磁盘。操作系统也许为了性能,会缓存数据在内存中,所以不能保证写入channel的数据一定会写到磁盘上,除非你调用forece方法。
    force方法有一个boolean类型的参数,表示是否将文件元数据(权限等)写到磁盘上。如下:

    channel.force(true);

    下一节:【JAVA】【NIO】9、Java NIO SocketChannel

    展开全文
  • 位于java8.nio.file下。 此库中没有捆绑默认实现,并且修改了 API 以允许动态安装提供程序。 在使用 API 之前,您需要使用FileSystemProvider.installDefaultProvider()设置默认提供程序实现。 可以随时使用...
  • Java NIO Buffer

    2016-03-12 13:02:00
    Java Nio1Java NIO Tutorial2Java NIO Overview3Java NIO Channel4Java NIO Buffer5Java NIO Scatter / Gather6Java NIO Channel to Channel Transfers7Java NIO Selector8Java NIO FileChannel9Java NIO SocketC...
  • 自 Java7 开始,Java 终于简化了文件读写的基本操作,新增了 java.nio.file 库,通过与 Java8 新增的 stream 结合可以使得文件操作变得更加优雅 1|0文件和目录路径 java.nio.file.Paths 类包含一个重载方法 ...
  • 23:07:05 java.lang.RuntimeException: Identical buffers not equal: java.nio.ByteBufferAsShortBufferB[pos=2 lim=5 cap=3584], java.nio.HeapShortBuffer[pos=2 lim=5 cap=3584] 23:07:...
  • 1 package com.slp.nio; 2 3 import org.junit.Test; 4 5 import java.io.IOException;... 6 import java.net.InetSocketAddress;... 7 import java.nio.ByteBuffer;... 8 import java.nio.channe...
  • 8 Java--NIO

    2019-08-07 15:58:17
    教程视频:NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多
  • at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:317) at DirectBufferAllocTest.lambda$main$0(DirectBufferAllocTest.java:126) at DirectBufferAllocTest$$Lambda$16.00000000F2D5FD80.call...
  • 文章目录io,nio和netty的关系iojava.nio(这么写百度比较容易搜到)netty ...nio是新东西么,是java8,java9才有的新特性么? 别傻了,jdk1.4就推出了nio,还不会用它? 要紧跟时代的步伐啊。 netty 基于nio的框架。
  • java/nio/channels/Selector/LotsOfChannels.java Jenkinsfile=openjdk_s390x_linux SDK_RESOURCE=nightly JDK_VERSION=8 JDK_IMPL=openj9 <p>Appears to be regression, passing on April 6th, ...
  • Java NIO Scatter / Gather

    2019-09-24 19:19:04
    Java Nio1Java NIO Tutorial2Java NIO Overview3Java NIO Channel4Java NIO Buffer5Java NIO Scatter / Gather6Java NIO Channel to Channel Transfers7Java NIO Selector8Java NIO FileChannel9Java NIO So...
  • Java NIO

    2013-10-15 14:48:46
    众所周知Mina是一个基于java NIO的网络框架,那么在了解Mina之前,需要先了解下java NIO。jdk1.4中引入了NIO的相关api,主要是针对解决一些高并发高吞吐的IO。API的类图如下(网上找的) [img]...
  • <p><em>Caused by: java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets at sun.mail.imap.protocol.IMAPProtocol.authplain(IMAPProtocol.java:715) at sun.mail.imap.IMAPStore.authenticate...
  • Installing rvm gem in 1 gemsetsUnhandled Java exception: java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer; java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/...
  • Java NIO FileChannel是一个连接文件的Channel。通过file channel,可以从文件中读取数据,也可以写入数据到文件。Java NIO的FileChannel是Java 标准IO的替代方案。 FileChannel不能设置为非阻塞模式,它一直运行在...
  • Java nio】 Blocking nio

    2017-03-05 15:04:00
    1 package com.slp.nio; 2 3 4 import org.junit.Test; ... 6 import java.io.File;... 7 import java.io.IOException;... 8 import java.net.InetSocketAddress; 9 import java.nio.ByteBuffer; 10 ...
  • Java的最后几个发行版本,即Java 7,Java 8和即将到来的Java 9,具有许多功能,这些功能使Java开发人员的生活更加轻松。 (我知道Java 9会使它变得更困难,但是只有在您采用新的范例时才可以。之后,它将变得更好)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,056
精华内容 1,622
关键字:

java8nio

java 订阅