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