Java InputStream分配和非阻塞读取 公共类应用程序{ 抛出IOException中的公共静态void readSomeInputStream{ ByteArrayInputStream is=新建ByteArrayInputStreamin.readAllBytes; is.read;//非阻塞读取的数量可变 阅读; 阅读; in=is;//这不起任何作用 } 公共静态无效主字符串[]args引发IOException{ ByteArrayInputStream a=新的ByteArrayInputStream新字节[]{1,2,3,4,5,6}; App.readSomea; //某物 App.readSomea;//应该是4,5,6 } }

Java InputStream分配和非阻塞读取 公共类应用程序{ 抛出IOException中的公共静态void readSomeInputStream{ ByteArrayInputStream is=新建ByteArrayInputStreamin.readAllBytes; is.read;//非阻塞读取的数量可变 阅读; 阅读; in=is;//这不起任何作用 } 公共静态无效主字符串[]args引发IOException{ ByteArrayInputStream a=新的ByteArrayInputStream新字节[]{1,2,3,4,5,6}; App.readSomea; //某物 App.readSomea;//应该是4,5,6 } },java,inputstream,Java,Inputstream,是否可以更改readSome方法中的代码,使main能够读取所有值,而readSome完成非阻塞读取?您的代码尝试使用ByteArrayInputStream两次-这是不可能的。就这样 public class App { public static void readSome(InputStream source) throws IOException { byte[] bytes = source.readAllBytes(); // Reads (consumes)

是否可以更改readSome方法中的代码,使main能够读取所有值,而readSome完成非阻塞读取?

您的代码尝试使用ByteArrayInputStream两次-这是不可能的。就这样

public class App {
    public static void readSome(InputStream source) throws IOException {
        byte[] bytes = source.readAllBytes(); // Reads (consumes) all your bytes from the source
        ByteArrayInputStream is = new ByteArrayInputStream(bytes);

        is.read(); // variable number of non blocking reads
        is.read();
        is.read();
    }

    public static void main(String[] args) throws IOException {

        ByteArrayInputStream source = new ByteArrayInputStream(new byte[] { 1, 2, 3, 4, 5, 6 });
        // source full
        App.readSome(source);
        // source fully consumed - so source is empty now
        App.readSome(source); // cannot consume 4, 5, 6 - because source was already consumed.

    }
}

InputStream读取被阻塞。这里没有非阻塞读取。很难看出你期望任务能发挥什么魔力。不清楚你在问什么。@marqueisoflorne-as-per-read不会阻止。当然,但是消耗整个流来填充ByteArrayInputStream的行为不会让其他任何人后续读取任何内容:而且赋值仍然不做任何事情,Java具有传递值语义。很难看出这里的实际目标是什么。例如,您可以只传递实际的字节数组。可能是XY问题。只需将public static void readSomeInputStream抛出IOException{is.read;is.read;is.read;},然后,第一个调用将读取值1、2和3,而下一个调用可以读取剩余的值4、5、6…