При Linux я получаю ошибку сегментации, когда пытаюсь прочитать двоичный файл как символы UTF-8 и отображать их с помощью javafx.scene.Text
. Я понятия не имею, что такое враждебные символы, и я не смог успешно отобразить бинарный файл. Это никогда не происходит при Windows, и если я использую другую кодировку, например StandardCharsets.ISO_8859_1
, это также никогда не происходит.
РЕДАКТИРОВАТЬ: Добавлен компилируемый пример (это всегда вылетает для меня, мой дистрибутив Linux - Solus) :
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Hello World!");
Text text = new Text();
// Replace with an existing file
Path path = Paths.get("/home/myname/Test/Rubik-Black.ttf");
InputStream input = Files.newInputStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
char[] buffer = new char[50000];
reader.read(buffer);
String str = new String(buffer);
StackPane root = new StackPane();
root.getChildren().add(text);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
Platform.runLater(() -> {
text.setText(str);
});
}
}
Фрагмент стека трассировки показывает, что проблема, похоже, заключается в библиотеке libpan go (библиотека рендеринга шрифтов / компоновки, используемая JavaFX):
(0x00007FC796177407 [libpango-1.0.so.0+0x20407])
pango_itemize_with_base_dir+0xbf (0x00007FC7961784BF [libpango-1.0.so.0+0x214bf])
pango_itemize+0x59 (0x00007FC796178839 [libpango-1.0.so.0+0x21839])
(0x00007FC81F968DC4 [libj9vm29.so+0x137dc4])
(0x00007FC81F9664D7 [libj9vm29.so+0x1354d7])
(0x00007FC81F85325A [libj9vm29.so+0x2225a])
(0x00007FC81F843B10 [libj9vm29.so+0x12b10])
(0x00007FC81F8FED82 [libj9vm29.so+0xcdd82])
Согласно фрагменту, также кажется, что JavaFX использует очень старую версию libpan go - 1.0, выпущенную в 2009 году.
Кто-нибудь еще сталкивался с этой проблемой и имеет возможные обходные пути - кроме изменения кодировки?
Мой вариант использования заключается в том, что в моем приложении есть функция «принудительного текстового просмотра», которая отображает файл как текстовый.