限定使用Socket通信,内存4G去传输10G的文本。并且读取过程需要换行,应该如何实现? 5C

题目描述:
限定使用socket通信来完成。需要实现的功能是:客户端读取10G的文本
文件以"换行啦啦啦"作为换行符、将文件中的内容、按行发送给服务端。服务端接收数据后、将文本文件保存在服务端所在电脑的磁盘上。合理使用线程!!

3个回答

    public static void main(String[] args) throws IOException {
        //监听端口
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //切换非阻塞
        serverSocketChannel.configureBlocking(false);
        //绑定端口
        serverSocketChannel.bind(new InetSocketAddress("localhost",9696));
        //注册选择器
        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        FileChannel outChannel = FileChannel.open(Paths.get("你的文件"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
        while (selector.select() > 0){
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectionKeys.iterator();
            while(iterator.hasNext()){
                SelectionKey selectionKey = iterator.next();
                if(selectionKey.isAcceptable()){
                    SocketChannel client = serverSocketChannel.accept();
                    client.configureBlocking(false);
                    client.register(selector, SelectionKey.OP_READ);
                }else if(selectionKey.isReadable()){
                    SocketChannel client = (SocketChannel) selectionKey.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    while (client.read(buffer) > 0){
                        buffer.flip();
                        //byte[] bytes = new byte[buffer.limit()];
                        //buffer.get(bytes);
                        outChannel.write(buffer);
                    }
                }
                iterator.remove();
            }
        }
    }

换行符自个替换

qq_41054313
Dan淡淡的心 回复qq_39197347: 换行 遍历byte数组 将值为10的替换成你说的那个"换行啦啦啦"就可以了
10 个月之前 回复
weixin_39606236
꧁gaoKuo꧂ 目录啊,比如 C:a//b//c//d.txt
10 个月之前 回复
qq_39197347
qq_39197347 outChannel.write写出的位置怎么看呢?还有不太明白在哪换行
10 个月之前 回复

这样替换换行符就可以了

public static byte[] replaceNewline(byte[] b) throws IOException{
        byte[] line = "换行啦啦啦".getBytes();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        for(int i=0;i<b.length;i++) {
            if(b[i]==10) {
                os.write(line);
            }else {
                os.write(b[i]);
            }
        }
        return os.toByteArray();
    }
qq_41054313
Dan淡淡的心 回复qq_39197347: 思路没啥问题 你先了解一下ByteBuffer的读写模式吧 put是增加的方法
10 个月之前 回复
qq_39197347
qq_39197347 回复Dan淡淡的心: 我的想法是这样的,将缓冲区的数据先用get方法提出来,放到一个BYTE数组里之后进行遍历,可是我用put方法再还回去然后write数据。。完成不了,我感觉我这个思路好像问题挺大的
10 个月之前 回复
qq_41054313
Dan淡淡的心 回复qq_39197347: 上面那位是NIO啦 可能稍微难以理解一点
10 个月之前 回复
qq_41054313
Dan淡淡的心 在服务端实现的话 在服务端读取数据时 将byte替换后 写入文件即可(只需要在客户端或者服务端替换一次)
10 个月之前 回复
qq_41054313
Dan淡淡的心 回复qq_39197347: 上传前实现换行的话 就在写入流之前把byte数组换掉就可以了
10 个月之前 回复
qq_39197347
qq_39197347 ....emmmm实在没想明白你这段代码怎么引入,可不可以详细给我讲一下呀
10 个月之前 回复
qq_39197347
qq_39197347 嗯。。。我现在知道怎么用NIO完成那个上传的功能了,但是还是不太明白这段换行怎么实现。
10 个月之前 回复
qq_39197347
qq_39197347 我不太明白这段代码具体怎么用。。。我只学过普通的IO流。。上面那位那段代码,我只知道那段WRITE是写出的路径,但是文件读取的READ我不知道该怎么读诶,就是连个读文件的路径都没有
10 个月之前 回复

首先,10G大文件的发送,需要考虑多线程。
其次,大文件需要考虑切分成多个完整的块文件,然后服务器端存储的时候可以存多个文件。
GitChat 上介绍 Java 多线程解析大文件的文章:https://gitbook.cn/gitchat/activity/5cac60e33bc6823cd6c9900f
有需要可以参考看看。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问