writer

added
1.2

ns
clojure.java.io

type
function

(writer x & opts)

Attempts to coerce its argument into an open java.io.Writer.
Default implementations always return a java.io.BufferedWriter.

Default implementations are provided for Writer, BufferedWriter,
OutputStream, File, URI, URL, Socket, and String.

If the argument is a String, it tries to resolve it first as a URI, then
as a local file name.  URIs with a 'file' protocol are converted to
local file names.

Should be used inside with-open to ensure the Writer is properly
closed.

                ;; This example shows the use of the ':append' option
(defn write-file []
  (with-open [w (clojure.java.io/writer  "f:/w.txt" :append true)]
    (.write w (str "hello" "world"))))
            
                ;; This example shows the use of the ':encoding' option.
(require '(clojure.data.xml :as xml))

(let [tags (xml/element :foo {:foo-attr "foo value"}
                    (xml/element :bar {:bar-attr "bar value"}
                             (xml/element :baz {} "The baz value")))]
  (with-open [out-file (clojure.java.io/writer "/temp/bar.xml" :encoding "UTF-8")]
    (xml/emit tags out-file))
  (with-open [input (clojure.java.io/reader "/temp/bar.xml")]
    (xml/parse input)))
;;=> #clojure.data.xml.Element{:tag :foo, :attrs {:foo-attr "foo value"}, 
;;    :content 
;;       (#clojure.data.xml.Element{:tag :bar, :attrs {:bar-attr "bar value"},
;;         :content 
;;             (#clojure.data.xml.Element{:tag :baz, :attrs {}, :content ("The baz value")})})}
            
                ;; When a Writer is created from a Socket using `with-open`, the 
;; underlying Socket is closed along with the Writer.

;; Create the Socket.
(require '[clojure.java.io :as io])
(def socket (java.net.Socket.))
(.connect socket (java.net.InetSocketAddress. "www.google.com" 80))
(.isClosed socket)
;;=> false

;; Write to the Socket.
(with-open [w (io/writer socket)]
  (.write w "GET / HTTP/1.0\
\
")
  (.flush w))
(.isClosed socket)
;;=> true

;; Attempt to read from the Socket.
(with-open [r (io/reader socket)
            s (java.io.StringWriter.)]
  (io/copy r s))
;;=> java.net.SocketException: Socket is closed