Питер,
Я столкнулся с подобной проблемой, и, поскольку вы новичок в этом, я начну с этого: когда вы упаковываете файл в jar, он сжимается и, таким образом, обращается к нему, как у вас в оригинальный код не будет работать, так как мы не можем прочитать файлы, сжатые в банке. Вместо этого вам нужно попросить Java вытащить этот ресурс в виде потока (как и многие другие любезно указали), который Java знает, как предоставить вам.
Теперь вывод файла оттуда - это боль. Вот некоторый код, который я написал некоторое время назад, чтобы сделать это, который, конечно, из какого-то другого источника, который я нашел. Заполните исключения по мере необходимости! =)
InputStream in = null;
in = this.getClass().getResourceAsStream("/main.cc");
File outputFile = createMainOutputFile();
OutputStream out = null;
try {
out = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
System.out.println(outputFile + " was not found!");
e.printStackTrace();
}
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
try {
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
На самом деле мы должны выводить файл по частям, к сожалению, я знаю, я действительно хочу, чтобы то, что вы надеялись сделать, сработало! Это сделало бы жизнь намного проще. Единственное, что может сбить с толку - это вызов createMainOutputFile (), так что вот код для этого тоже ...
private File createMainOutputFile() {
File directoryPath = new File(mainOutputFolder);
directoryPath.mkdirs();
File newFile = new File (mainOutputFolder + "main.cc");
try {
newFile.createNewFile();
} catch (IOException e) {
System.out.println("failed To create new file.");
e.printStackTrace();
}
return newFile;
}
Удачи!
Редактировать: Теперь, когда я заметил, что вы на самом деле анализируете его с помощью синтаксического анализатора XML, я укажу вам, что если вы используете синтаксический анализатор SAX (по крайней мере, Apache), вы обнаружите, что он действительно принимает inputStream так же, как и файл:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
docBuilder = docFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//Here we supply the inputStream instead of the file...
doc = docBuilder.parse(inputStream);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Node xmlRoot = doc.getFirstChild();