HWPFDocument.write(File) support and tests #57919
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1754108 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a86686846b
commit
2beb904e86
@ -571,20 +571,39 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
return _fields;
|
return _fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning - not currently implemented for HWPF!
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void write() throws IOException {
|
public void write() throws IOException {
|
||||||
throw new IllegalStateException("Coming soon!");
|
// TODO Implement
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void write(File newFile) throws IOException {
|
|
||||||
throw new IllegalStateException("Coming soon!");
|
throw new IllegalStateException("Coming soon!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes out the word file that is represented by an instance of this class.
|
* Writes out the word file that is represented by an instance of this class.
|
||||||
*
|
*
|
||||||
* If {@code stream} is a {@link java.io.FileOutputStream} on a networked drive
|
* If the {@link File} exists, it will be replaced, otherwise a new one
|
||||||
* or has a high cost/latency associated with each written byte,
|
* will be created
|
||||||
|
*
|
||||||
|
* @param newFile The File to write to.
|
||||||
|
* @throws IOException If there is an unexpected IOException from writing
|
||||||
|
* to the File.
|
||||||
|
*
|
||||||
|
* @since 3.15 beta 3
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void write(File newFile) throws IOException {
|
||||||
|
NPOIFSFileSystem pfs = POIFSFileSystem.create(newFile);
|
||||||
|
write(pfs, true);
|
||||||
|
pfs.writeFilesystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes out the word file that is represented by an instance of this class.
|
||||||
|
*
|
||||||
|
* For better performance when writing to files, use {@link #write(File)}.
|
||||||
|
* If {@code stream} has a high cost/latency associated with each written byte,
|
||||||
* consider wrapping the OutputStream in a {@link java.io.BufferedOutputStream}
|
* consider wrapping the OutputStream in a {@link java.io.BufferedOutputStream}
|
||||||
* to improve write performance.
|
* to improve write performance.
|
||||||
*
|
*
|
||||||
@ -592,9 +611,12 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
* @throws IOException If there is an unexpected IOException from the passed
|
* @throws IOException If there is an unexpected IOException from the passed
|
||||||
* in OutputStream.
|
* in OutputStream.
|
||||||
*/
|
*/
|
||||||
public void write(OutputStream out)
|
public void write(OutputStream out) throws IOException {
|
||||||
throws IOException
|
NPOIFSFileSystem pfs = new NPOIFSFileSystem();
|
||||||
{
|
write(pfs, true);
|
||||||
|
pfs.writeFilesystem( out );
|
||||||
|
}
|
||||||
|
private void write(NPOIFSFileSystem pfs, boolean copyOtherEntries) throws IOException {
|
||||||
// initialize our streams for writing.
|
// initialize our streams for writing.
|
||||||
HWPFFileSystem docSys = new HWPFFileSystem();
|
HWPFFileSystem docSys = new HWPFFileSystem();
|
||||||
HWPFOutputStream wordDocumentStream = docSys.getStream(STREAM_WORD_DOCUMENT);
|
HWPFOutputStream wordDocumentStream = docSys.getStream(STREAM_WORD_DOCUMENT);
|
||||||
@ -891,7 +913,8 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create new document preserving order of entries
|
// create new document preserving order of entries
|
||||||
NPOIFSFileSystem pfs = new NPOIFSFileSystem();
|
// TODO Check "copyOtherEntries" and tweak behaviour based on that
|
||||||
|
// TODO That's needed for in-place write
|
||||||
boolean docWritten = false;
|
boolean docWritten = false;
|
||||||
boolean dataWritten = false;
|
boolean dataWritten = false;
|
||||||
boolean objectPoolWritten = false;
|
boolean objectPoolWritten = false;
|
||||||
@ -967,7 +990,6 @@ public final class HWPFDocument extends HWPFDocumentCore {
|
|||||||
if ( !objectPoolWritten )
|
if ( !objectPoolWritten )
|
||||||
_objectPool.writeTo( pfs.getRoot() );
|
_objectPool.writeTo( pfs.getRoot() );
|
||||||
|
|
||||||
pfs.writeFilesystem( out );
|
|
||||||
this.directory = pfs.getRoot();
|
this.directory = pfs.getRoot();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -0,0 +1,81 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.hwpf.usermodel;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.HWPFDocument;
|
||||||
|
import org.apache.poi.hwpf.HWPFTestCase;
|
||||||
|
import org.apache.poi.hwpf.HWPFTestDataSamples;
|
||||||
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
import org.apache.poi.util.TempFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test various write situations
|
||||||
|
*/
|
||||||
|
public final class TestHWPFWrite extends HWPFTestCase {
|
||||||
|
/**
|
||||||
|
* Write to a stream
|
||||||
|
*/
|
||||||
|
public void testWriteStream() throws Exception {
|
||||||
|
HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
|
||||||
|
|
||||||
|
Range r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
doc.write(baos);
|
||||||
|
doc.close();
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
|
||||||
|
doc = new HWPFDocument(bais);
|
||||||
|
r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
doc.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write to a new file
|
||||||
|
*/
|
||||||
|
public void testWriteNewFile() throws Exception {
|
||||||
|
HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
|
||||||
|
|
||||||
|
Range r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
|
||||||
|
File file = TempFile.createTempFile("TestDocument", ".doc");
|
||||||
|
doc.write(file);
|
||||||
|
doc.close();
|
||||||
|
|
||||||
|
// Check reading from File and Stream
|
||||||
|
doc = new HWPFDocument(new FileInputStream(file));
|
||||||
|
r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
doc.close();
|
||||||
|
|
||||||
|
doc = new HWPFDocument(new POIFSFileSystem(file));
|
||||||
|
r = doc.getRange();
|
||||||
|
assertEquals("I am a test document\r", r.getParagraph(0).text());
|
||||||
|
doc.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO In-place write positive and negative checks
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user