Parsing 如何在JavaFX8中使用Univocity解析器?
如何在JavaFX8中使用Univocity解析器 IntelliJ正被用于此。IntelliJ在编码上下文中没有给出警告,但在运行代码时会出现错误 以下是代码和堆栈跟踪(缩写): Main.java:Parsing 如何在JavaFX8中使用Univocity解析器?,parsing,csv,javafx,Parsing,Csv,Javafx,如何在JavaFX8中使用Univocity解析器 IntelliJ正被用于此。IntelliJ在编码上下文中没有给出警告,但在运行代码时会出现错误 以下是代码和堆栈跟踪(缩写): Main.java: package parse; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import
package parse;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("parse.fxml"));
primaryStage.setTitle("Parse Test");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Controller.java:
package parse;
import com.univocity.parsers.common.processor.RowListProcessor;
import com.univocity.parsers.csv.CsvParser;
import com.univocity.parsers.csv.CsvParserSettings;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class Controller {
@FXML
private TextArea textArea;
public Controller() {
}
@FXML
private void initialize() {
}
public void print(String message) {
textArea.appendText(message);
}
public Reader getReader(String relativePath) {
try {
return new InputStreamReader(this.getClass().getResourceAsStream(relativePath), "Windows-1252");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Unable to read input", e);
}
}
@FXML
public void columnSelection() {
print("this is the parsing method" + System.getProperty("line.separator"));
RowListProcessor rowProcessor = new RowListProcessor();
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setRowProcessor(rowProcessor);
parserSettings.setHeaderExtractionEnabled(true);
parserSettings.setLineSeparatorDetectionEnabled(true);
parserSettings.setSkipEmptyLines(true);
parserSettings.getFormat().setDelimiter(',');
// Here we select only the columns "Price", "Year" and "Make".
// The parser just skips the other fields
parserSettings.selectFields("AUTHOR", "ISBN");
CsvParser parser = new CsvParser(parserSettings);
parser.parse(getReader("list3.csv"));
List<String[]> rows = rowProcessor.getRows();
String[] strings = rows.get(0);
print(strings[0]);
}
}
包解析;
导入com.univocity.parsers.common.processor.RowListProcessor;
导入com.univocity.parsers.csv.CsvParser;
导入com.univocity.parsers.csv.CsvParserSettings;
导入javafx.fxml.fxml;
导入javafx.scene.control.TextArea;
导入java.io.InputStreamReader;
导入java.io.Reader;
导入java.io.UnsupportedEncodingException;
导入java.util.List;
公共类控制器{
@FXML
私人文本区文本区;
公共控制员(){
}
@FXML
私有void初始化(){
}
公共作废打印(字符串消息){
textArea.appendText(消息);
}
公共读取器getReader(字符串相对路径){
试一试{
返回新的InputStreamReader(this.getClass().getResourceAsStream(relativePath),“Windows-1252”);
}捕获(不支持的编码异常e){
抛出新的IllegalStateException(“无法读取输入”,e);
}
}
@FXML
公共选择(){
print(“这是解析方法”+System.getProperty(“line.separator”);
RowListProcessor rowProcessor=新的RowListProcessor();
CsvParserSettings parserSettings=新的CsvParserSettings();
setRowProcessor(rowProcessor);
parserSettings.setHeaderExtractionEnabled(true);
已启用parserSettings.setLineSeparatorDetectionEnabled(true);
parserSettings.setskipmptylines(true);
parserSettings.getFormat().setDelimiter(',');
//这里我们只选择“价格”、“年份”和“制造”列。
//解析器只是跳过其他字段
选择字段(“作者”、“ISBN”);
CsvParser parser=新的CsvParser(parserSettings);
parser.parse(getReader(“list3.csv”);
List rows=rowProcessor.getRows();
String[]strings=rows.get(0);
打印(字符串[0]);
}
}
parse.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="279.0" prefWidth="322.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="parse.Controller">
<center>
<Button mnemonicParsing="false" onAction="#columnSelection" text="Parse" BorderPane.alignment="CENTER" />
</center>
<top>
<TextArea fx:id="textArea" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</top>
</BorderPane>
堆栈跟踪:
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1770)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
Caused by: java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:97)
at parse.Controller.getReader(Controller.java:34)
at parse.Controller.columnSelection(Controller.java:60)
... 56 more
线程“JavaFX应用程序线程”java.lang.RuntimeException中的异常:java.lang.reflect.InvocationTargetException
在javafx.fxml.fxmloader$MethodHandler.invoke(fxmloader.java:1770)
在javafx.fxml.fxmloader$ControllerMethodEventHandler.handle(fxmloader.java:1653)
在com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)上
原因:java.lang.NullPointerException
在java.io.Reader上。(Reader.java:78)
位于java.io.InputStreamReader。(InputStreamReader.java:97)
位于parse.Controller.getReader(Controller.java:34)
位于parse.Controller.columnSelection(Controller.java:60)
... 56多
这看起来就是找不到资源。list3.csv是否与
Controller
在同一个包中,并与类文件一起部署(即,到您的bin或classes目录,或者到jar文件,如果从jar运行的话?)就是这样,我只需将list3.csv移动到与类文件相同的文件夹中,谢谢!