Search code examples
javaiso

Get file system from .iso doesn't work using loopy and common vfs. (JAVA)


I need to read(only) the file system from .iso file. I use "commons-vfs" (pre vfs2 package) and "loopy" plugin to do so. (lack of examples and absolutely no documentation about loopy, makes it a lot harder to understand what todo)

This exception is thrown if I start the application:

Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: org.apache.commons.vfs.provider.AbstractLayeredFileProvider.parseUri(Ljava/lang/String;)Lorg/apache/commons/vfs/FileName;
at org.apache.commons.vfs.provider.AbstractLayeredFileProvider.findFile(AbstractLayeredFileProvider.java:48)
at org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:505)
at org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:483)
at org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:453)
at ddViewer.launcher.Launcher.jButton2ActionPerformed(Launcher.java:145)
at ddViewer.launcher.Launcher.access$200(Launcher.java:24)
at ddViewer.launcher.Launcher$3.actionPerformed(Launcher.java:74)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6527)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6292)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4883)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Code:

this.fileSystemManager = new DefaultFileSystemManager(); //global
.
.   
.
File iso = new File(jTextField_chosenISO.getText());
        if (iso.exists()) {
            try {                         
                this.fileSystemManager.addProvider("iso", new IsoFileProvider());

                String filePath = iso.getAbsolutePath();
                filePath = filePath.replaceAll("\\\\", "/");
                System.out.println(filePath);

                IsoFileObject ifo = (IsoFileObject)this.fileSystemManager.resolveFile("iso:"+filePath);
                //do stuff

            } catch (FileSystemException ex) {
                Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

Any other way to get file system from .iso files are welcome. Just need to get some infos from .txt files contained in this damn iso.


Solution

  • After importing the jar in your project (you can also add the maven dependency loopy-vfs), you can open the file like any other Apache Common VFS:

    import org.apache.commons.vfs.*;
    
    public class IsoReader {
    
        public static void main(String[] args) throws FileSystemException {
            FileSystemManager fsManager = VFS.getManager();
            FileObject isoFile = fsManager.resolveFile("iso:/path/to/file.iso");
        }
    
    }
    

    After that you can use the methods available for FileObject. You could use resolveFile("file") again on isoFile to retrieve a file inside the iso, and then use getContent() to obtain a FileContent object that you can read.