我正在使用ProcessBuilder在Java中构建一个进程,如下所示:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Run Code Online (Sandbox Code Playgroud)
现在我的问题如下:我想捕获通过该进程的stdout和/或stderr的任何内容,并将其重定向到System.out异步.我希望进程及其输出重定向在后台运行.到目前为止,我发现这样做的唯一方法是手动生成一个新的线程,该线程将连续读取stdOut,然后调用适当的write()方法System.out.
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
Run Code Online (Sandbox Code Playgroud)
虽然这种方法很有效,但感觉有点脏.最重要的是,它为我提供了一个正确管理和终止的线程.有没有更好的方法来做到这一点?
嗨,我是新手Java,我想知道在控制台中读取用户输入的最佳选择是什么,据我所知,有3种方法可以做到:
Console console = System.console();BufferedReader input = new BufferedReader(new InputStreamReader(System.in));Scanner reader = new Scanner(System.in);我应该选择哪一个?为什么那个而不是其他的?
我是Java的新手,正在阅读非常大的文件,需要一些帮助来理解问题并解决它.我们有一些遗留代码必须进行优化才能使其正常运行.文件大小只能从10mb到10gb不等.只有文件启动超过800mb大小时才会启动麻烦.
InputStream inFileReader = channelSFtp.get(path); // file reading from ssh.
byte[] localbuffer = new byte[2048];
ByteArrayOutputStream bArrStream = new ByteArrayOutputStream();
int i = 0;
while (-1 != (i = inFileReader.read(buffer))) {
bArrStream.write(localbuffer, 0, i);
}
byte[] data = bArrStream.toByteArray();
inFileReader.close();
bos.close();
Run Code Online (Sandbox Code Playgroud)
我们收到了错误
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激?
我一直试图理解Scanner的工作方式,一直绞尽脑汁.所以这是代码:
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String p = sc.nextLine();
System.out.println(s);
System.out.println(p);
System.out.println(sc.hasNextLine());
Run Code Online (Sandbox Code Playgroud)
我期待的是:
Love is good <- press ENTER
Love is blind <- press ENTER
Love is good <- output
Love is blind <- output
false
Run Code Online (Sandbox Code Playgroud)
我有什么:
Love is good <- I press ENTER
Love is blind <- I press ENTER
Love is good <- output
Love is blind <- output
<- press ENTER
true <- output
Run Code Online (Sandbox Code Playgroud)
我不明白的是:
我使用InputStream读取一些数据,所以我想读取字符直到新行或'\n'.
有没有人碰巧知道下面两种读取输入文件的方法之间的性能是否存在差异?谢谢.
1)使用扫描仪和文件读取文件
Scanner input = new Scanner(new File("foo.txt"));
Run Code Online (Sandbox Code Playgroud)
2)使用InputStreamReader和FileInputStream读取文件
InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt"));
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释我的类之间的区别BufferedReader,FileReader以及Scanner?当我想阅读文本文件时使用哪一个?
我理解Scanner的优点,以及何时使用Scanner和BufferedReader.我读了一个不同的,但在一些类似的问题扫描仪与BufferedReader
当我从输入中读取时,为什么Scanner这么慢? 我认为它与扫描仪中有一个小缓冲区有关,但在这里我迷路了.最初的问题来自 Codechef,但我对该解决方案不感兴趣.
这是一个给定输入的代码示例:输入:
和代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int numberOfLines = Integer.parseInt(s[0]);
int divideNumber = Integer.parseInt(s[1]);
int count = 0;
for (int i = 0; i < numberOfLines; i++) {
String number = br.readLine();
if (number.length() < 11) {
int num = Integer.parseInt(number);
if …Run Code Online (Sandbox Code Playgroud) 我正在输入一个巨大的数字并将每行数字添加到字符串"hold"中.一旦没有什么可读的,它应该退出while循环并将字符串转换为BigInteger.
它将贯穿循环直到没有任何东西剩下没有任何反应.它不会继续BigInteger或再次进入循环.我到处都看,无法弄清楚为什么会卡住.
System.out.print("Enter the number you want looked at: ");
String hold = "";
String line = null;
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
while ((line = read.readLine()) != null){
hold = hold.concat(line);
}
BigInteger giantNumber = new BigInteger(hold);
System.out.print(giantNumber);
Run Code Online (Sandbox Code Playgroud)
我希望它退出循环而不需要用户再做任何事情然后在开头输入数字.
它似乎卡住了,因为System.in正在寻找更多输入,并且没有在while循环中接收任何可比较的内容.我不知道该怎么做.
我输入的号码是,如果有帮助:
73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 7163626956188267042825248360082 3257530420752963450
对于日志处理,我的应用程序需要逐行读取文本文件.首先我使用了BufferedReader的readLine()函数,但我在网上读到BufferedReader在读取文件时速度很慢.
之后我尝试将FileInputStream与FileChannel和MappedByteBuffer一起使用,但在这种情况下,没有类似于readLine()的函数,所以我在文本中搜索换行符并处理它:
try {
FileInputStream f = new FileInputStream(file);
FileChannel ch = f.getChannel( );
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
byte[] bytes = new byte[1024];
int i = 0;
while (mb.hasRemaining()) {
byte get = mb.get();
if(get == '\n') {
if(ra.run(new String(bytes)))
cnt++;
for(int j = 0; j<=i; j++)
bytes[j] = 0;
i = 0;
}
else
bytes[i++] = get;
}
} catch(Exception ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是实现它的好方法,但是当我以字节为单位读取文本文件时,它比使用BufferedReader快3倍,但是调用new String(bytes)会创建一个新的String并使程序在使用BufferedReader时更慢.
所以我想问一下逐行读取文本文件的最快方法是什么?有人说BufferedReader是解决这个问题的唯一方法.
PS:ra是dk.brics.Automaton库中RunAutomaton的一个实例.
java ×10
file-io ×2
arrays ×1
bytearray ×1
exit ×1
file ×1
filereader ×1
input ×1
inputstream ×1
java-io ×1
loops ×1
readline ×1
text-files ×1
while-loop ×1