最近我正在用 eclipse_RCP 做一个 eclipse 插件项目。但是当我想在插件的控制台中打印大量消息时,我遇到了 eclipse UI 的一些问题。
这些消息来自一个复杂的过程,可以被认为是一个一直在生产消息并且永不停止的工厂(当然,直到客户端停止该过程)。
之前打印消息的时候(消息很短),只需要调用函数-org.eclipse.ui.console.MessageConsoleStream.println()。
但是这一次,当我像以前一样尝试时,运行时 EclipseApplication(启动调试模式) 停止响应,然后告诉我 内存不足。
似乎eclipse会读取内存中的所有消息,然后将它们打印到控制台一次。所以当消息数量很大时,它会内存不足。
我的问题是如果我想在控制台中逐行打印消息该怎么办?
我的描述可能不准确。下面是java代码:
public void print(Process p) {
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()),1024);
String line = "";
try {
while ((line = in.readLine()) != null) {
//it is correct when print in the main console
System.out.println(line);
//when print in plugin console .it is out of memory
//this is the function
//org.eclipse.ui.console.MessageConsoleStream.println()
println(line);
}
in.close();
this.flush();
this.close();
p.destroy();
}
catch (IOException e) {
e.printStackTrace();
}
}
然后我首先尝试写入一个文件,并让 MessageConsoleStream 每 1000 条消息从文件中读取一次,但看起来是一样的。
public void print(Process p) {
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()),1024);
String line = "";
char []tem = new char[1024];
int i = 0 ;
try {
File temp = File.createTempFile("temp", ".tep",new File("E:/"));
FileWriter out = new FileWriter(temp);
MessageConsoleStream mcs = null;
while((line = in.readLine())!=null){
if(i<=1000){
System.out.println(line);
out.write(line+"\n", 0, line.length()+1);
i++;
}
else{
i=0 ;
out.flush();
out.close();
FileReader fr=new FileReader(temp);
mcs = CConsole.getMessageStream("consoleName", "file name");
while( fr.read(tem, 0, 1024)!=-1){
mcs.print(String.valueOf(tem));
}
mcs.flush();
mcs.close();
fr.close();
out = new FileWriter(temp,false);
}
}
if(i!= 0){
mcs = CConsole.getMessageStream("consoleName", "file name");
out.flush();
out.close();
FileReader fr=new FileReader(temp);
while( fr.read(tem, 0, 1024)!=-1){
mcs.print(String.valueOf(tem));
}
mcs.flush();
mcs.close();
}
in.close();
p.destroy();
}
catch (IOException e) {
e.printStackTrace();
}
}
当消息数量超过600,000时,上述所有方法都会使eclipse内存不足(然后我停止该进程,否则会内存不足)。
看起来 ecplipse 想要一次打印所有这些,但不是逐行打印。所以它会读取并再次读取,直到内存不足。
BTW,我在org.eclipse.ui.console.MessageConsoleMessage.java中找到了一个注释——</p>
客户端应避免在 UI 线程中将大量输出写入此流。控制台需要在 UI 线程中处理输出,如果客户端占用 UI 线程将输出写入控制台,控制台将无法处理输出。
这不是真正的原因,不是吗?
我还注意到打印大量消息时 cdt 和 jdt 都可以。他们是怎么做的?
谢谢!</p>