My use case is:
1. the calling code is generating content in memory, and wants an
OutputStream to write it to (currently it's going to disk);
2. the putBlob() method wants a btye[], InputStream, etc. that it can read
from.
My problem is that *both* parties want to control the transaction. Here is
what my calling code looks like:
OutputStream documentOutputStream = null;
try {
documentOutputStream = this.
*documentResourceFactory.getDocumentOutputStream(documentPath);*
renderAndWriteDocument(renderContext, documentOutputStream);
}
catch (IOException e) {
...
}
finally {
Closeables.closeQuietly(documentOutputStream);
}
I'm trying to create an implementation of DocumentResourceFactory that
returns an OutputStream for writing the document to an Object Store using
jclouds, instead of writing it to the local file system. I guess a
stream-based API isn't really supported for writing to object stores...
In my case, the files are small enough that I'm OK buffering them in
memory. So what I'm planning to do, if there are no better options, is to
create an OutputStream implementation that buffers the file contents, and
uploads it to the blob store when flush()/close() is called. But that
doesn't sound great, so I'm hoping maybe someone else has a better idea?
*Steve Kingsland*
Senior Software Engineer
*Opower * <http://www.opower.com/>
*We’re hiring! See jobs here <http://www.opower.com/careers> *
On Mon, Aug 4, 2014 at 7:53 PM, Andrew Gaul <[email protected]> wrote:
> On Mon, Aug 04, 2014 at 04:39:15PM -0400, Steve Kingsland wrote:
> > I'm trying to use jclouds to write to an S3-compatible object store
> (Ceph),
> > and I'd like to use an OutputStream to write the payload for a Blob. How
> do
> > I do this?
> >
> > I'm working on an existing system which uses a stream-based abstraction
> > around all of the file I/O, that looks like this:
> >
> > public interface ResourceFactory {
> > InputStream getInputStream(String resourcePath) throws IOException;
> >
> > OutputStream getOutputStream(String resourcePath) throws IOException;
> > }
> >
> > I was able to implement getInputStream() for *reading* a blob from
> jclouds,
> > but I'm not sure how to return an OutputStream for *writing* a blob.
> >
> > I know this question has already been asked
> > <https://groups.google.com/forum/#!topic/jclouds/F2pCt9i7TSg>, but it
> seems
> > like a common-enough use case that it shouldn't be terribly complicated
> to
> > implement. Can anyone provide suggestions for how to accomplish this?
> >
> > The best I could find is Payload#writeTo
> > <
> http://demobox.github.io/jclouds-maven-site-1.7.2/1.7.2/jclouds/apidocs/org/jclouds/io/WriteTo.html
> >,
> > which accepts an OutputStream but is @Deprecated. Thanks in advance!
>
> Steve, I am not sure I understand your use case. putBlob consumes an
> input *source*, e.g., ByteSource or InputStream. Why do you want to
> provide it an output *sink*, e.g., OutputStream? If you have a special
> need, could you provide a custom implementation of ByteSource or
> InputStream, or use PipedInputStream/PipedOutputStream if you really
> must use an OutputStream?
>
> --
> Andrew Gaul
> http://gaul.org/
>