你需要实例化一个包裹System.out和日志文件的TeeOutputStream。然后创建一个将Telnet InputStream复制到TeeOutputStream的线程。 (你只能有一个消耗telnet InputStream的线程)
I've adapted the Apache IOUtil
sample to work with the WeatherTelnet
sample a little differently. While the comments for WeatherTelnet
state that:
I would like to split the output using Apache TeeOutputStream
, but the API branches OutputStream
whereas TelnetClient
"output" is in the form of an InputStream
, so that, of course, it can be read. Conveniently, the Apache copyStream
utility method will copy an InputStream to an OutputStream.
1.) How do I copy the InputStream
to an OutputStream
in printKindaWorks
or printToFile
?
2.) How do I either write the OutputStream
to a file, or tee it?
the trick is to do these operations live, while the user interacts with the weather server.
I did my best to look at the source code for copyStream
and used that for reference, but it just plain doesn't work. I haven't yet looked at the internals for the Apache implementation of tee.
The utility class:
package apache;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.net.io.Util;
public final class IOUtil {
private static final Logger log = Logger.getLogger(IOUtil.class.getName());
private static void readFromConsole(final OutputStream outputStream) {
Thread read = new Thread() {
@Override
public void run() {
int ch;
try {
while ((ch = System.in.read()) != -1) {
outputStream.write(ch);
outputStream.flush();
}
} catch (IOException ioe) {
log.warning(ioe.toString());
}
}
};
read.start();
}
private static void writeToConsole(final InputStream inputStream) {
Thread write = new Thread() {
@Override
public void run() {
try {
Util.copyStream(inputStream, System.out);
} catch (IOException ioe) {
log.warning(ioe.toString());
}
}
};
write.start();
}
private static void printKindaWorks(final InputStream inputStream) {
Thread write = new Thread() {
@Override
public void run() {
PrintStream printStream = null;
try {
File file = new File("weather.log");
FileOutputStream fos = new FileOutputStream(file, true);
printStream = new PrintStream(fos);
Util.copyStream(inputStream, printStream);
} catch (IOException ioe) {
log.warning(ioe.toString());
}
}
};
write.start();
}
// TeeOutputStream tee = new TeeOutputStream(inputStream, bis);
private static void writeToFile(final InputStream inputStream) throws FileNotFoundException, IOException {
final String fname = "whether.log";
File f = new File(fname);
f.createNewFile();
Thread fileWriter = new Thread() {
@Override
public void run() {
char c = 0;
int r = 0;
try {
while ((r = inputStream.read()) != -1) {
c = (char) r;
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fname, true)));
out.print(c);
out.close();
}
} catch (IOException ex) {
Logger.getLogger(IOUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
fileWriter.start();
}
public static void readWriteLog(final InputStream inputStream, final OutputStream outputStream) throws FileNotFoundException, IOException {
readFromConsole(outputStream);
writeToConsole(inputStream);
writeToFile(inputStream); //doesn't write much
// printKindaWorks(inputStream); //blocks writeToConsole ?
}
}
and the driver:
package weather;
import apache.IOUtil;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.commons.net.telnet.TelnetClient;
public class Weather {
public Weather() {
}
public static void main(String[] args) throws UnknownHostException, IOException {
int port = 3000;
InetAddress host = InetAddress.getByName("rainmaker.wunderground.com");
TelnetClient telnetClient = new TelnetClient();
telnetClient.connect(host, port);
IOUtil.readWriteLog(telnetClient.getInputStream(), telnetClient.getOutputStream());
}
}
Please consider the code under the ASL.
While I am "logging" the InputStream
I'm not not working on a logging problem, writing to a file is just for illustration purposes. I just want to split the InputStream
while the user interacts with the weather server.
解决方案
You need to instantiate a TeeOutputStream which wraps System.out and the log file. Then create a thread which copies the telnet InputStream to the TeeOutputStream. (you can only have a single thread consuming the telnet InputStream)
这篇关于如何将InputStream复制到需要OutputStream的Apache TeeOutputStream?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!