Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跳过字节Java NIO SocketChannel_Java_Sockets_Nio - Fatal编程技术网

跳过字节Java NIO SocketChannel

跳过字节Java NIO SocketChannel,java,sockets,nio,Java,Sockets,Nio,假设SocketChannel正在等待读取。 我不想读取前K个字节(如中所示,我不想将它们复制到字节缓冲区,只需跳过它们) 有这样做的必要吗?没有可用的skip()方法。我不确定这是否是您想要实现的,或者它是否可以按您想要的方式工作,但您可以从中获得一个套接字,然后是一个InputStream 由于您希望跳过字节,因此使用I/O流似乎是最好的解决方案 SocketChannel sock = SocketChannel.open(); sock.connect(new InetS

假设SocketChannel正在等待读取。 我不想读取前K个字节(如中所示,我不想将它们复制到字节缓冲区,只需跳过它们)


有这样做的必要吗?没有可用的skip()方法。

我不确定这是否是您想要实现的,或者它是否可以按您想要的方式工作,但您可以从中获得一个
套接字,然后是一个
InputStream

由于您希望跳过字节,因此使用I/O流似乎是最好的解决方案

    SocketChannel sock = SocketChannel.open();
    sock.connect(new InetSocketAddress("your addres or something", 80));

    InputStream ins = sock.socket().getInputStream();

    //Skip here
    ins.skip(5);
编辑 不,您不能重用您在输入流中使用的内容

顺便问一下,你能更准确地回答“分配”问题吗?您可以通过管道传输InputStream,那么为什么说必须分配缓冲区呢?最后的目标是什么

编辑2 有一个示例不需要分配K字节

        ins.skip(1);

        ArrayList<Byte> bts = new ArrayList<>();

        int last = 0;
        while (last != -1) {
            last = in.read();
            bts.add((byte)last);
        }
        System.out.println(bts.stream().map(b -> new String(new byte[]{b.byteValue()})).collect(Collectors.joining()));
ins.skip(1);
ArrayList bts=新的ArrayList();
int last=0;
while(最后一个!=-1){
last=in.read();
添加((字节)最后一个);
}
System.out.println(bts.stream();

此问题假设操作系统甚至公开了一个从套接字丢弃数据的操作。我从未听说过这样的TCP调用,尽管我相信recv每个数据报只返回一次,即使提供的缓冲区太小,无法容纳整个数据包。例如,如果传递了套接字,则lseek错误:顺便说一句,您在这里所做的是一个明显的过早优化的示例。没有这样的方法。这没有帮助,因为它仍然以这种大小分配缓冲区。我想避免K大小分配您有任何理由相信这不会将数据复制到流中吗?我不知道有任何操作系统调用允许您直接从套接字中丢弃TCP数据。@matansab:然后实现您自己的java.io.InputStream.read(byte[],int,int),而不使用缓冲区allocation@JIV如何从操作系统获取字节(或者告诉操作系统以某种方式丢弃它们),而不将它们复制到缓冲区?我不知道有任何系统调用允许TCP这样做。好吧,那么他想要一个魔术棒?要在操作系统级别执行此操作,他应该编写一个本机实现或其他东西。。。正当