Hi Herwig,
Thanks for your help.
Herwig Hochleitner writes:
> (defn copy-multi
> ([input outputs] (copy-multi input outputs (make-array Byte/TYPE 1024)))
> ([^java.io.InputStream input outputs buffer]
> (let [size (.read input buffer)]
> (when (pos? size)
> (doseq [^java.io.OutputStrean output outputs]
> (.write output buffer 0 size))
> (recur input outputs buffer)))))
I tried using the above as follows:
(defn copy-multi
([input outputs] (copy-multi input outputs (make-array Byte/TYPE 1024)))
([^java.io.OutputStream input outputs buffer]
(let [size (.read input buffer)]
(when (pos? size)
(doseq [^java.io.OutputStream output outputs]
(.write output buffer 0 size))
(recur input outputs buffer)))))
(defn save-to-disk [file]
"Saves a temporary file to disk to further analyse it"
(info "Saving file to disk")
(let [pipe-in (java.io.PipedInputStream.)
pipe-out (java.io.PipedOutputStream. pipe-in)]
(future
(with-open [in (:body file)
file-out (io/output-stream "/tmp/test.txt")]
(copy-multi in [file-out pipe-out])))
(update-in file [:body] pipe-in)))
I added `future` so that the pipe-in is read and the pipe-out doesn't
block. However, the program returns before anything is copied. Without
`future` the pipe-in is never read out and the pipe-out blocks. So
either to fast or it never completes.
I'm beginning to think that I'm trying to solve the problem (streaming
one input to file and S3 simultaneously) in a wrong way. Any suggestions?
--
Petar Radosevic | @wunki
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en