在控制台中阅读我自己的打印线

时间:2014-05-04 22:40:50

标签: java readline system.out

有没有一种方法,从函数中,我用System.out.print()打印一个String,然后从另一个函数读取它?

类似的东西:

void printC(String foo){
    System.out.print(foo);
}

void read(){
    String c;
    while(something){
        printC(somethingElse);
        c = System.console.readLine();
        JOptionPane.showMessageDialog(c);
    }
}

3 个答案:

答案 0 :(得分:1)

你为什么要这样做?是这样你可以在屏幕上打印某些东西,或者你可以创建活动吗?

如果您特别想要将消息传递到屏幕以及应用程序的另一部分;一个简单的解决方案可能涉及创建自己的PrintStream类。您可以像处理System.out一样处理对象(因为这也是一个PrintStream)。

有些事情如下:

public class FancyStream extends PrintStream
{
    LinkedList<String> messageQueue = new LinkedList<>();

    @Override
    public void println(String line)
    {
        System.out.println(line);
        messageQueue.add(line);
    }

    public String getLine()
    {
        return messageQueue.pop();
    }
}

但是,如果您想要事件(正如您在评论中所建议的那样),这不是这样做的方法! 您应该查看用于处理事件的Observer模式。维基百科关于此的文章是here

如果您进行Google搜索,还有很多其他资源需要了解观察者模式。 Java甚至还有一个内置的Observable类和Observer接口,可以解决您的问题。

答案 1 :(得分:1)

不,你不能。正如其他人评论的那样,您可能只想要一个内部数据结构来连接不同的组件。

在命令行程序中,标准输入和标准输出(加上标准错误)是完全独立的流。所有三个连接到单个虚拟终端的典型情况,但它们可以独立于shell重定向,例如使用管道或文件。

考虑一下如果你的程序输入来自一个文件并且输出被传送到另一个程序会怎么样;试图&#34;回来&#34;输出没有任何意义。

答案 2 :(得分:0)

尝试PipedOutputStream。

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class Test extends JFrame {

    void printC(String foo){
        System.out.print(foo);
    }

    void read() throws IOException{
        String c = "";
        PipedOutputStream pipeOut = new PipedOutputStream();
        PipedInputStream pipeIn = new PipedInputStream(pipeOut);
        System.setOut(new PrintStream(pipeOut));
        Scanner sc = new Scanner(pipeIn);
        while(!c.equalsIgnoreCase("Quit")){
        printC("Test\n");
        c = sc.nextLine();
        JOptionPane.showMessageDialog(this, c);
        }
    }

    public static void main(String[] args) throws IOException {
        Test t = new Test();
        t.read();
    }

}