Update the HPSF change properties example to use NPOIFS + in-place writes, and have NPOIFS give a helpful error if you try to in-place write on a read only open
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590577 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a57e1f1fa6
commit
3a5825c43f
@ -18,12 +18,8 @@
|
||||
package org.apache.poi.hpsf.examples;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Date;
|
||||
|
||||
import org.apache.poi.hpsf.CustomProperties;
|
||||
@ -38,7 +34,7 @@ import org.apache.poi.hpsf.WritingNotSupportedException;
|
||||
import org.apache.poi.poifs.filesystem.DirectoryEntry;
|
||||
import org.apache.poi.poifs.filesystem.DocumentEntry;
|
||||
import org.apache.poi.poifs.filesystem.DocumentInputStream;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
||||
|
||||
/**
|
||||
* <p>This is a sample application showing how to easily modify properties in
|
||||
@ -99,12 +95,10 @@ public class ModifyDocumentSummaryInformation {
|
||||
/* Read the name of the POI filesystem to modify from the command line.
|
||||
* For brevity to boundary check is performed on the command-line
|
||||
* arguments. */
|
||||
File poiFilesystem = new File(args[0]);
|
||||
File summaryFile = new File(args[0]);
|
||||
|
||||
/* Open the POI filesystem. */
|
||||
InputStream is = new FileInputStream(poiFilesystem);
|
||||
POIFSFileSystem poifs = new POIFSFileSystem(is);
|
||||
is.close();
|
||||
NPOIFSFileSystem poifs = new NPOIFSFileSystem(summaryFile, false);
|
||||
|
||||
/* Read the summary information. */
|
||||
DirectoryEntry dir = poifs.getRoot();
|
||||
@ -174,6 +168,7 @@ public class ModifyDocumentSummaryInformation {
|
||||
|
||||
/* Read a custom property. */
|
||||
Object value = customProperties.get("Sample Number");
|
||||
System.out.println("Custom Sample Number is now " + value);
|
||||
|
||||
/* Write the custom properties back to the document summary
|
||||
* information. */
|
||||
@ -185,10 +180,9 @@ public class ModifyDocumentSummaryInformation {
|
||||
dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
|
||||
|
||||
/* Write the POI filesystem back to the original file. Please note that
|
||||
* in production code you should never write directly to the origin
|
||||
* file! In case of a writing error everything would be lost. */
|
||||
OutputStream out = new FileOutputStream(poiFilesystem);
|
||||
poifs.writeFilesystem(out);
|
||||
out.close();
|
||||
* in production code you should take care when write directly to the
|
||||
* origin, to make sure you don't loose things on error */
|
||||
poifs.writeFilesystem();
|
||||
poifs.close();
|
||||
}
|
||||
}
|
||||
|
@ -693,6 +693,12 @@ public class NPOIFSFileSystem extends BlockStore
|
||||
"not be called. Use writeFilesystem(OutputStream) instead"
|
||||
);
|
||||
}
|
||||
if (! ((FileBackedDataSource)_data).isWriteable()) {
|
||||
throw new IllegalArgumentException(
|
||||
"POIFS opened in read only mode, so writeFilesystem() may " +
|
||||
"not be called. Open the FileSystem in read-write mode first"
|
||||
);
|
||||
}
|
||||
syncWithDataSource();
|
||||
}
|
||||
|
||||
|
@ -50,6 +50,10 @@ public class FileBackedDataSource extends DataSource {
|
||||
this.writable = !readOnly;
|
||||
}
|
||||
|
||||
public boolean isWriteable() {
|
||||
return this.writable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer read(int length, long position) throws IOException {
|
||||
if(position >= size()) {
|
||||
|
Loading…
Reference in New Issue
Block a user