如何从jar文件访问资源文件 [英] How to access resource files from jar file

查看:54
本文介绍了如何从jar文件访问资源文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经读过很多类似的文章,但是我找不到解决我问题的方法:我需要验证和解析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 Files, 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆