如何从jar文件访问资源文件 [英] How to access resource files from jar file
问题描述
我已经读过很多类似的文章,但是我找不到解决我问题的方法:我需要验证和解析xml文件. (针对xsd模式的验证).问题是,在我的方法中,当我运行:mvn程序包,然后运行jar文件时,出现以下错误:
I've read a bunch of similar posts, but i can't find a solution for my problem: i need to validate and parse xml files. (validation against xsd schema). The problem is that on my approach, when i run: mvn package and then run the jar file i get the following error:
java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(Unknown Source)
at com.test.Main.main(Main.java:15)
这是我尝试过的:
之后的源代码
如何在不发生流关闭异常的情况下将InputStream作为多个方法的参数传递?这是正确的方法吗?
How can I pass an InputStream as parameter for multiple methods without getting stream closed exception? It is a correct approach?
public class DOMParserFile {
private InputStream inputXML;
private InputStream inputXSD;
private Set<CarPart> carParts;
public DOMParserFile(InputStream xmlFile, InputStream xsdFile) {
this.inputXML = xmlFile;
this.inputXSD = xsdFile;
carParts = new HashSet<CarPart>();
}
public void readFromXMLFile() throws Exception {
if (XMLFileValidator.validateAgainstXSD(inputXML, inputXSD)) {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = builderFactory
.newDocumentBuilder();
Document doc = builder.parse(inputXML);
// get the carPart nodes
NodeList carPartList = doc.getElementsByTagName("carPart");
// store car parts into a list
for (int i = 0; i < carPartList.getLength(); i++) {
// build new car part object
CarPart carPart = new CarPart();
Node carPartNode = carPartList.item(i);
if (carPartNode.getNodeType() == Node.ELEMENT_NODE) {
Element elem = (Element) carPartNode;
// set id
carPart.setId(elem.getElementsByTagName("id").item(0)
.getTextContent());
// set name
carPart.setName(elem.getElementsByTagName("name").item(0)
.getTextContent());
// set description
carPart.setDescription(elem
.getElementsByTagName("description").item(0)
.getTextContent());
// set quantity
carPart.setQuantity(Integer.valueOf(elem
.getElementsByTagName("quantity").item(0)
.getTextContent()));
// set manufacturer
carPart.setPartManufact(elem
.getElementsByTagName("partManufacturer").item(0)
.getTextContent());
// set price
carPart.setPrice(Double.valueOf(elem
.getElementsByTagName("price").item(0)
.getTextContent()));
// get the list of available vehicles
NodeList vehicleNodeList = ((Element) carPartNode)
.getElementsByTagName("availableFor");
Set<Vehicle> availableVehicles = new HashSet<Vehicle>();
for (int j = 0; j < vehicleNodeList.getLength(); j++) {
Vehicle vehicle = new Vehicle();
Node vehicleNode = vehicleNodeList.item(j);
if (vehicleNode.getNodeType() == Node.ELEMENT_NODE) {
Element vehicleELement = (Element) vehicleNode;
// set vehicle's make
vehicle.setMake(vehicleELement
.getElementsByTagName("make").item(0)
.getTextContent());
// set vehicle's model
vehicle.setModel(vehicleELement
.getElementsByTagName("model").item(0)
.getTextContent());
// get the available list of years of fabrication
// for
// this vehicle
NodeList yearsList = ((Element) vehicleNode)
.getElementsByTagName("fabricationYear");
Set<Integer> years = new HashSet<Integer>();
for (int k = 0; k < yearsList.getLength(); k++) {
Node yearNode = yearsList.item(k);
if (yearNode.getNodeType() == Node.ELEMENT_NODE) {
Element yearElem = (Element) yearNode;
years.add(Integer.valueOf(yearElem
.getAttribute("yearAttr")));
}
}
vehicle.setFabYears(years);
availableVehicles.add(vehicle);
}
}
carPart.setVehicles(availableVehicles);
}
carParts.add(carPart);
}
}
}
public void printCarParts(){
for(CarPart p :carParts){
p.output();
}
}
}
XMLFileValidator类
XMLFileValidator class
public class XMLFileValidator {
public static boolean validateAgainstXSD(InputStream xmlFile, InputStream xsdFile)
{
try
{
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(xsdFile));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(xmlFile));
System.out.println("The XML file IS valid");
return true;
}
catch(Exception ex)
{
System.out.println("The XML file is NOT valid");
System.out.println("Reason: " + ex.getLocalizedMessage());
ex.printStackTrace();
return false;
}
}
}
主班
public class Main {
public static void main(String args[]){
try {
InputStream inXML = Main.class.getResourceAsStream("/xml/carParts.xml");
InputStream inXSD = Main.class.getResourceAsStream("/xml/carPartsWarehouse.xsd");
//1. dom parsing method
System.out.println("**********************DOM PARSING METHOD************************");
DOMParserFile dom = new DOMParserFile(inXML,inXSD);
dom.readFromXMLFile();
dom.printCarParts();
//2. sax parsing method
System.out.println("***********************SAX PARSING METHOD*************************");
SAXParserFile sax = new SAXParserFile(inXML,inXSD);
sax.readDataFromXml();
sax.printCarParts();
//3. stax parsing method
System.out.println("***********************StAX PARSING METHOD*************************");
StAXParserFile stax = new StAXParserFile(inXML,inXSD);
stax.readFromXml();
stax.printCarParts();
} catch (URISyntaxException e1) {
e1.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
推荐答案
这些不是真正的File
,它们是嵌入式资源.
Well these are not really File
s, they are embedded resources.
您可以手动打开它们,因为.jar
是.zip
文件,其中资源是文件.但这不是处理它们的好方法.
You can open them manually since .jar
's are .zip
files where the resources are files. But that's not an elegant way to process them.
不过,您可以打开 Stream
.所以:
You can however open then as Stream
. So:
InputStream s = Main.class.getResourceAsStream("/xml/carParts.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(s);
//process document
这篇关于如何从jar文件访问资源文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!