Size: a a a

Clojure — русскоговорящее сообщество

2020 May 30

Г

Григорий in Clojure — русскоговорящее сообщество
Простите за мой французский говнокод.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
"Выходит ошибка" это одно из классических худших описаний для компьютерных проблем, нужны подробности :)
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Григорий
Простите за мой французский говнокод.
Очень странное условие выхода. Ни n, ни l не изменяются в loop. Если l > n изначально, то будет чтение до конца и после него тоже. 😁
источник

Г

Григорий in Clojure — русскоговорящее сообщество
А. да. спасибо.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Да блин. IndexOutOfBoundsException.
(defn chunk-file-on-n-sized-bytes-arrays [filename n]
 (let [file (io/file filename)
       l (.length file)
       tmp (byte-array n)]
   (with-open [r (io/input-stream file)]
     (loop [result []
            offset 0]
       (if (> offset l)
         result
         (do (.read r tmp offset n)
             (recur
              (conj result tmp)
              (+ offset n))))))))
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Григорий
Да блин. IndexOutOfBoundsException.
(defn chunk-file-on-n-sized-bytes-arrays [filename n]
 (let [file (io/file filename)
       l (.length file)
       tmp (byte-array n)]
   (with-open [r (io/input-stream file)]
     (loop [result []
            offset 0]
       (if (> offset l)
         result
         (do (.read r tmp offset n)
             (recur
              (conj result tmp)
              (+ offset n))))))))
offset же для буфера. А буфер размером с один чанк.
https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[],%20int,%20int)
источник

Г

Григорий in Clojure — русскоговорящее сообщество
.read t tmp offset n читает с offset'а следующие n байт.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Не-а. Он читает из потока до n байт и записывает в буфер с offset'ом от начала.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Блин.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Т. е. в этом случае offset скорее всего должен быть нулём. На всех итерациях.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Тогда это вообще бесмысленно. Буду полностью читать файл в байтах,  и потом уже чанковать как захочу.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Мне просто было интересно так сделать. Чтобы сразу чанки возвращал.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Так а в чём изначальная задача? Для чего разбиение на чанки?
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Это из видеокурса по криптографии задача. Нужно вычислить хэш от файла, который зависит от хеша каждого чанка последовательно.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Ага, то есть от каждого чанка достаточно взять производную, после чего чанк выкинуть.
Можно, например, последовательность чанков выразить через lazy-seq — но надо обработать последний чанк правильно, ибо он может быть неполным, а если использовать один буфер и заполнять его read'ом с нулевым оффсетом, то в конце буфер будет заполнен последним чанком сначала и остатками предпоследнего в конце. И ему либо нужен отдельный буфер, либо его следует сопровождать длиной.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
я не понимаю: как читать (.read) С и ПО.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
или я могу сделать drop на io/input-stream?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
(defn read-bytes
 [filename, n-bytes]
 (let [file (io/file filename)
       cbuf (char-array n-bytes)]
   (with-open [r (io/reader file)]
     (.read r cbuf 0 n-bytes)
     (seq cbuf))))
ага, read можно проще написать
(defn read-bytes
 [filename, n-bytes]
 (let [file (io/file filename)
       cbuf (char-array n-bytes)]
   (with-open [r (io/reader file)]
     (.read r cbuf)
     (seq cbuf))))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Григорий
я не понимаю: как читать (.read) С и ПО.
делаешь read, указатель сдвигается, делаешь следующий read
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Григорий
или я могу сделать drop на io/input-stream?
источник