- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上,我想将控制台输出重定向到 javafx TextArea。我现在正在使用此代码。
public static void init() {
//GUI code. TextArea variable is named textArea
Console console = new Console(textArea);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
}
public static class Console extends OutputStream {
private TextArea output;
private PrintStream out;
public Console(TextArea ta) {
this.output = ta;
out = System.out;
}
@Override
public void write(int i) throws IOException {
Platform.runLater(() -> {
output.appendText(String.valueOf((char) i));
out.print(String.valueOf((char) i));
});
}
但是,有一个问题。 ASCII 字符工作得很好(因为它们都只使用一个字节)。但是,当我尝试打印需要两个字节进行编码的符号(例如西里尔字符)时,它们显然无法正确打印,我得到类似的东西
java.io.IOException: ᄀᄌチツᄉᄐᄉ ᄑᄉ テᄡᄚᄉツチマ ᄑᄚᄍツᄌ テᄎᄚᄋᄚᄑᄑヒᄍ テツフ
有什么办法可以解决这个问题吗?也许使用不同的方法?
更新
这是我最后想到的。思考是否可以以某种方式优化它。
public static class Console extends OutputStream {
private TextArea output;
private PrintStream out;
private ArrayList<Byte> bytes = new ArrayList<>();
public Console(TextArea ta) {
this.output = ta;
out = System.out;
}
@Override
public void write(int i) throws IOException {
Platform.runLater(() -> {
bytes.add((byte)i);
byte[] array = new byte[bytes.size()];
int q = 0;
for (Byte current : bytes) {
array[q] = current;
q++;
}
try {
output.setText(new String(array, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
out.write(i);
});
}
}
更新2
经过一些优化,这就是我最终得到的代码。
//Cut all the imports
public class LogScreen {
private static TextArea textArea = new TextArea();
private static List<Byte> bytes = new ArrayList<>();
//And some other unnecessary variables
public static void show() {
update();
logStage.showAndWait();
}
public static void init() {
//Cut window initialization
PrintStream ps = new PrintStream(new Console(), true);
System.setOut(ps);
System.setErr(ps);
}
public static void update() {
byte[] array = new byte[bytes.size()];
int q = 0;
for (Byte current : bytes) {
array[q] = current;
q++;
}
try {
textArea.setText(new String(array, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static class Console extends OutputStream {
private PrintStream out;
public Console() {
out = System.out;
}
@Override
public void write(int i) throws IOException {
Platform.runLater(() -> {
bytes.add((byte)i);
out.write(i);
if (logStage.isShowing()) {
update();
}
});
}
@Override
public void write(byte[] i) {
Platform.runLater(() -> {
for (byte b : i) {
bytes.add(b);
out.write(b);
}
if (logStage.isShowing()) {
update();
}
});
}
}
}
最佳答案
它不能这样工作。
来自 OutputStream.write(int)
的 javadoc
Writes the specified byte to this output stream. The general contract for write is that one
byte is written to the output stream. The byte to be written is the eight low-order bits
of the argument b. The 24 high-order bits of b are ignored.
这意味着对于由两个字节组成的任何字符(例如 П
- 0xD0、0x9F),此方法将被调用两次。但是,如果您使用 PrintStream.print(String.valueOf((char) i)) ,您将根据默认编码创建基于这些单字节的字符。这会导致您的示例出现乱码输出。
您应该使用out.write(int)
,而不是使用out.print(..)
,它在字节级别而不是字符上写入。
以下代码片段将预期输出打印到控制台。
static class Console extends OutputStream {
private PrintStream out;
public Console() {
out = System.out;
}
@Override
public void write(int i) throws IOException {
out.write(i);
}
}
public static void main(String[] args) throws Exception {
Console console = new Console();
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
ps.println("Привет, мир!");
}
关于java - 创建正确处理两字节字符的自定义 OutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628536/
例如: 我使用 ObjectInput/OutputStream 通过 Socket outputStream 发送一个 byte[]: ObjectOutputStream myOutput = n
在我看来,ObjectInputStream/ObjectOutputStream和DataInputStream/DataOutputStream都可以应用于实例原始类型。当ObjectInputS
这个问题已经有答案了: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? (6 个回答)
如果我只是在输出流中调用 close(),输出是有保证的,还是需要我总是调用 flush()? 最佳答案 虽然 close 应该调用 flush,但它比这要复杂一些... 首先,装饰器(如 Buffe
我正在通过 USB 连接将数据从我的 Java 应用程序推送到另一端的 Arduino。 Arduino 只能在其末尾缓冲 64 字节的数据,因此我必须限制从我的 Java 应用程序的每个“gulp”
关注 question我之前问过:我正在实现 ByteArrayOutputStream有容量限制。我的主要限制是可用内存量。所以有这样的流os : 当我写的不止是 1MB到我需要“停止”的输出流。
在HttpServlet.doGet(...)中,我使用以下命令从OutputStream中获取HttpServletResponse: resp.getOutputStream(); 写入该输出流时
基本上,我想将控制台输出重定向到 javafx TextArea。我现在正在使用此代码。 public static void init() { //GUI code. TextArea va
我正在尝试从服务器下载文件,服务器向我发送一个没有扩展名的八位字节流,但它在 http header 中发送扩展名(名称为 fileType)。 我想做的是读取该http header ,然后将文件类
我使用一个 API(有关更多信息,请参阅下文),它接受 OutputStream 来捕获数据。相反,我想提供一个 Consumer 的 Strings 来消耗一行又一行的数据。因此我必须编写一个 Ou
我正在处理 Microsoft word 2007 文档。 我的目标是实现: 表格单元格。 段落行。 所以,我的代码可以完成这项工作,但问题是当我使用 FileOutputStream 写入文件时,它
我有一个OutputStream,可以将其初始化为OutputStreams 链。可以有任何级别的链接。唯一可以保证的是链的末尾是一个 FileOutputStream。 我需要使用 FileOutp
我正在为类制作一个简单的 Java 程序,该程序应该将变量 petName、petType 和 numVisits 输出到名为“PatientData.txt”的 txt 文件。我正确打印了 petT
我有以下代码在 Java 程序中将字节数组写入 OutputStream。 public static void write(OutputStream out, ArrayList buffer) t
所以我开始思考这将是一个简单的 1 或 2 行代码,以便我将 OutputStream 转换为字符串,以便我可以用我的逻辑更好地检查它。 所以下面的代码是我目前正在使用的代码。如果我只想将输出写入控制
Java 中的OutputStream 有一个名为flush() 的方法。根据其文档: Flushes this output stream and forces any buffered outpu
好的,我正在实现 NSOutput 和输入流。当它们被初始化时,流打开并连接到我在我的 PC 上运行的 TCPServer,但随后似乎在初始化函数之外关闭一次,或者流可能没有正确存储。我不太确定,所以
这个问题在这里已经有了答案: How do you clear a stringstream variable? (9 个回答) 关闭 9 年前。 目前我正在像这样将一些数据存储到输出流中 std:
我想写入正在运行的进程(不是 Java)的标准输入。如何直接获取 Process 对象或 OutputStream? Runtime.getRuntime() 只能帮助我产生新的东西,而不是找到现有的
将一些处理后的内容写出到输出流后,我需要重新访问流的开头并写出一些内容元数据。我正在写入的数据非常大,多达 4Gb,并且可能会直接写入文件或内存缓冲区,具体取决于各种环境因素。 如何实现一个 Outp
我是一名优秀的程序员,十分优秀!