简识JavaINO(二)

1、字符缓存

     * 字符缓存
     */
    @Test

    public void test8(){
        // 分配缓存
        CharBuffer charBuffer = CharBuffer.allocate(1024);
        charBuffer.put("哈尔滨北京上海");
        // 使恢复到起始位置可读取
        charBuffer.flip();

//        for (int i=0;i<charBuffer.limit();i++){
//            System.out.print(charBuffer.get());
//        }

//        System.out.println(charBuffer.toString());
//        char[] dst = new char[charBuffer.limit()];
//        charBuffer.get(dst);
//        System.out.print(new String(dst));
        System.out.println(new String(charBuffer.array(),0,charBuffer.limit())); // 0-1024个字节全部转换为字符数组打印到控制台上

    }

2、字符缓存的编码和解码

/**
     * 编解码
     */
    @Test

    public void test9(){

        // 分配缓存
        CharBuffer buffer = CharBuffer.allocate(1024);
        buffer.put("哈尔滨北京上海");
        // 使恢复到起始位置可读取
        buffer.flip();

        //编码  字符转换为字节

        Charset charset = Charset.forName("utf-8");
        ByteBuffer byteBuffer = charset.encode(buffer);
        // 混乱的字节码
//        for(int i=0;i<byteBuffer.limit();i++){
//
//            System.out.println((char) byteBuffer.get());
//
//        }
        // 解码

        Charset charset1 = Charset.forName("utf-8");
        CharBuffer charBuffer = charset1.decode(byteBuffer);
        System.out.println(new String(charBuffer.array(),0,charBuffer.limit()));

    }

3、网络通讯(阻塞式)代码实现


package edu.xalead;

import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class TestNet {
    /**
     * 客户端
     */
    @Test
    public void test1() throws Exception {
//        Socket s = new Socket("127.0.0.1", 8888);
//        SocketChannel socketChannel = s.getChannel();
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8888));
        FileChannel fileChannel = FileChannel.open(Paths.get("3.jpg"), StandardOpenOption.READ);
        // 分配缓存
        ByteBuffer buf = ByteBuffer.allocate(1024);

        // 从文件读字节到缓存

        while (fileChannel.read(buf)!=-1){
            buf.flip();
            socketChannel.write(buf);
            buf.clear();
        }
        // 关闭通道
        fileChannel.close();
        socketChannel.close();
    }
    SocketChannel socketChannel = null;
    /**
     * 服务端
     */
    @Test
    public void test2() throws Exception {

//        ServerSocket serverSocket = new ServerSocket(8888);
//        ServerSocketChannel channel = serverSocket.getChannel();

        // 创建通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //绑定端口
        serverSocketChannel.bind(new InetSocketAddress(8888));
        while (true) {
            //监听并获得通道
            socketChannel = serverSocketChannel.accept();
            new Thread() {
                public void run() {
                    try {
                        FileChannel fileChannel = null;
                        //创建缓存
                        ByteBuffer buffer = ByteBuffer.allocate(1024);

                        //创建文件通道
                        fileChannel = FileChannel.open(Paths.get("7.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);

                        //读网络数据到缓存
                        while (socketChannel.read(buffer) != -1) {
                            buffer.flip();
                            fileChannel.write(buffer);
                            buffer.clear();
                        }
                        fileChannel.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }.start();

        }
    }
    //关闭
//        serverSocketChannel.close();

}

具体实现,敲代码仔细斟酌。代码差不多都有注释,仅供参考!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值