2013-04-20 8 views
0

Я пытаюсь написать программу, которая перенаправляет System.out на JTextArea (это не должно быть JTextArea), но когда я вызываю System.out.println (" ! Test ") выход в текстовую область, как так:Java - странное поведение в PrintStream с пользовательским OutputStream

\n 
st! 
\n 

код для моего OutputStream:

package gui; 

import java.awt.*; 
import java.io.*; 
import javax.swing.text.*; 

public class LogOutputStream extends OutputStream 
{ 
    public void write(final int b) throws IOException 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       write0(b); 
      } 
     }); 
    } 

    public void write(final byte[] b, final int off, final int len) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       write0(b, off, len); 
      } 
     }); 
    } 

    public void write(final byte[] b) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       write0(b); 
      } 
     }); 
    } 

    private void write0(int b) 
    { 
     Document doc = FernflowerGUI.frame.textArea.getDocument(); 
     try 
     { 
      doc.insertString(doc.getLength(), String.valueOf((char)b), null); 
     } 
     catch(BadLocationException impossible) 
     { 

     } 
    } 

    private void write0(byte[] b, int off, int len) 
    { 
     Document doc = FernflowerGUI.frame.textArea.getDocument(); 
     try 
     { 
      doc.insertString(doc.getLength(), new String(b, off, len), null); 
     } 
     catch(BadLocationException impossible) 
     { 

     } 
    } 

    private void write0(byte[] b) 
    { 
     write0(b, 0, b.length); 
    } 
} 

код, который создает PrintStream:

PrintStream ps = new PrintStream(new LogOutputStream(), true); 

Может ли кто-нибудь сказать мне, что происходит на Земле?

+1

Этот код показывает ошибки компиляции здесь. Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

Как называется функция записи? Каковы его аргументы? – Zyerah

+0

Является ли '\ n' показанным дословно? Каков тип, возвращаемый 'getDocument()', и как он предназначен для обработки символов перевода строки? –

ответ

1

Ваш код не является потокобезопасным, в основном.

Вы принимаете синхронный вызов, принимающий байтовый массив, - и затем вы используете этот массив байтов позже и считаете, что он все равно будет иметь тот же контент. Что делать, если вызывающий абонент write() перезаписывает данные в массиве байтов сразу после возврата метода? К тому времени, когда вы его используете, у вас не будет правильных данных.

Я бы извлечь String из массива байтов в вашем write вызова, а затем использовать этот String в вызове write0.

(я также лично использовать Writer, а не OutputStream. - в основном вы хотите иметь дело с текстовыми данными, а не двоичные данные)

+0

Работал отлично - спасибо! – condorcraft110

 Смежные вопросы

  • Нет связанных вопросов^_^