DulcetAirman icon

Java and WSL

DulcetAirman | PRO | 06/11/19 03:12:30 PM UTC | 0 ⭐ | 1080 👁️ | Never ⏰ | []
Java |

2.01 KB

|

None

|

0 👍

/

0 👎

package ch.claude_martin.foo;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
 
public class SomeClass {
 
    public static void main(String[] args) throws InterruptedException {
        try {
            // The old CMD on Windows uses UTF-16:
            var utf16 = Charset.forName("UTF-16LE");
            System.out.println(execute("cmd /U /C echo hello", utf16));
            
            // Linux usually has UTF-8 as the default encoding:
            var utf8 = Charset.forName("UTF-8");
            // using WSL we can easily access the Linux subsystem:
            System.out.println(execute("wsl echo hello", utf8));
            // You get a List. Use .get(0) to get the first line:
            System.out.println(execute("wsl uname -a", utf8).get(0));
            // This only works when Windows is installed on C:\
            System.out.println(execute("wsl ls /mnt/c/Users", utf8)); 
            // But you can combine CMD and WSL to make sure you get the correct paths:
            var home = execute("cmd /U /C echo %USERPROFILE%", utf16).get(0);
            System.out.println(execute(String.format("wsl wslpath '%s'", home), utf8)); 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * Run given command and return the data read from stdout.
     * 
     * @param cmd the command, for example "cmd /U /C echo foo"
     * @return The output of the command as a List of Strings.
     * @throws IOException Thrown when executing the command or reading the data
     *                     fails.
     */
    public static List<String> execute(final String cmd, Charset encoding) throws IOException {
        Process p = null;
        try {
            p = Runtime.getRuntime().exec(cmd);
            try (var br = new BufferedReader(new InputStreamReader(p.getInputStream(), encoding))) {
                List<String> result = new ArrayList<>();
                for (;;) {
                    String line = br.readLine();
                    if (line == null)
                        break;
                    result.add(line);
                }
                return result;
            }
        } finally {
            if (p != null)
                p.destroy();
        }
    }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎