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;
|
package org.apache.poi.hpsf.examples;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.apache.poi.hpsf.CustomProperties;
|
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.DirectoryEntry;
|
||||||
import org.apache.poi.poifs.filesystem.DocumentEntry;
|
import org.apache.poi.poifs.filesystem.DocumentEntry;
|
||||||
import org.apache.poi.poifs.filesystem.DocumentInputStream;
|
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
|
* <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.
|
/* Read the name of the POI filesystem to modify from the command line.
|
||||||
* For brevity to boundary check is performed on the command-line
|
* For brevity to boundary check is performed on the command-line
|
||||||
* arguments. */
|
* arguments. */
|
||||||
File poiFilesystem = new File(args[0]);
|
File summaryFile = new File(args[0]);
|
||||||
|
|
||||||
/* Open the POI filesystem. */
|
/* Open the POI filesystem. */
|
||||||
InputStream is = new FileInputStream(poiFilesystem);
|
NPOIFSFileSystem poifs = new NPOIFSFileSystem(summaryFile, false);
|
||||||
POIFSFileSystem poifs = new POIFSFileSystem(is);
|
|
||||||
is.close();
|
|
||||||
|
|
||||||
/* Read the summary information. */
|
/* Read the summary information. */
|
||||||
DirectoryEntry dir = poifs.getRoot();
|
DirectoryEntry dir = poifs.getRoot();
|
||||||
@ -174,6 +168,7 @@ public class ModifyDocumentSummaryInformation {
|
|||||||
|
|
||||||
/* Read a custom property. */
|
/* Read a custom property. */
|
||||||
Object value = customProperties.get("Sample Number");
|
Object value = customProperties.get("Sample Number");
|
||||||
|
System.out.println("Custom Sample Number is now " + value);
|
||||||
|
|
||||||
/* Write the custom properties back to the document summary
|
/* Write the custom properties back to the document summary
|
||||||
* information. */
|
* information. */
|
||||||
@ -185,10 +180,9 @@ public class ModifyDocumentSummaryInformation {
|
|||||||
dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
|
dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
|
||||||
|
|
||||||
/* Write the POI filesystem back to the original file. Please note that
|
/* Write the POI filesystem back to the original file. Please note that
|
||||||
* in production code you should never write directly to the origin
|
* in production code you should take care when write directly to the
|
||||||
* file! In case of a writing error everything would be lost. */
|
* origin, to make sure you don't loose things on error */
|
||||||
OutputStream out = new FileOutputStream(poiFilesystem);
|
poifs.writeFilesystem();
|
||||||
poifs.writeFilesystem(out);
|
poifs.close();
|
||||||
out.close();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,6 +693,12 @@ public class NPOIFSFileSystem extends BlockStore
|
|||||||
"not be called. Use writeFilesystem(OutputStream) instead"
|
"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();
|
syncWithDataSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,10 @@ public class FileBackedDataSource extends DataSource {
|
|||||||
this.writable = !readOnly;
|
this.writable = !readOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isWriteable() {
|
||||||
|
return this.writable;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuffer read(int length, long position) throws IOException {
|
public ByteBuffer read(int length, long position) throws IOException {
|
||||||
if(position >= size()) {
|
if(position >= size()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user