Java 在单元测试期间找到资源文本文件,但在程序从Netbeans运行时未找到
单元测试输出是这样的Java 在单元测试期间找到资源文本文件,但在程序从Netbeans运行时未找到,java,javafx,Java,Javafx,单元测试输出是这样的 readNameDataFile test reading text file... User directory: C:\Users\Admin\Documents\NetBeansProjects\Traveller Current directory: . File path + name: names/names.txt ClassLoader :file:/C:/Users/Admin/Documents/NetBeansProjects/Traveller/bu
readNameDataFile
test reading text file...
User directory: C:\Users\Admin\Documents\NetBeansProjects\Traveller
Current directory: .
File path + name: names/names.txt
ClassLoader :file:/C:/Users/Admin/Documents/NetBeansProjects/Traveller/build/classes/names/names.txt
test first NameData object is correct...
test fifth NameData object is correct...
test last NameData object is correct...
这是什么
Executing C:\Users\Admin\Documents\NetBeansProjects\Traveller\dist\run667857124\Traveller.jar using platform C:\Program Files\Java\jdk1.8.0_181\jre/bin/java
Database starting in embedded mode.
Connected to database TravellerDB
User directory: C:\Users\Admin\Documents\NetBeansProjects\Traveller
Current directory: .
File path + name: names/names.txt
ClassLoader : jar:file:/C:/Users/Admin/Documents/NetBeansProjects/Traveller/dist/run667857124/Traveller.jar!/names/names.txt
java.io.FileNotFoundException: file:\C:\Users\Admin\Documents\NetBeansProjects\Traveller\dist\run667857124\Traveller.jar!\names\names.txt (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileInputStream.open0(Native Method)
Shutting TravellerDB database down...
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.util.Scanner.<init>(Scanner.java:611)
at io.github.drw.traveller.io.FileReader.readNameDataFile(FileReader.java:35)
at io.github.drw.traveller.names.GeneratorModel.initNameMaps(GeneratorModel.java:85)
at io.github.drw.traveller.names.GeneratorModel.<init>(GeneratorModel.java:31)
at io.github.drw.traveller.names.GeneratorController.initialize(GeneratorController.java:65)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at io.github.drw.traveller.Main.start(Main.java:28)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Exception in Application start method
Derby shut down normally.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException:
file:/C:/Users/Admin/Documents/NetBeansProjects/Traveller/dist/run667857124/Traveller.jar!/io/github/drw/traveller/names/GeneratorView.fxml
file:/C:/Users/Admin/Documents/NetBeansProjects/Traveller/dist/run667857124/Traveller.jar!/io/github/drw/traveller/Main.fxml:38
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at io.github.drw.traveller.Main.start(Main.java:28)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
... 1 more
Caused by: java.lang.NullPointerException
at io.github.drw.traveller.io.FileReader.readNameDataFile(FileReader.java:44)
at io.github.drw.traveller.names.GeneratorModel.initNameMaps(GeneratorModel.java:85)
at io.github.drw.traveller.names.GeneratorModel.<init>(GeneratorModel.java:31)
at io.github.drw.traveller.names.GeneratorController.initialize(GeneratorController.java:65)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 23 more
Exception running application io.github.drw.traveller.Main
Java Result: 1
Deleting directory C:\Users\Admin\Documents\NetBeansProjects\Traveller\dist\run667857124
jfxsa-run:
BUILD SUCCESSFUL (total time: 8 seconds)
使用平台C:\Program Files\Java\jdk1.8.0\u 181\jre/bin/Java执行C:\Users\Admin\Documents\NetBeansProjects\traveler\dist\run667857124\traveler.jar
数据库以嵌入式模式启动。
已连接到数据库TravelerDB
用户目录:C:\Users\Admin\Documents\NetBeansProjects\Traveler
当前目录:。
文件路径+名称:names/names.txt
ClassLoader:jar:file:/C:/Users/Admin/Documents/NetBeansProjects/traveler/dist/run667857124/traveler.jar/名称/names.txt
java.io.FileNotFoundException:文件:\C:\Users\Admin\Documents\NetBeansProjects\traveler\dist\run667857124\traveler.jar\names\names.txt(文件名、目录名或卷标语法不正确)
位于java.io.FileInputStream.open0(本机方法)
正在关闭TravelerDB数据库。。。
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.util.Scanner.(Scanner.java:611)
位于io.github.drw.traveler.io.FileReader.readNameDataFile(FileReader.java:35)
在io.github.drw.traveller.names.GeneratorModel.initNameMaps(GeneratorModel.java:85)
在io.github.drw.traveler.names.GeneratorModel.(GeneratorModel.java:31)
在io.github.drw.traveler.names.GeneratorController.initialize(GeneratorController.java:65)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2548)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2441)
在javafx.fxml.fxmloader.access$2700(fxmloader.java:103)
位于javafx.fxml.fxmloader$IncludeElement.constructValue(fxmloader.java:1143)
在javafx.fxml.fxmloader$ValueElement.processStartElement(fxmloader.java:746)
在javafx.fxml.fxmloader.processStartElement(fxmloader.java:2707)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2527)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2441)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3214)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3175)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3148)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3124)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3104)
在javafx.fxml.fxmloader.load(fxmloader.java:3097)
位于io.github.drw.traveler.Main.start(Main.java:28)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$161(launchempl.java:863)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
位于java.security.AccessController.doPrivileged(本机方法)
com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95)
在com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法)
位于com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
运行(Thread.java:748)
应用程序启动方法中的异常
德比正常关闭。
java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于com.sun.javafx.application.LaunchImpl.launchApplicationWithArgs(LaunchImpl.java:389)
位于com.sun.javafx.application.LaunchImpl.launchApplication(LaunchImpl.java:328)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于sun.launcher.launchelper$FXHelper.main(launchelper.java:767)
原因:java.lang.RuntimeException:应用程序启动方法中的异常
位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:917)
在com.sun.javafx.application.launchempl.lambda$launchApplication$154(launchempl.java:182)
运行(Thread.java:748)
原因:javafx.fxml.LoadException:
文件:/C:/Users/Admin/Documents/NetBeansProjects/traveler/dist/run667857124/traveler.jar/io/github/drw/traveler/names/GeneratorView.fxml
文件:/C:/Users/Admin/Documents/NetBeansProjects/traveler/dist/run667857124/traveler.jar/io/github/drw/traveler/Main.fxml:38
位于javafx.fxml.fxmloader.constructLoadException(fxmloader.java:2601)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2579)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2441)
在javafx.fxml.fxmloader.access$2700(fxmloader.java:103)
位于javafx.fxml.fxmloader$IncludeElement.constructValue(fxmloader.java:1143)
在javafx.fxml.fxmloader$ValueElement.processStartElement(fxmloader.java:746)
在javafx.fxml.fxmloader.processStartElement(fxmloader.java:2707)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2527)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:2441)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3214)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3175)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3148)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3124)
在javafx.fxml.fxmloader.loadImpl(fxmloader.java:3104)
在javafx.fxml.fxmloader.load(fxmloader.java:3097)
位于io.github.drw.traveler.Main.start(Main.java:28)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$161(launchempl.java:863)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl.lambda$null$1
package io.github.drw.traveller.io;
import io.github.drw.traveller.names.Gender;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Reads data in from files.
*
* @author admin
*/
public class FileReader {
private final String path;
private final String fileName;
public FileReader(String path, String fileName) {
this.path = path;
this.fileName = fileName;
}
public List<NameData> readNameDataFile() {
ClassLoader classLoader = getClass().getClassLoader();
System.out.println("User directory: " + System.getProperty("user.dir"));
System.out.println("Current directory: " + new File("."));
System.out.println("File path + name: " + path + "/" + fileName);
System.out.println("ClassLoader : " + classLoader.getResource(path + "/" + fileName));
Scanner scanner = null;
final List<NameData> names = new ArrayList<>();
File file = new File(classLoader.getResource(path + "/" + fileName).getFile());
try {
scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] items = line.split(" ");
names.add(processItems(items));
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} finally {
scanner.close();
}
return names;
}
private NameData processItems(String[] items) {
Gender gender;
String item;
item = items[0];
if (item.equals("MF")) {
gender = Gender.BOTH;
} else if (item.equals("MO")) {
gender = Gender.MALE;
} else {
gender = Gender.FEMALE;
}
boolean canBeLastName;
item = items[1];
if (item.equals("LY")) {
canBeLastName = true;
} else {
canBeLastName = false;
}
String value = items[2].toLowerCase();
char[] characters = value.toCharArray();
characters[0] = Character.toUpperCase(characters[0]);
value = String.copyValueOf(characters);
return new NameData(value, gender, canBeLastName);
}
}
package io.github.drw.traveller.io;
import io.github.drw.traveller.names.Gender;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests the FileReader functionality.
*
* @author admin
*/
public class FileReaderTest {
public FileReaderTest() {
}
/**
* Test of readNameDataFile method, of class FileReader.
*/
@Test
public void testReadNameDataFile() {
System.out.println("readNameDataFile");
System.out.println("test reading text file...");
FileReader instance = new FileReader("names", "names.txt");
List<NameData> list = instance.readNameDataFile();
int expectedSize = 5163;
int actualSize = list.size();
Assert.assertEquals(expectedSize, actualSize);
System.out.println("test first NameData object is correct...");
NameData actual, expected;
expected = new NameData("Aaron", Gender.BOTH, true);
actual = list.get(0);
Assert.assertEquals(expected, actual);
System.out.println("test fifth NameData object is correct...");
expected = new NameData("Abdul", Gender.MALE, true);
actual = list.get(4);
Assert.assertEquals(expected, actual);
System.out.println("test last NameData object is correct...");
expected = new NameData("Zulma", Gender.FEMALE, false);
actual = list.get(list.size() - 1);
Assert.assertEquals(expected, actual);
}
}
public List<NameData> readNameDataFile() {
ClassLoader classLoader = getClass().getClassLoader();
System.out.println("User directory: " + System.getProperty("user.dir"));
System.out.println("Current directory: " + new File("."));
System.out.println("File path + name: " + path + "/" + fileName);
System.out.println("ClassLoader : " + classLoader.getResource(path + "/" + fileName));
final List<NameData> names = new ArrayList<>();
String line;
InputStream inputStream = classLoader.getResourceAsStream(path + "/" + fileName);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
if (inputStream != null) {
while ((line = bufferedReader.readLine()) != null) {
String[] items = line.split(" ");
names.add(processItems(items));
}
}
} catch (IOException ex) {
Logger.getLogger(FileReader.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
inputStream.close();
} catch (Throwable ignore) {
// ignore
}
}
return names;
}