Parsing 如何在JavaFX8中使用Univocity解析器?

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

如何在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 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移动到与类文件相同的文件夹中,谢谢!