[질문] Java의 readline()에 관한 질문입니다.

hexascii의 이미지

안녕하세요? 글 읽어 주셔서 감사합니다.

짧게 질문부터 드리면,

Java의 readline()을 호출하면, 콘솔로부터 사용자 입력값을 읽어옵니다.

그런데 이 readline()으로 인한 Console 입력을 사용자 입력이 아니라 코드로 입력시킬려면

어떻게 구현을 해야 될까요?

일단, System.out.println으로는 되지 않습니다.

그래서, BufferedWriter를 이용한 다음과 같은 인스턴스로 출력을 해봤습니다.

 BufferedWriter gWriter = new BufferedWriter(new OutputStreamWriter(System.out));

이렇게 찍으면, gWriter를 이용한 출력이 Console로 찍히는 것으로 알고 있었습니다.

사용은 이렇게 했습니다.

try {
    gWriter.write(question);
    gWriter.newLine();
    gWriter.flush();
} catch (IOException ioe) {}

흠... 현재는 여기서 막힌 상태입니다. question String의 값은 찍히지만, newLine()이 사용자 입력으로

인식되지 않네요.

고수님들의 답변 부탁드립니다.

글 읽어 주셔서 감사합니다.

kaeri17의 이미지

잘 이해가 안가네요

사용자 입력으로 쓴다는 말은 저 콘솔 출력을 다른 프로그램에서 이용하겠다는 건가요?

hexascii의 이미지

아니오. 같은 프로그램인데, Swing/AWT 같은 GUI 위에서 event를 발생시켰을 때,

콘솔의 입력 상태에서 입력을 주고 싶은 겁니다.

즉, TextField 같은 곳에서 입력을 하면, 저 readline() 된 부분을 콘솔에서 입력한 것처럼 해주고 싶은 것입니다.

cleol의 이미지

쓰신 글을 읽고 제가 상상하기로는 System.out 에 뭔가를 쓰면 그것을 다시 System.in 에서 읽고 싶으신 것 같습니다.

만약에 맞다면, 그리 단순한 문제가 아닙니다.

PipeInputStream 과 PipeOutputStream 에 대해서 알아보시고, 쓰레드를 사용하셔야 합니다.

커맨드라인에서 돌아가는 다른 프로그램에 GUI 를 입힌다거나 하는 경우에 이런 일을 종종 하기도 하지만,

하나의 프로그램에서 왜 이렇게 읽고 쓰기를 하시려는건가요? 뭔가 다른 디자인으로 문제를 해결할 수는 없는지 생각해보실 필요가 있을 것 같습니다.

bookgekgom의 이미지

질문 자체가 이해가 안됩니다.

질문자는 자신이 무엇을 하려하는지 명확하게 밝혔으면 좋곘습니다.

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

dormael의 이미지

GUI에서 입력받은 문자열을

다른 프로그램에 전달하기 위한 방법을 물어보시는 건가요?

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

hexascii의 이미지

음.. 제가 좀 복잡하게 쓴 모양입니다.

/cleol : 맞게 이해하신 것 같습니다. 제가 하려는 일이 커맨드라인에서 돌아가는 프로그램에 GUI를 입히고 싶은겁니다.

/bookgekgom : 죄송합니다. 추가로 적어보겠습니다.

/dormael : 다른 프로그램이 아닙니다. 같은 프로그램입니다. 추가로 적어보겠습니다.

우선, Console기반의 프로그램에서 readline()을 실행합니다.

Question : _

이렇게 말이죠. 그런데 여기다가 GUI를 따로 입히고 있는 작업중입니다.

그래서, 원본 Source를 최대한 건들고 싶지 않기 때문에 JFrame은 JFrame대로 떠있고,

그 안의 TextField에다가 String을 입력한 다음, 원본 소스에서의 콘솔 입력을 무시하고,

GUI에서의 String으로 진행하고 싶은 것입니다.

급하게 적다보니 이해도가 부족한 글이 되어버렸군요. 죄송합니다.

답글은 감사합니다.

cleol의 이미지

같은 프로그램이라는 말은 여전히 이해가 안되는군요. 어쨌거나 해결하고자하는 문제는 알겠습니다.

제가 추측할때에는 hexascii 님은 System.out 에 쓰면 System.in 이 읽는 것으로 착각하고 계신 것 같습니다. 그런데 그렇지 않습니다. 두 스트림은 완전히 별개의 스트림입니다. 한 콘솔 화면에서 입력과 출력이 보여질 뿐이지 둘이 연결되어 있는 것은 아닙니다.

한가지 해결 방법은 console 기반 프로그램과 GUI 를 서로 다른 프로세스로 실행시키는 것입니다. GUI 에서 ProcessBuilder 를 사용해서 console 기반 프로그램을 새로운 프로세스로 동작시키고, GUI 에서는 이 프로세스의 표준 입력에 필요한 입력을 넣어주는 겁니다. GUI 와 별도로 돌아가는 쓰레드를 하나 만들고 이 쓰레드에서는 PipeInputStream 에서 입력을 읽어서 콘솔 프로세스의 표준 입력에 넣어줍니다. GUI 쓰레드에서는 TextField 에 입력 받은 내용을 연결된 PipeOutputStream 에 써줍니다. 이렇게 하면 기존 console 프로그램의 소스를 전혀 수정할 필요가 없습니다.

기존 소스를 수정하지 않고, 하나의 프로세스 안에서 해결하는 방법이 있는지는 잘 모르겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.