当前位置: 首页 > 知识库问答 >
问题:

如何从jar文件中访问资源文件[重复]

卫深
2023-03-14
java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(Unknown Source)
    at com.test.Main.main(Main.java:15)
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类

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();
    }       
}

共有1个答案

陶飞鸿
2023-03-14

这些并不是真正的file,它们是嵌入式资源。

您可以手动打开它们,因为.jar.zip文件,其中资源是文件。但这不是一种处理它们的好方法。

但是,您可以将其打开为stream。所以:

InputStream s = Main.class.getResourceAsStream("/xml/carParts.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(s);
//process document
 类似资料:
  • 我有一个资源文件夹/包在我的项目的根,我"不"想要加载某个文件。如果我想加载某个文件,我会使用class.getResourceAsStream,我会没事的!!我实际上想做的是在资源文件夹中加载一个“文件夹”,循环该文件夹中的文件,并获得每个文件的流,并在内容中读取...假设在运行时之前没有确定文件名...那我该怎么办?有没有一种方法来获得一个文件夹中的文件列表在您的jar文件?请注意,带有资源的

  • 问题内容: 嗨,我已经将我的Java项目导出为可执行jar文件。在我的项目中,我正在访问包含一些数据的Excel文件。现在,当我尝试访问Excel文件时,我将无法访问它。 我的项目结构是: Java_Project_Folder -src_Folder -resources_Folder(包含Excel文件) 我正在像访问Excel文件 我尝试使用以下方式访问此文件: 但是我进入的是空异常。有什么

  • 但我进的是空异常。有什么问题,有人能帮忙吗?

  • 问题内容: 我有一个带有工具栏的Java项目,该工具栏上带有图标。这些图标存储在名为resources /的文件夹中,因此路径可能是“ resources / icon1.png”。该文件夹位于我的src目录中,因此在编译后,该文件夹将被复制到bin / 我正在使用以下代码访问资源。 (imageName将为“ resources / icon1.png”等)。在Eclipse中运行时,效果很好。

  • 问题内容: 我正在尝试从作为桌面应用程序运行的单独jar中访问jar文件中的XML文件。我可以获取所需文件的URL,但是当我将其传递给FileReader(作为字符串)时,我得到了FileNotFoundException,上面写着“文件名,目录名或卷标语法不正确”。 作为参考,我毫不费力地从同一个jar中读取图像资源,并将URL传递给ImageIcon构造函数。这似乎表明我用来获取URL的方法是

  • 问题内容: 我在项目的根目录中有一个资源文件夹/程序包,我“不想”加载某个文件。如果我想加载某个文件,我将使用class.getResourceAsStream,我会很好的!我实际上想要做的是在资源文件夹中加载一个“文件夹”,循环访问该文件夹中的文件,并获取每个文件的流,并读取内容…假设在运行时之前未确定文件名… 我该怎么办?有没有一种方法可以获取jar文件中“文件夹”中文件的列表?请注意,带有资