Bundles { public static Bundle openBundleReadOnly(Path zip) throws IOException { Path tmpBundle = temporaryBundle(); copy(zip, tmpBundle); BundleFileSystem fs = newFileSystemFromExisting(tmpBundle); return new Bundle(fs.getRootDirectory(), true); }  static void closeAndSaveBundle(Bundle bundle, Path destination); static Path closeBundle(Bundle bundle); static void copyRecursively(final Path source,
			final Path destination, final CopyOption... copyOptions); static Bundle createBundle(); static Bundle createBundle(Path path); static void deleteRecursively(Path p); static Path getAnnotations(Bundle bundle); static Path getManifestPath(Bundle bundle); static String getMimeType(Bundle bundle); static URI getReference(Path path); static String getStringValue(Path path); static boolean isMissing(Path item); static boolean isReference(Path path); static boolean isValue(Path path); static Bundle openBundle(InputStream in); static Bundle openBundle(Path zip); static Bundle openBundle(URL url); static Bundle openBundleReadOnly(Path zip); static void safeCopy(Path source, Path destination); static void safeMove(Path source, Path destination); static void setMimeType(Bundle bundle, String mimetype); static Path setReference(Path path, URI ref); static void setStringValue(Path path, String string); static Path uriToBundlePath(Bundle bundle, URI uri);  }
@Test public void openBundleReadOnly() throws Exception { Path untouched = Files .createTempFile("test-openBundleReadOnly", ".zip"); try (Bundle bundle = Bundles.createBundle(untouched)) { Bundles.setStringValue(bundle.getRoot().resolve("file.txt"), "Untouched"); } try (Bundle readOnly = Bundles.openBundleReadOnly(untouched)) { Path file = readOnly.getRoot().resolve("file.txt"); Bundles.setStringValue(file, "Modified"); assertEquals("Modified", Bundles.getStringValue(file)); Path newFile = readOnly.getRoot().resolve("newfile.txt"); Files.createFile(newFile); assertTrue(Files.exists(newFile)); } try (Bundle readOnly = Bundles.openBundleReadOnly(untouched)) { Path file = readOnly.getRoot().resolve("file.txt"); assertEquals("Untouched", Bundles.getStringValue(file)); Path newfile = readOnly.getRoot().resolve("newfile.txt"); assertFalse(Files.exists(newfile)); } }