Clojureのファイル操作他.

up: 📂Clojure Core Languages

あまり調査していないけどたぶんだいたいがJavaのClojureラッパーだと思う. ということは困ったらJavaを調べれば良い. ただJavaは Java7以降のnioとそれ以前があり少しややこしい(JavaとFile周りは 苦労 したので詳しい).

clojure.core

slurp

引数で与えられたファイルを読み込んで文字列を返す.

with-open

clojure.java.io

clojure.java.io/file

java.io.Fileオブジェクトを作成する.

(require '[clojure.java.io :as io])
 
(io/file "config.edn")
;; => #object[java.io.File 0x71fda6e1 "config.edn"]
 
(io/resource "config.edn")
;; => #object[java.net.URL 0x7f3b3463 "file:/home/tsu-nera/hogehoge/resources/config.edn"]
  • io/fileでJavaのFileオブジェクトを扱う.
  • io/resourceで resource-pathにあるFileオブジェクトを扱う.

メモ, これはJava7で導入された java.nio.fileとは違うことに注意. 昔Javaのファイル周りはけっこう調べて業務的に詳しかったことを思い出した.

clojure.java.io/resource

https://clojuredocs.org/clojure.java.io/resource

ここでいうresourceとは, Javaの仕組みの1つ. Javaリソースとはクラスパスにある.classファイル以外の実行時に使うデータ.


clojureのresourceに関する情報は漁ってもみつからないのだが, deps.ednだと :pathsに含まれる.classファイル以外ならいいのか?

clojure.java.io/reader, clojure.java.io/writer

java.io.BufferedReader/BufferedWriterを扱う.

clojure.java.io/input-stream, clojure.java.io/output-stream

java.io.BufferedInputStream/BufferedOutputStreamを扱う.

Clojure File操作 Howto

ネット上の画像をURIを指定してダウンロードしたい

(defn copy [uri file]
 (with-open [in (io/input-stream uri)
             out (io/output-stream file)]
   (io/copy in out)))

ref. In Clojure, how do you download an image from the web and save it to your file system? - Stack Overflow

ファイルサイズを取得

(defn get-total-bytes [file-path]
  (.length (io/as-file file-path)))

文字列をファイルに書き出し

;; https://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file
 
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt")]
  (.write wrtr "Line to be written"))

ファイルパスを作成するには?

clojure.string/joinよりもベターな方法.

;; https://stackoverflow.com/questions/21198361/clojure-file-system-portability
(require '[clojure.java.io :as io])
 
(-> home
  (io/file "media" "music")
  (.getPath))

References