Я пытаюсь прочитать вывод процесса (webtorrent-cli, работающего на NodeJS), который был создан моим приложением. Я использую эту библиотеку для управления процессами. API позволяет передавать OutputStream
, который будет получать выходные данные процесса. Я передаю экземпляр ByteArrayOutputStream
, читаю его содержимое как UTF-8 String
каждые n секунд и затем обрабатываю его дальше. Вот упрощенный код:
import org.zeroturnaround.exec.ProcessExecutor;
import org.zeroturnaround.exec.ProcessResult;
import java.io.*;
import java.util.concurrent.*;
public class General {
private static Thread runProcess() {
final Object LOCK = new Object();
return new Thread(() -> {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ProcessExecutor executor = new ProcessExecutor()
.command("\"node/webtorrent.cmd\"",
"download",
"\"magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel\"",
"--select 1")
.destroyOnExit()
.redirectOutput(baos)
.readOutput(true);
Future <ProcessResult> ft = executor.start().getFuture();
// Schedule a service to print the content of baos each second
final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(() -> {
synchronized (LOCK) {
try {
String str = baos.toString("UTF-8");
System.out.println("-----------------------------------------------------------------------");
System.out.println(str);
System.out.println("-------TRIMMED");
System.out.println(str.trim());
System.out.println("-----------------------------------------------------------------------");
baos.reset();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}, 0, 1, TimeUnit.SECONDS);
ft.get();
// Shutdown
service.shutdown();
} catch (IOException | InterruptedException | ExecutionException ioe) {
ioe.printStackTrace();
}
});
}
public static void main(String[] args) throws InterruptedException {
Thread process = runProcess();
process.start();
process.join();
}
}
Вот снимок вывода после начала загрузки:
-----------------------------------------------------------------------
Downloading: Sintel
Server running at: http://localhost:8000/5
Downloading to: D:\justtest
Speed: 167 KB/s Downloaded: 786 KB/129 MB Uploaded: 0 B
Running time: 7 seconds Time remaining: 13 minutes Peers: 6/7
S 196.221.61.235:6881 0 B 0 B/s 0 B/s
... and 6 more
-------TRIMMED
[32mDownloading: Sintel
Server running at: http://localhost:8000/5
Downloading to: D:\justtest
Speed: 167 KB/s Downloaded: 786 KB/129 MB Uploaded: 0 B
Running time: 7 seconds Time remaining: 13 minutes Peers: 6/7
S 196.221.61.235:6881 0 B 0 B/s 0 B/s
... and 6 more
-----------------------------------------------------------------------
Обратите внимание, что когда строка обрезается, в начале добавляется [32m
. Я понятия не имею, откуда это. Я предполагаю, что это мусор, который уже существовал в ByteArrayOutputStream
, но как мне от него избавиться? Это действительно доставляет мне трудности. Я должен разделить строку на новые строки и извлечь значения для каждого столбца (например, загрузка, запуск сервера и т. Д.). Если я разделю строку и продолжу дальше, все станет еще сложнее. Я получаю [32m
для значений каждого столбца, и на этот раз [32m
становится другим (например, 23, это случайные 2-4 буквы, которые, безусловно, содержат цифры и, необязательно, другие символы, такие как [) для некоторых значений. Как можно очистить вывод?