Fork me on GitHub
#clojure-hungary
<
2023-09-19
>
onetom03:09:32

kesobbi referencianak, itt egy pelda arra h h kell hasznalni a https://github.com/awslabs/aws-java-nio-spi-for-s3 file system-et. deps.edn-be ez megy:

software.amazon.nio.s3/aws-java-nio-spi-for-s3 {:mvn/version "1.2.3"}}
aztan meg egy s3_repl.clj-be ez:
(ns s3-repl
  (:import ( URI)
           (java.nio.file Files OpenOption Path StandardOpenOption)
           (java.time LocalDateTime)))

(def CREATE_OPTS
  [StandardOpenOption/WRITE
   StandardOpenOption/CREATE])

(def TRUNCATE_OPTS
  (into CREATE_OPTS
        [StandardOpenOption/TRUNCATE_EXISTING]))

(def APPEND_OPTS
  (into CREATE_OPTS
        [StandardOpenOption/APPEND]))

(def READ_OPTS
  [StandardOpenOption/READ])

(defn ls [^Path path] (-> path Files/list .iterator iterator-seq))

(def bucket "<some-bucket-name>")

(def bucket-root (-> (str "s3://" bucket) URI. Path/of))

(def object-path (-> bucket-root (.resolve "xxx.txt")))

(comment
  (-> bucket-root ls)
  
  ;; Write
  (-> object-path
      (Files/newOutputStream (into-array TRUNCATE_OPTS #_APPEND_OPTS))
      (spit (-> "[%s] Created with `clojure.core/spit`\n"
                (format (LocalDateTime/now)))))

  ;; Read
  (-> object-path
      (Files/newInputStream (into-array READ_OPTS))
      (slurp))

  )

onetom03:09:22

a https://docs.oracle.com/javase/tutorial/essential/io/fileio.html -t olvastam vegig, meg beleneztem par Clojure nio wrapper lib-be amikbol az into-array temat tanultam, h varargs-os metodus hivashoz az kell. ezek utan mar ossze birtam rakni ezt a peldat. bar azt nem tudom h mennyire hatekony ez igy, mert a slurp/`spit` az a regi java.io.file package-en alapszik.

onetom04:09:19

meg az a gyanum, h spit/slurp-el csak szoveget tudok irni/olvasni. binaris adatot nem. pedig ugy remlik h csinaltam mar ilyet. valszeg kell valami reader v stream a byte[] kore...

(let [f "/tmp/asd.txt"]
    (spit f (-> "qwe\n" (.getBytes "UTF-8")))
    (slurp f))
=> "[B@3b412bd2"

sb07:09:07

Into-array helyett én (Arraylist. ,,,) -ot alkalmazom, sokkal gyorsabb

sb07:09:44

Bár nem tudom itt lehet-e, illetve nippy-vel talán tudsz binárist írni és olvasni.. de lehet nem erre gondolsz

sb07:09:15

Köszi hogy megosztottad a kódot!!

sb07:09:23

Kiprobalom :)

onetom18:09:50

itt egy pelda babashka.fs hasznalatra is, ami szinten java.nio.file.Path-ra epul:

(require '[babashka.fs :as fs])
  (def test-path (fs/path (URI. "s3://<some-bucket>/nio-test.txt")))
  (def test-content "test \uD83D\uDE0E\n")
  (def utf8 "UTF-8")
  (def default-write-opts {:create true :truncate-existing true :write true})
  (-> test-path (fs/write-bytes (.getBytes test-content utf8) default-write-opts))
  (-> test-path (fs/read-all-bytes) (String. utf8))

onetom18:09:47

a peldaban az is lathato, h ha egy string-ben van a teljes path, akkor a Path/of single arity-s valtozatat is tudjuk hasznalni, ami URI-t var (`fs/path` ~= Path/of)

onetom18:09:45

az ArrayList az nem jo vararg-nak:

(Path/of "asd" (java.util.ArrayList.))
Execution error (ClassCastException) at repl.s3/eval1026 (s3.clj:80).
class java.util.ArrayList cannot be cast to class [Ljava.lang.String; (java.util.ArrayList and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
make-array viszont jo arra az esetre ha ures a varargs:
(Path/of "asd" (make-array String 0))
=> #object[sun.nio.fs.UnixPath 0x6e9127a7 "asd"]

👍 1
sb23:09:16

Tényleg ez varargshoz kell.. bocsi