OutputStream 未转换为 String 变量
OutputStream not converting into a String varible
所以我开始考虑这将是一个简单的 1 或 2 行代码,以便我将 OutputStream 转换为字符串,以便我可以更好地检查它按照我的逻辑。
所以下面的代码是我目前正在使用的。如果我只是想将 output 写入 console,它 工作得很好 仅此而已。但是,我想将 output 存储为 string.
public static void main(String[] args) throws IOException {
Process p;
try {
p = Runtime.getRuntime().exec("cmd");
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
stdin.println("cd C:/Local Apps/xxx/xxx/xxxx/eclipse");
stdin.println("lscm login -r https://xxxx.xxxx.xxxx.xxxx:9443/ccm -n xxxx.xxxx.xxx.xxxx -u itsme -P gr^34dbtfgt7y");
stdin.close();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SyncPipe implements Runnable {
public SyncPipe(InputStream istrm, OutputStream ostrm) {
istrm_ = istrm;
ostrm_ = ostrm;
}
public void run() {
try {
final byte[] buffer = new byte[1024];
for (int length = 0; (length = istrm_.read(buffer)) != -1;) {
ostrm_.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private final OutputStream ostrm_;
private final InputStream istrm_;
}
我想从中获取数据:
ostrm_.write(buffer, 0, length);
我尝试了在 google:
上发现的各种东西
String string = new String(ostrm_.toString());
System.out.println(string);
String string = new String(ostrm_.toString("UTF-8"));
System.out.println(string);
final PrintStream blah = new PrintStream(ostrm_);
final String string = blah.toString();
System.out.println(string);
String blah = ostrm_.toString();
System.out.println(string);
byte[] blah = buffer;
String string = blah.toString();
我想我可以使用 OutputStreamWriter 之类的东西,但我似乎无法让它工作。所以如果有Java大师能帮我解决这个看似简单其实很难的问题就好了....
更新 1 用于启动和发动机罩:
请试试这个:
byte[] blah = buffer;
String string = new String(blah);
看来我终于明白了!
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(istrm_));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
您的代码以非常困难的方式做事。要在特定工作目录中 运行 一个命令,并将输出发送到控制台,请使用 ProcessBuilder
and inheritIO()
.
问题中的所有代码都可以简化为:
public static void main(String[] args) throws IOException {
new ProcessBuilder("cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y")
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.inheritIO()
.start()
.waitFor();
}
更新
要将命令的所有输出收集到一个字符串中,您首先要通过调用 redirectErrorStream(true)
而不是调用 inheritIO()
来组合 stdout 和 stderr,然后将输出收集到 String
使用适当的字符集。
以下使用平台默认值 Charset
,因为这可能是命令输出的内容。
String[] command = {
"cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y" };
Process p = new ProcessBuilder(command)
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.redirectErrorStream(true) // stderr > stdout
.start();
p.getOutputStream().close(); // stdin < NUL
String output;
try (InputStream in = p.getInputStream()) {
output = new String(in.readAllBytes());
}
int errorCode = p.waitFor();
System.out.print(output);
if (errorCode != 0)
System.out.println("Program terminated with error code " + errorCode);
以上代码适用于 Java 9+。对于 Java 7+,像这样得到 output
:
try (InputStream in = p.getInputStream()) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024);
byte[] buf = new byte[1024];
for (int len; (len = in.read(buf)) > 0; )
bytes.write(buf, 0, len);
output = bytes.toString();
}
您可以使用 readAllBytes()
并使用默认字符集创建 String
:
System.out.println(new String(istrm_.readAllBytes()));
所以我开始考虑这将是一个简单的 1 或 2 行代码,以便我将 OutputStream 转换为字符串,以便我可以更好地检查它按照我的逻辑。
所以下面的代码是我目前正在使用的。如果我只是想将 output 写入 console,它 工作得很好 仅此而已。但是,我想将 output 存储为 string.
public static void main(String[] args) throws IOException {
Process p;
try {
p = Runtime.getRuntime().exec("cmd");
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
stdin.println("cd C:/Local Apps/xxx/xxx/xxxx/eclipse");
stdin.println("lscm login -r https://xxxx.xxxx.xxxx.xxxx:9443/ccm -n xxxx.xxxx.xxx.xxxx -u itsme -P gr^34dbtfgt7y");
stdin.close();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SyncPipe implements Runnable {
public SyncPipe(InputStream istrm, OutputStream ostrm) {
istrm_ = istrm;
ostrm_ = ostrm;
}
public void run() {
try {
final byte[] buffer = new byte[1024];
for (int length = 0; (length = istrm_.read(buffer)) != -1;) {
ostrm_.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private final OutputStream ostrm_;
private final InputStream istrm_;
}
我想从中获取数据:
ostrm_.write(buffer, 0, length);
我尝试了在 google:
上发现的各种东西String string = new String(ostrm_.toString());
System.out.println(string);
String string = new String(ostrm_.toString("UTF-8"));
System.out.println(string);
final PrintStream blah = new PrintStream(ostrm_);
final String string = blah.toString();
System.out.println(string);
String blah = ostrm_.toString();
System.out.println(string);
byte[] blah = buffer;
String string = blah.toString();
我想我可以使用 OutputStreamWriter 之类的东西,但我似乎无法让它工作。所以如果有Java大师能帮我解决这个看似简单其实很难的问题就好了....
更新 1 用于启动和发动机罩:
请试试这个:
byte[] blah = buffer;
String string = new String(blah);
看来我终于明白了!
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(istrm_));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
您的代码以非常困难的方式做事。要在特定工作目录中 运行 一个命令,并将输出发送到控制台,请使用 ProcessBuilder
and inheritIO()
.
问题中的所有代码都可以简化为:
public static void main(String[] args) throws IOException {
new ProcessBuilder("cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y")
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.inheritIO()
.start()
.waitFor();
}
更新
要将命令的所有输出收集到一个字符串中,您首先要通过调用 redirectErrorStream(true)
而不是调用 inheritIO()
来组合 stdout 和 stderr,然后将输出收集到 String
使用适当的字符集。
以下使用平台默认值 Charset
,因为这可能是命令输出的内容。
String[] command = {
"cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y" };
Process p = new ProcessBuilder(command)
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.redirectErrorStream(true) // stderr > stdout
.start();
p.getOutputStream().close(); // stdin < NUL
String output;
try (InputStream in = p.getInputStream()) {
output = new String(in.readAllBytes());
}
int errorCode = p.waitFor();
System.out.print(output);
if (errorCode != 0)
System.out.println("Program terminated with error code " + errorCode);
以上代码适用于 Java 9+。对于 Java 7+,像这样得到 output
:
try (InputStream in = p.getInputStream()) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024);
byte[] buf = new byte[1024];
for (int len; (len = in.read(buf)) > 0; )
bytes.write(buf, 0, len);
output = bytes.toString();
}
您可以使用 readAllBytes()
并使用默认字符集创建 String
:
System.out.println(new String(istrm_.readAllBytes()));