Java IO 相关 Process 执行命令获取输出 输出很大该怎么读取?
例如:
```java
读 InputStream 标准输出流,输出流东西很多
发现正常读取的时候 process 已经退出了
process.waitFor()方法 等待会导致缓冲区被填满,然后阻塞
思路是在 waitFor()前,异步地去读取输出流中的内容
但是不生效
```
简单代码 我写一块儿了 缩进比较恶心 主要是有什么好的解决思路吗?
```java
Process process;
try {
process = runtime.exec(commands);
ThreadPools.LOG_COLLECT.execute(()->{
try (InputStream in = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
String line;
File destfile = new File(...);
while ((line = br.readLine()) != null) {
FileUtils.writeStringToFile(destfile, line + "\n", StandardCharsets.UTF_8, true);
}
} catch (IOException e) {
//exception handler
}
});
process.waitFor();
} catch (IOException | InterruptedException e) {
//exception handler
}
```
#process #waitFor #new #line #java #InputStream #try #BufferedReader #br #File
例如:
```java
读 InputStream 标准输出流,输出流东西很多
发现正常读取的时候 process 已经退出了
process.waitFor()方法 等待会导致缓冲区被填满,然后阻塞
思路是在 waitFor()前,异步地去读取输出流中的内容
但是不生效
```
简单代码 我写一块儿了 缩进比较恶心 主要是有什么好的解决思路吗?
```java
Process process;
try {
process = runtime.exec(commands);
ThreadPools.LOG_COLLECT.execute(()->{
try (InputStream in = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
String line;
File destfile = new File(...);
while ((line = br.readLine()) != null) {
FileUtils.writeStringToFile(destfile, line + "\n", StandardCharsets.UTF_8, true);
}
} catch (IOException e) {
//exception handler
}
});
process.waitFor();
} catch (IOException | InterruptedException e) {
//exception handler
}
```
#process #waitFor #new #line #java #InputStream #try #BufferedReader #br #File
萌新求教 Java 转码问题
现在有一个导出文本文件后,文本文件能用 GBK 编码打开的需求,但是原来的代码是这样的
```java
InputStream inputStream = minioUtil.getObject(minioConfig.getBucketName(), fileVersion.getFsId());
```
然后设置响应体的文件类型和响应头
```java
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
response.setHeader("Content-Length", "" + length);
response.setHeader("fileName", "" + fileName);
```
然后通过这个工具类去把 inputstream 流到 outputstream
```java
IOUtils.copy(inputStream, outputStream);
```
我的想法一开始是用
```java
Reader r = new InputStreamReader(inputStream,"utf-8");
BufferedReader br = new BufferedReader(r);
Writer w = new OutputStreamWriter(outputStream,"GBK");
BufferedWriter bw = new BufferedWriter(w);
String s = null;
while((s= br.readLine())!=null){
bw.write(s);
}
br.close();
bw.close();
```
发现导出不了,发送的请求是 pending ,然后过了两分钟响应 200 ,弹不出文件保存框。
然后尝试用这个
```java
byte[] buffer = new byte[8192];
int n;
byte[] dest = new byte[8192];
while(-1 != (n = inputStream.read(buffer))) {
dest=new String(buffer,0,n,"UTF-8").getBytes("GBK");
outputStream.write(dest);
}
```
也失败,发送请求 pending ,响应是 504 Gateway Time-out nginx ,弹不出文件保存框。
#new #java #inputStream #response #byte #GBK #setHeader #fileName #outputStream #br
现在有一个导出文本文件后,文本文件能用 GBK 编码打开的需求,但是原来的代码是这样的
```java
InputStream inputStream = minioUtil.getObject(minioConfig.getBucketName(), fileVersion.getFsId());
```
然后设置响应体的文件类型和响应头
```java
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
response.setHeader("Content-Length", "" + length);
response.setHeader("fileName", "" + fileName);
```
然后通过这个工具类去把 inputstream 流到 outputstream
```java
IOUtils.copy(inputStream, outputStream);
```
我的想法一开始是用
```java
Reader r = new InputStreamReader(inputStream,"utf-8");
BufferedReader br = new BufferedReader(r);
Writer w = new OutputStreamWriter(outputStream,"GBK");
BufferedWriter bw = new BufferedWriter(w);
String s = null;
while((s= br.readLine())!=null){
bw.write(s);
}
br.close();
bw.close();
```
发现导出不了,发送的请求是 pending ,然后过了两分钟响应 200 ,弹不出文件保存框。
然后尝试用这个
```java
byte[] buffer = new byte[8192];
int n;
byte[] dest = new byte[8192];
while(-1 != (n = inputStream.read(buffer))) {
dest=new String(buffer,0,n,"UTF-8").getBytes("GBK");
outputStream.write(dest);
}
```
也失败,发送请求 pending ,响应是 504 Gateway Time-out nginx ,弹不出文件保存框。
#new #java #inputStream #response #byte #GBK #setHeader #fileName #outputStream #br