Search code examples
javaoptimizationprocessbuilder

How to optimize BufferedReader reading?


I have a code written in Java that shows all installed programs on a PC. But for some reason after this line, the program runs 25 seconds longer than usual.

sb.append(reader.lines().collect(Collectors.joining("\n")));

The code itself:

class InstalledPrograms {
    public static String getPrograms() {
        StringBuilder sb = new StringBuilder();

        try {
            ProcessBuilder processBuilder = new ProcessBuilder(getCommand().split(" "));
            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            sb.append(reader.lines().collect(Collectors.joining("\n")));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return sb.toString();
    }


    private static String getCommand() {
        String os = System.getProperty("os.name").toLowerCase();

        if (os.contains("window"))
            return "wmic product get name,version";
        if (os.contains("linux"))
            return "dpkg --list";
        return "pkgutil --pkgs"; // for MacOS
    }
}

I tried to use ProcessBuilder - it didn't help. I tried to use toString() to avoid going through each element - it didn't help either.


Solution

  •     public static String getPrograms() {
            StringWriter sw = new StringWriter();
    
            try {
                ProcessBuilder processBuilder = new ProcessBuilder(getCommand().split(" "));
                Process process = processBuilder.redirectErrorStream(true).start();
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                reader.transferTo(sw);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return sw.toString();
        }
    

    Command:

     time java InstalledPrograms
    

    Output:

    a2ps                                            install
    aapt                                            install
    accountsservice                                 install
    acl                                             install
    acpi                                            install
    acpi-fakekey                                    install
    ...
    zathura                     install
    zathura-pdf-poppler             install
    zenity                      install
    zenity-common                   install
    zip                     install
    zlib1g:amd64                    install
    zlib1g:i386                 install
    zlib1g-dev:amd64                install
    zoom                        install
    zsh                     install
    zsh-common                  install
    
    
    real    0m0.228s
    user    0m0.286s
    sys 0m0.086s