首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure、java.io.Writer f和惰性seq

Clojure、java.io.Writer f和惰性seq
EN

Stack Overflow用户
提问于 2021-02-22 21:29:00
回答 1查看 262关注 0票数 0

不能消耗懒散的seq来将数据写入文件,无论我使用什么,每次都会出现“流关闭”错误。

代码语言:javascript
复制
(ns logger.core
  (:gen-class)
  (:require [clojure.java.io :as io])
  (:import java.util.Date
           java.util.TimeZone
           java.text.SimpleDateFormat))

(defn -main
  "Creating new logger"
  [name]
  ())

(defn- create-dt-formatter-with-time-zone [time-format time-zone-code]
  (let [*date-format* (SimpleDateFormat. time-format)
        time-zone (TimeZone/getTimeZone time-zone-code)]
    (.setTimeZone *date-format* time-zone)
    *date-format*))

(defn date-formatter
  ([] (create-dt-formatter-with-time-zone "MM.dd HH:mm:ss" "UTC"))
  ([time-zone] (create-dt-formatter-with-time-zone "MM.dd HH:mm:ss" time-zone))
  ([time-zone time-format] (create-dt-formatter-with-time-zone time-format time-format)))

(defn date-to-string
  ([^Date date] (let [formatter (date-formatter)] (.format formatter date)))
  ([^Date date ^SimpleDateFormat formatter] (.format formatter date)))

(def my-formatter (date-formatter "UTC" "MM.dd"))

(def log-to-file (io/writer "logs/text.log" :append true))

(defn write [^java.io.Writer writer data]
  (with-open [writer writer]
    (let [date-now (date-to-string (Date.))]
        (->> data
             (map #(str date-now " " % "\n"))
             (map #(.write writer %))
             (doall)
             (.flush writer)))))


(defn write-2 [^java.io.Writer log-writer data]
  (with-open [writer log-writer]
    (let [date-now (date-to-string (Date.))]
      #_(doseq [data-row data]
          (.write writer (str date-now " " data-row "\n")))
      (doall (map #(.write writer (str date-now " " % "\n")) data)))
    (doto writer (.flush writer))))


(write-2 log-to-file ["test" "test1" "test lonmg string"])

这里有两个函数(写,写-2),但两者都不能工作。不知道,如何将.write与延迟-seq结合使用,在懒散的clojure世界中,什么是大问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-22 21:41:25

我把它简化了一点,让它起作用了。你没有显示出确切的错误,所以我不能更详细地评论。以下是代码:

代码语言:javascript
复制
(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [clojure.java.io :as io])
  (:import
    [java.io Writer]
    [java.util Date]))

(def log-to-file (io/writer "text.log" ))

(defn write-2 [^java.io.Writer log-writer data]
  (with-open [writer log-writer]
    (let [date-now (str (Date.))]
      (doall (map #(.write writer (str date-now " " % "\n")) data)))
     (.flush ^java.io.Flushable writer)))

(dotest
  (write-2 log-to-file ["test" "test1" "test lonmg string"])
  )

它是基于我最喜欢的模板项目的。产出:

代码语言:javascript
复制
~/expr/demo > cat text.log 
Mon Feb 22 13:39:37 PST 2021 test
Mon Feb 22 13:39:37 PST 2021 test1
Mon Feb 22 13:39:37 PST 2021 test lonmg string

如果删除(.flush ...)表达式,它也可以工作,因为关闭会自动刷新输出(即当with-open窗体退出时)。

请注意,您可以使用mapv而不是doall强制立即执行。或者,只需将最后的值包装在(vec ...)表单中即可。

请参阅此文件来源清单,特别是Clojure CheatSheet和“获取Clojure”一书。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66323715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档