繁体   English   中英

使用java在不写入磁盘的情况下读取tar文件内容

[英]Reading tar file content without writing on disk using java

我有 tar 文件。我需要读取 tar 文件内容并对这些内容进行一些逻辑处理。这个 tar 文件可能包含不同的文件格式,如 xml、xslt、txt。 只需要读取 xml 文件并使用该内容来执行一些业务逻辑。

我正在使用 Apache Commons 库读取 tar 文件的内容。但它首先将内容写入本地磁盘,然后读取内容。是否可以只读取 tar 内容而不写入本地磁盘。

public void untar(){
        final List<File> untaredFiles = new LinkedList<File>();
                InputStream is;
                try {
                    is = new FileInputStream(inputFile);

                final TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is);
                TarArchiveEntry entry = null;
                int offset;
                 Map<String,Map<String,String>> filteredMap = new HashMap<String, Map<String,String>>();
                    while ((entry = (TarArchiveEntry)debInputStream.getNextEntry()) != null) {
                            final File outputFile = new File(outputDir, entry.getName());
                            if (entry.isDirectory()) {

                                if (!outputFile.exists()) {

                                    if (!outputFile.mkdirs()) {
                                        throw new IllegalStateException(String.format("Couldn't create directory %s.", outputFile.getAbsolutePath()));
                                    }
                                }
                            } else {

                                if(entry.getName().contains("test.xml")){

                                   final OutputStream outputFileStream = new FileOutputStream(outputFile); 
                                    IOUtils.copy(debInputStream, outputFileStream);
                                    outputFileStream.close();


                                    Map<String, String> defectXmlMap=   ConfigXMLParser.parseXML(outputFile.getAbsolutePath());
                                    if(!defectXmlMap.isEmpty()){
                                        filteredMap.put(outputFile.getAbsolutePath(), defectXmlMap);    
                                    }

                                }

                            }
                            untaredFiles.add(outputFile);
                        }
                    System.out.println("Final Filtered Map :"+filteredMap);
                    debInputStream.close(); 
                } catch (FileNotFoundException e) {
                    System.out.println("File Not Found Exception occured");
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("IOException Exception occured");
                    e.printStackTrace();
                } catch (ArchiveException e) {
                    System.out.println("ArchiveException Exception occured");
                    e.printStackTrace();
                }

        In above code if I comment below block I can't read the content of the xml.

        final OutputStream outputFileStream = new FileOutputStream(outputFile); 
        IOUtils.copy(debInputStream, outputFileStream);
        outputFileStream.close();
    }



public static Map<String, String> parseXML(String tarFilePath){

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                        factory.setNamespaceAware(true);
                        DocumentBuilder builder;

                        Document xmlDoc = null;
                        Map<String, String> testMap = null;
                        Map<String, String> mismatchMap = null;

                        try{
                            builder = factory.newDocumentBuilder();
                            xmlDoc = builder.parse(tarFilePath);

                            XPathFactory xpathFactory = XPathFactory.newInstance();

                            XPath xpath = xpathFactory.newXPath();

                            NodeList nodeList = (NodeList) xpath.evaluate(
                                    "/tests/testg/@environment", xmlDoc,
                                    XPathConstants.NODESET);

                            testMap = new HashMap<String, String>();
                            mismatchMap = new HashMap<String, String>();

                            String environment = "";
                            String testURL  = gettestingURLByEnv("TEST",xmlDoc,xpath);
                            System.out.println("TEST URL :"+testURL);
                            String testEnvURL  ="";
                            for (int i = 0; i < nodeList.getLength(); i++) {
                                 environment = nodeList.item(i).getFirstChild().getNodeValue();
                                 if(!"TEST".equals(environment)){
                                     testEnvURL = gettestingURLByEnv(environment, xmlDoc, xpath);
                                     if(routEnvURL.equals(testURL)){
                                         mismatchMap.put(environment, testEnvURL);
                                     }
                                 }
                            }
                            System.out.println("Mismatched Entry :"+mismatchMap);
                        }catch(Exception exp){
                            exp.printStackTrace();
                        }
                        return mismatchMap;
        }

这是从存档中读取所有文件内容的代码:

TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(
        new GzipCompressorInputStream(inputStream));
TarArchiveEntry tarArchiveEntry = null;
BufferedReader bufferedReader = null;
try {
    while ((tarArchiveEntry = tarArchiveInputStream.getNextTarEntry()) != null) {
        System.out.println(tarArchiveEntry.getName() + ": " + (tarArchiveEntry.isFile() ? "F" : "D"));
        if (tarArchiveEntry.isFile()) {
            bufferedReader = new BufferedReader(new InputStreamReader(tarArchiveInputStream));
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(tarArchiveEntry.getName() + ": " + line);
            }
        }
    }
} finally {
    if (bufferedReader != null) {
        try {
            bufferedReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM