Неожиданные символы спереди при обрезке строки - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь прочитать вывод процесса (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 буквы, которые, безусловно, содержат цифры и, необязательно, другие символы, такие как [) для некоторых значений. Как можно очистить вывод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...