(defn copy "Copies input to output. Returns nil or throws IOException. Input may be an InputStream, Reader, File, byte[], char[], or String. Output may be an OutputStream, Writer, or File. Options are key/value pairs and may be one of :buffer-size buffer size to use, default is 1024. :encoding encoding to use if converting between byte and char streams. Does not close any streams except those it opens itself (on a File)." {:added "1.2"} [input output & opts] (do-copy input output (when opts (apply hash-map opts))))(defmethod do-copy [InputStream OutputStream] [^InputStream input ^OutputStream output opts] (let [buffer (make-array Byte/TYPE (buffer-size opts))] (loop [] (let [size (.read input buffer)] ;;; XXX point 1 (when (pos? size) ;;; XXX point 2 (do (.write output buffer 0 size) (recur)))))))b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.If the length of b is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at the end of the file, the value -1 is returned; otherwise, at least one byte is read and stored into b.
---
Meaning that return value -1 means end of stream, and return value 0 doesn't mean end of stream. However condition at point 2 in code above, stops recursion when .read returns value that is smaller than 1.
Now consider a case where .read returns this sequence of values in consecutive calls:
1024, 0, 1024, 201, -1
clojure.java/io copies only the first 1024 bytes, when the whole stream has 2249 bytes. Is this the intended behavior? Should the condition at point 1 be "(not (neg? size))" ?
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/9deb8024-ce4b-4ef4-88d0-bbd817152ab6%40googlegroups.com.
b is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at the end of the file, the value -1 is returned; otherwise, at least one byte is read and stored into b."If implementations actually follow that documentation, [...]
Ah, I should have read further in the Java doc here, though, before posting. In particular, the last sentence of this paragraph: "If the length ofbis zero, then no bytes are read and0is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at the end of the file, the value-1is returned; otherwise, at least one byte is read and stored intob."If implementations actually follow that documentation, then it appears that a non-0 buffer size should never result in a return value of 0.Andy
On Sun, Aug 25, 2019 at 9:54 PM Andy Fingerhut <andy.f...@gmail.com> wrote:
That bit of Java-Doc says nothing about the behavior when providing a buffer b with a non-0 length.If it said: "If the length of b is non-zero, then the return value will never be 0", then I might agree with you. Also, if you knew for some reason that the implementation guaranteed this. (I have not looked at the implementation to know either way.)Andy
On Sun, Aug 25, 2019 at 9:21 PM 'Dirk Wetzel' via Clojure <clo...@googlegroups.com> wrote:
As alpeware already said, .read will not return [1024, 0, 1024, 201, -1] because it will not return a zero unless buffer-size is zero.--This bit of the Java-Doc: If the length of b is zero, then no bytes are read and 0 is returned;So if the check is changed to (<= 0 size), passing a buffer-size of 0 (for whatever silly reason) would result in an infinite loop.While not my decision to make, I personally don't think that this would be desirable behaviour.
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.