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.
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.