Es ist einfach, einen Inputstream von einem String unter Verwendung von Host-interop zu konstruieren, indem man zuerst auf ein Byte-Array-Umwandlung:
(defn string->stream
([s] (string->stream s "UTF-8"))
([s encoding]
(-> s
(.getBytes encoding)
(java.io.ByteArrayInputStream.))))
Als ein weiteren Strom und Byte interop Beispiel ist hier eine Funktion, kehrt ein Vektor des erzeugten Bytes, wenn ein String oder ein bestimmtes Format kodiert:
(defn show-bytes
[s encoding]
(let [buf (java.io.ByteArrayOutputStream.)
stream (string->stream s encoding)
;; worst case, 8 bytes per char?
data (byte-array (* (count s) 8))
size (.read stream data 0 (count data))]
(.write buf data 0 size)
(.flush buf)
(apply vector-of :byte (.toByteArray buf))))
+user=> (string->stream "hello")
#object[java.io.ByteArrayInputStream 0x39b43d60 "[email protected]"]
+user=> (isa? (class *1) java.io.InputStream)
true
+user=> (show-bytes "hello" "UTF-8")
[104 101 108 108 111]
+user=> (show-bytes "hello" "UTF-32")
[0 0 0 104 0 0 0 101 0 0 0 108 0 0 0 108 0 0 0 111]
Die akzeptierte Antwort ist gut und beantwortet Ihre Frage Titel, weiß aber, dass 'clojure.java.io/reader' akzeptiert jeden (char-basierten) 'java.io.Reader', und so ist der Umweg zu (byte-basiertem)' java.io.InputStream' und Zeichencodierung unnötig. Schließe die Zeichenfolge stattdessen einfach in einen ['java.io.StringReader'] (http://docs.oracle.com/javase/8/docs/api/java/io/StringReader.html):' (java.io .StringReader. Body) '. – glts