2016-07-09 16 views
3

Wie kann ich eine Zeichenfolge so in einen Eingabestream umwandeln, dass ich die Funktion unten testen kann?Wie umschließt man einen String in einem Eingabestream?

(defn parse-body [body] 
    (cheshire/parse-stream (clojure.java.io/reader body) true)) 

(deftest test-parse-body 
    (testing "read body" 
     (let [body "{\"age\": 28}"] ;; must wrap string 
      (is (= (parse-body body) {:age 28})) 
      ))) 
+2

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

Antwort

3

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] 
+0

Funktioniert als ein Charme! Vielen Dank für deine Hilfe. Perfekte Antwort! – user983716

Verwandte Themen