求助 OutputStream报Stream Closed错误

闪电苦力蛇 2020-06-26 04:48:45
我用了一个OutputStreamWriter以及它的修饰类BufferedWriter捕获了Process的OutputStreamWriter,但是运行第二次的时候会报java.io.IOException: Stream Closed的错误,网上这类报错都是先关闭修饰类再关闭OutputStreamWriter,我按照这个方法试了,还是会报这个错误
错误的部分的代码:
  
String cmd=Input.getText();
Output.appendText(cmd);
OutputStreamWriter OSW=new OutputStreamWriter(StartServer.getOutputStream());
BufferedWriter Writer=new BufferedWriter(OSW);
Writer.write(cmd);
Writer.close();
OSW.close

错误信息:
java.io.IOException: Stream Closed
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:320)
at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
at xyz.shandiankulishe.msm_UI.RunServer$1.handle(RunServer.java:73)
at xyz.shandiankulishe.msm_UI.RunServer$1.handle(RunServer.java:61)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:186)
at java.lang.Thread.run(Thread.java:748)
完整代码:
package xyz.shandiankulishe.msm_UI;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.io.*;
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;

public class RunServer extends Application{
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Group root=new Group();
Scene scene=new Scene(root,1280,720, Color.WHITE);
TextArea Output=new TextArea();
TextField Input=new TextField();
String URL=getClass().getResource("sub.png").toString();
Button Submit=new Button("Submit",new ImageView(URL));
Text RunTime=new Text("运行时间:N/A");
Text CpuLoad=new Text("CPU占用:N/A");
Text MemoryLoad=new Text("内存占用:N/A");
RunTime.setFont(Font.font("Microsoft JhengHei",24));
CpuLoad.setFont(Font.font("Microsoft JhengHei",24));
MemoryLoad.setFont(Font.font("Microsoft JhengHei",24));
RunTime.setLayoutX(950);
RunTime.setLayoutY(40);
CpuLoad.setLayoutX(950);
CpuLoad.setLayoutY(70);
MemoryLoad.setLayoutX(950);
MemoryLoad.setLayoutY(100);
Output.setPrefRowCount(37);
Output.setPrefWidth(900);
Output.setPrefHeight(630);
Output.setLayoutX(10);
Output.setLayoutY(10);
Input.setPrefWidth(850);
Input.setLayoutX(10);
Input.setLayoutY(650);
Submit.setLayoutX(870);
Submit.setLayoutY(650);
root.getChildren().addAll(Output,Input,Submit,RunTime,CpuLoad,MemoryLoad);
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setWidth(1280);
primaryStage.setHeight(720);
Process StartServer=Runtime.getRuntime().exec("cmd /c java -Xmx1024M -Dlog4j.skipJansi=true -jar Server.jar nogui");
Submit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
try {
String cmd=Input.getText();
Input.clear();
Output.appendText(cmd);
OutputStreamWriter OSW=new OutputStreamWriter(StartServer.getOutputStream());
BufferedWriter Writer=new BufferedWriter(OSW);
Writer.write(cmd);
Writer.close();
OSW.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Task<Void> GetRuntime=new Task<Void>() {
@Override
protected Void call() throws Exception {
OperatingSystemMXBean OSMB=(OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
for (int i=1;i>0;i++){
RunTime.setText("运行时间: "+i+" 秒");
double CPULOAD=OSMB.getSystemCpuLoad();
int CPULOADVALUE=(int)(CPULOAD*100);
String CPUUSE=String.valueOf(CPULOADVALUE);
CpuLoad.setText("CPU使用率:"+CPUUSE+" %");
double MAXVMMEMORY=OSMB.getTotalPhysicalMemorySize();
double FREEVMMEMORY=OSMB.getFreePhysicalMemorySize();
double USEDVMMEMORY=MAXVMMEMORY-FREEVMMEMORY;
USEDVMMEMORY=USEDVMMEMORY/MAXVMMEMORY;
int VMMEMORYLOAD=(int)(USEDVMMEMORY*100);
String MEMORYUSE=String.valueOf(VMMEMORYLOAD);
MemoryLoad.setText("内存占用:"+MEMORYUSE+" %");
Thread.sleep(1000);
}
return null;
}
};
new Thread(GetRuntime).start();
Task<Void> PrintServerMessage=new Task<Void>() {
@Override
protected Void call() throws IOException {
BufferedReader getInput= new BufferedReader(new InputStreamReader(StartServer.getInputStream()));
String Buffer;
while ((Buffer=getInput.readLine())!= null){
Output.appendText(Buffer+"\n");
System.out.println(Buffer+"\n");
}
getInput.close();
return null;
}
};
new Thread(PrintServerMessage).start();
}
}

...全文
7553 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
闪电苦力蛇 2020-07-10
  • 打赏
  • 举报
回复
首先感谢大佬评论 这个Process是一个持续运行的Java服务端,除非输入stop否则不会停止运行,我需要实现捕获这个程序的命令行输出打印到JTextArea上,然后当Submit按钮被按下时把TextField的字符串发送给这个程序,所以我需要在这个标准输入流里写东西,同时这个Process是在运行状态的 我在使用BufferedWriter获取Process然后往里面写东西的时候如果没有close方法就会写不出去,但是close之后第二次写入就会报这样的错误,想让大佬指点一下如何解决
捏造的信仰 2020-07-09
  • 打赏
  • 举报
回复
你为什么要往子进程的标准输入流里面写东西,如果你要这么做的话,在这之前先确认子进程还在运行。如果这时候子进程已经结束,那么 outputstream 肯定是已经关闭的。
闪电苦力蛇 2020-06-27
  • 打赏
  • 举报
回复
还是不行啊 我用swing又重写了一遍,这次报的是这个: java.io.IOException: Stream Closed at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:326) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) at java.io.FilterOutputStream.close(FilterOutputStream.java:158) at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:320) at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149) at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233) at java.io.BufferedWriter.close(BufferedWriter.java:266) at xyz.shandiankulishe.msm_UI.RunServer_Swing$1.actionPerformed(RunServer_Swing.java:48) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6539) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Process finished with exit code 0
sh_c_1314 2020-06-26
  • 打赏
  • 举报
回复
先close osw再close关闭writer 试试

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧