我正在尝试设置一个Minecraft服务器,以获得乐趣,并希望添加一个控制面板,以便更轻松地管理它.此控制面板的一部分是从面板运行服务器以减少错过单击退出按钮和什么不是.(minecraft服务器是一个不可运行的.jar文件,暗示你必须让.bat从命令行运行它.)我知道如何在我的程序中运行服务器,以及打印输出,这里:
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "gscale.jar");
pb.redirectErrorStream(true);
pb.directory(new File("F:\\Documents and Settings\\Administrator\\Desktop"));
System.out.println("Directory: " + pb.directory().getAbsolutePath());
Process p = pb.start();
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
for (String line = br.readLine(); line != null; line = br.readLine()) {
System.out.println( line ); // Or just ignore it
}
p.waitFor();
Run Code Online (Sandbox Code Playgroud)
但是,有了这个,我不确定如何实现输入法.例如,如果我单击一个按钮,它会将输入"stop"发送到外部jar以停止服务器,就像没有此命令面板一样.我该如何实现呢?上面的代码我计划在它自己的线程中运行,但也许我这样做是错的?
提前致谢!
我正在尝试创建一种控制台/终端,允许用户输入一个字符串,然后将其转换为一个进程并打印出结果.就像一个普通的控制台.但我无法管理输入/输出流.我已经研究过这个帖子,但是这个解决方案很遗憾不适用于我的问题.
与"ipconfig"和"cmd.exe"等标准命令一起,我需要能够运行脚本并使用相同的输入流来传递一些参数,如果脚本要求输入的话.
例如,在运行脚本"python pyScript.py"之后,如果它要求它(例如:raw_input),我应该能够将更多输入传递给脚本,同时还打印脚本的输出.您期望终端的基本行为.
到目前为止我得到了什么:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
public class Console extends JFrame{
JTextPane inPane, outPane;
InputStream inStream, inErrStream;
OutputStream outStream;
public Console(){
super("Console");
setPreferredSize(new Dimension(500, 600));
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// GUI
outPane = new JTextPane();
outPane.setEditable(false);
outPane.setBackground(new Color(20, 20, 20));
outPane.setForeground(Color.white);
inPane = new JTextPane(); …Run Code Online (Sandbox Code Playgroud) 我需要以这样的方式启动外部可执行文件,即用户可以与刚刚启动的程序进行交互.
例如在OpenSuse Linux中有一个包管理器--Zypper.您可以在命令模式下启动zypper,并为其提供安装,更新,删除等命令.
我希望以用户可以与之交互的方式从Java代码运行它:输入命令并查看他启动的程序的输出和错误.
这是我尝试使用的Java代码:
public static void main(String[] args) throws IOException, InterruptedException {
Process proc = java.lang.Runtime.getRuntime().exec("zypper shell");
InputStream stderr = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
char ch;
while ( (ch = (char)br.read()) != -1)
System.out.print(ch);
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是我只能看到它的输出:
zypper>
Run Code Online (Sandbox Code Playgroud)
但无论我写什么,我的输入都不会影响已启动的程序.我该怎么办?
可能这个帖子是重复但有人可以指导吗?我想同时将java程序输出写入控制台和文件.我知道我可以使用这段代码将输出发送到控制台
PrintStream orgStdout = null;
PrintStream fileStdout = null;
orgStdout = System.out;
try {
fileStdout = new PrintStream(new FileOutputStream("C:\\testlogger.txt"));
System.setOut(fileStdout);
System.out.println("==============");
for (int i = 0; i < 10; i++){
System.out.println("" + i);
}
System.out.println("==============");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但如何在控制台和文件上保持输出?
PS:没有找到我在文件中输出并在不同线程中显示控制台的选项.
是否可以关闭PHP脚本的输出流?我有一个脚本需要做一些后期处理,但在后处理期间和之后它不再向客户端发送任何数据,所以我想在后期处理之前关闭连接.
编辑:在我的应用程序中,我有一个缓存,需要不时地重建.但是,我不想让用户放慢速度.我想要的是在脚本的最后确定是否需要重建缓存.所以我想首先关闭输出流,以便用户获取它的数据,然后我想重建缓存.这样做并不是很关键,但我认为最好先关闭连接,这样用户就不会注意到缓存正在重建,如果这需要很长时间.
我在ProcumBuilder和Process的java项目中使用了wkhtmltopdf:
ProcessBuilder pb = new ProcessBuilder("wkhtmltopdf.exe", "input.html", "output.pdf");
Process process = pb.start();
此解决方案使用html文件作为输入,并将输出保存为磁盘上的pdf文件.但我的html不是文件,它是一个OutputStream,我想在飞行中创建pdf文件,不想将其保存在磁盘上.
有没有办法用OutputStream传递参数并将结果作为另一个OutputStream?
我正在寻找一个区分C++ cerr和coutC++ 的例子?
我什么时候需要使用cerr?
如何将输出写入文件?我试过而不是process.stdout使用fs.createWriteStream(temp + '/export2.json'),但它不起作用.
var rl = readline.createInterface({
input: fs.createReadStream(temp + '/export.json'),
output: process.stdout,
terminal: false
});
rl.on('line', function(line) {
rl.write(line);
});
Run Code Online (Sandbox Code Playgroud) 我有一个大文件下载,该文件由一台服务器上的RestController提供服务,我需要流经另一台服务器上的RestController。直接调用最终服务器时,结果流很好。但是,当使用RestTemplate调用此服务器,然后将响应写入到OutputStream时,响应将在前端服务器上缓冲,直到整个文件准备就绪,然后进行流式处理。有什么办法可以将文件写入到OutputStream中吗?
目前,我在前端服务器上的代码与此类似
@ResponseBody
public void downloadResults(HttpServletRequest request, HttpServletResponse response, @RequestParam("id") String jobId, OutputStream stream)
throws IOException
{
byte[] data = restTemplate.exchange("http://localhost/getFile", HttpMethod.POST, requestEntity, byte[].class, parameters).getBody();
stream.write(data);
}
Run Code Online (Sandbox Code Playgroud)
我已经将RestTemplate设置为不缓冲,并且通过检查所使用的请求类型(SimpleStreamingClientHttpRequest)验证了此模板是否正常工作。数据全部恢复正确,它只是一次全部写入流中,而不是直接写入
我有一个InputStreamand OutputStream(没有套接字)。
我有一个基于流的代码,可以执行一些映射/过滤/分组/处理。
我的主要目标是在超出时终止流maxDuration:
void fillStreamMap(BufferedReader reader) {
final Instant end = Instant.now().plusNanos(TimeUnit.NANOSECONDS.convert(maxDuration));
this.map = reader.lines()
.takeWhile(e -> checkTimeout(end))
.map(this::jsonToBuyerEventInput)
.filter(Objects::nonNull)
.filter(getFilter()::apply)
.limit(super.maxEvent)
.collect(Collectors.groupingBy(BuyerEventInput::getBuyer));
}
boolean checkTimeout(Instant end){
return Instant.now().getEpochSecond() <= end.getEpochSecond();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用takeWhile这是一个非常有用的函数,但它会检查终止条件是否有即将发生的事件。
因此,如果没有发送数据,它不会检查条件,因为该函数是为了将 aPredicate作为参数而构建的。
有什么办法可以实现这个目标吗?
outputstream ×10
java ×7
inputstream ×3
c++ ×1
core ×1
cout ×1
http-headers ×1
java-stream ×1
minecraft ×1
node.js ×1
pdf ×1
php ×1
process ×1
spring ×1
spring-boot ×1
stream ×1
wkhtmltopdf ×1