зеркало из https://github.com/mozilla/pjs.git
119 строки
2.8 KiB
Java
119 строки
2.8 KiB
Java
/*
|
|
Console.java
|
|
|
|
Simple console that lets an Applet attach to the system console.
|
|
|
|
by Patrick C. Beard.
|
|
*/
|
|
|
|
package netscape.console;
|
|
|
|
import java.io.*;
|
|
import java.awt.*;
|
|
|
|
public class Console {
|
|
// Save primordial System streams.
|
|
private static InputStream in;
|
|
private static PrintStream out;
|
|
private static PrintStream err;
|
|
private static TextArea console;
|
|
|
|
private static class Input extends InputStream {
|
|
byte[] buffer = new byte[1024];
|
|
int position = 0;
|
|
int count = 0;
|
|
|
|
private void fillBuffer() throws EOFException {
|
|
// int length = readLine(buffer, 0, buffer.length);
|
|
int length = 1024;
|
|
if (length == -1)
|
|
throw new EOFException();
|
|
count = length;
|
|
position = 0;
|
|
}
|
|
|
|
public int read() throws IOException {
|
|
synchronized(this) {
|
|
if (position >= count)
|
|
fillBuffer();
|
|
return buffer[position++];
|
|
}
|
|
}
|
|
|
|
public int read(byte[] b, int offset, int length) throws IOException {
|
|
synchronized(this) {
|
|
// only fill the buffer at the outset, always returns at most one line of data.
|
|
if (position >= count)
|
|
fillBuffer();
|
|
int initialOffset = offset;
|
|
while (offset < length && position < count) {
|
|
b[offset++] = buffer[position++];
|
|
}
|
|
return (offset - initialOffset);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class Output extends OutputStream implements Runnable {
|
|
StringBuffer buffer = new StringBuffer();
|
|
|
|
public Output() {
|
|
Thread flusher = new Thread(this, getClass().getName() + "-Flusher");
|
|
flusher.setDaemon(true);
|
|
flusher.start();
|
|
}
|
|
|
|
public synchronized void write(int b) throws IOException {
|
|
this.buffer.append((char)b);
|
|
notify();
|
|
}
|
|
|
|
public synchronized void write(byte[] buffer, int offset, int count) throws IOException {
|
|
this.buffer.append(new String(buffer, 0, offset, count));
|
|
notify();
|
|
}
|
|
|
|
public synchronized void flush() throws IOException {
|
|
String value = this.buffer.toString();
|
|
console.append(value);
|
|
this.buffer.setLength(0);
|
|
}
|
|
|
|
/**
|
|
* When I/O occurs, it is placed in a StringBuffer, which is flushed in a different thread.
|
|
* This prevents deadlocks that could occur when the AWT itself is printing messages.
|
|
*/
|
|
public synchronized void run() {
|
|
for (;;) {
|
|
try {
|
|
wait();
|
|
flush();
|
|
} catch (InterruptedException ie) {
|
|
} catch (IOException ioe) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class Error extends Output {}
|
|
|
|
public static void init(TextArea text) {
|
|
in = System.in;
|
|
out = System.out;
|
|
err = System.err;
|
|
console = text;
|
|
|
|
System.setIn(new Input());
|
|
System.setOut(new PrintStream(new Output()));
|
|
System.setErr(new PrintStream(new Error()));
|
|
}
|
|
|
|
public static void dispose() {
|
|
System.setIn(in);
|
|
System.setOut(out);
|
|
System.setErr(err);
|
|
|
|
console = null;
|
|
}
|
|
}
|