从 BufferedReader 读取特定 Duration

所以,我正在从 BufferedReader 中阅读。一切都很好,直到我添加一个条件。我需要从 BufferedReader 读取特定的持续时间。


这就是我现在正在做的事情。


while ((line = br.readLine()) != null

                    && System.currentTimeMillis() - start < maxReadTime.toMillis()) { 

    // doingSomethingHere()

}

问题: InputStream 即使在时间过去后仍处于活动状态。例如 - maxReadTime 是 30 秒。输入在 20 秒内不断出现。在接下来的 12 秒内,没有任何活动。现在,当下一个输入到达时,流打开并仅在读取输入后关闭。但是,我不处理此输入,因为 while 循环终止。


我的预期或我需要的是:Stream 将在 30 秒后关闭。也就是说,当输入到达第 32 秒时,流被关闭并且不监听任何输入。


我对 ExecutorService 知之甚少。我不确定这是否是正确的方法。


白衣非少年
浏览 168回答 2
2回答

慕侠2389804

只需在从流中读取之前设置您的计时器条件while ((line = br.readLine()) != null) {&nbsp; &nbsp; boolean active = System.currentTimeMillis() - start < maxReadTime.toMillis();&nbsp; &nbsp; if (!active) {&nbsp; &nbsp; &nbsp; &nbsp; br.close();&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; // doingSomethingHere()}在这种情况下,如果第一个条件是false(时间已到),则根本不会执行第二个条件

DIEA

readLine()基本上,您必须在调用方法之前检查缓冲区是否准备就绪ready(),InputStream检查available()方法返回您可以在没有阻塞的情况下读取多少字节。这里有一个例子import java.io.*;import java.time.Duration;public class Main {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; final InputStream in =&nbsp; System.in; //new FileInputStream(new File("/tmp/x"));&nbsp; &nbsp; &nbsp; &nbsp; final String out = readInput(in, Duration.ofSeconds(5));&nbsp; &nbsp; &nbsp; &nbsp; System.out.printf("m=main, status=complete, out=%s%n", out);&nbsp; &nbsp; }&nbsp; &nbsp; public static String readInput(InputStream in, Duration duration) {&nbsp; &nbsp; &nbsp; &nbsp; final long timestamp = System.currentTimeMillis();&nbsp; &nbsp; &nbsp; &nbsp; final BufferedReader reader = new BufferedReader(new InputStreamReader(in));&nbsp; &nbsp; &nbsp; &nbsp; final StringBuilder out = new StringBuilder();&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String line = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (true){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(Duration.ofMillis(System.currentTimeMillis() - timestamp).compareTo(duration) >=0 ){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=timeout");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!reader.ready()){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=not ready");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line = reader.readLine();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(line == null){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=null line");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.append(line);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.append('\n');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.printf("m=readInput status=read, line=%s%n" , line);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toString();&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException(e);&nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=complete");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; static void sleep(int millis) {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(millis);&nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException e) {}&nbsp; &nbsp; }}如果您想在后台执行此操作,可以按照此示例进行操作package com.mageddo;import java.io.*;import java.util.concurrent.*;public class Main {public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {&nbsp; &nbsp; &nbsp; &nbsp; final InputStream in =&nbsp; System.in; //new FileInputStream(new File("/tmp/x"));&nbsp; &nbsp; &nbsp; &nbsp; final StringBuilder out = new StringBuilder();&nbsp; &nbsp; &nbsp; &nbsp; final ExecutorService executor = Executors.newFixedThreadPool(1);&nbsp; &nbsp; &nbsp; &nbsp; final Future<String> promise = executor.submit(() -> readInput(in, out));&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final String result = promise.get(5, TimeUnit.SECONDS);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.printf("m=main, status=success, result=%s%n", result);&nbsp; &nbsp; &nbsp; &nbsp; } catch (TimeoutException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=main, status=timeout");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in.close();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; promise.cancel(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Failed output: " + promise.get());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executor.shutdown();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=main, status=shutdown, out=" + out);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public static String readInput(InputStream in, StringBuilder out) {&nbsp; &nbsp; &nbsp; &nbsp; final BufferedReader reader = new BufferedReader(new InputStreamReader(in));&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String line = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (true){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(Thread.currentThread().isInterrupted()){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput status=interrupt signal");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!reader.ready()){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=not ready");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line = reader.readLine();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(line == null){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=null line");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.append(line);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.append('\n');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.printf("m=readInput status=read, line=%s%n" , line);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toString();&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException(e);&nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m=readInput, status=complete");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; static void sleep(int millis) {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(millis);&nbsp; &nbsp; &nbsp; &nbsp; } catch (InterruptedException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.currentThread().interrupt();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java