如何在Clojure中将序列转换为字节[]?

如何在Clojure中将序列转换为字节[]?,clojure,clojure-contrib,Clojure,Clojure Contrib,我需要将原始字节写入文件。我这样做是因为: (.write (FileOutputStream "/path") bytes) …其中字节的类型必须为byte[]。请注意,它不能是字节[] 我试图用(字节)和/或(数组)函数转换序列,但失败了,例如: user=> (bytes (into-array (filter #(not (= % 13)) (to-byte-array (File. "e:/vpn.bat"))))) java.lang.ClassCastException:

我需要将原始字节写入文件。我这样做是因为:

(.write (FileOutputStream "/path") bytes)
…其中字节的类型必须为byte[]。请注意,它不能是字节[]

我试图用(字节)和/或(数组)函数转换序列,但失败了,例如:

user=> (bytes (into-array (filter #(not (= % 13)) (to-byte-array (File. "e:/vpn.bat")))))
java.lang.ClassCastException: [Ljava.lang.Byte; cannot be cast to [B (NO_SOURCE_FILE:0)
继续:

字节/类型为的into数组工作正常。但是,字节数组没有。文件变为空:

(import 'FileOutputStream)
(use 'clojure.contrib.io)

(defn remove-cr-from-file [file]
  (with-open [out (FileOutputStream. file)]
    (let [dirty-bytes (to-byte-array file)
          clean-seq   (filter #(not (= 13 %)) dirty-bytes)
          clean-bytes (byte-array clean-seq)]
      (.write out clean-bytes))))

还有字节数组函数

如果需要打包字节数组,可以直接检出或使用底层Java ByteBuffer内容

(into-array Byte/TYPE (filter #(not (= % 13)) (.getBytes (slurp "e:/vpn.bat"))))
如果您不介意使用字符串作为中介,尽管我认为您可以将
.getBytes
部分替换为
to byte数组

我认为问题在于
(字节)
需要基元类型数组。如果您没有将此项指定给
(进入数组)
,它将返回装箱类型。

更新:问题的新部分(“续”)将在末尾得到回答


为了弄清楚这里到底发生了什么:

这个问题实际上说明了一个有趣的问题:数组强制转换函数--
字节
整数
,…--不是也不能用作转换函数。它们只强制转换到目标类型,这特别意味着
字节
的输入必须已经是适当类型的数组

这是有意义的,因为从
int[]
转换为
long[]
从不同的角度查看数字并不是一件简单的事情——您还必须为阵列分配不同的存储量——因此,只需查看操作符就可以判断所讨论的操作是转换还是强制转换是一件好事

在Clojure这样的动态语言中,强制转换之所以有用,与效率(您可以在类型提示旁边使用强制转换来加快速度)和互操作(您通常需要正确类型的东西)有关。编译器不能仅推断正确的数组类型的原因是因为没有足够的信息来推断(更不用说可能还不清楚“正确”的类型是什么)

要修复有问题的代码段,可以使用
Byte/TYPE
(由Jieren建议)或跳过
到数组中的
bytes
,并将
过滤器
包装到
字节数组中(由Brenton Ashworth建议)


问题文本中新包含的代码的问题在于,它在读取文件内容之前会在文件上打开一个
FileOutputStream
。打开FOS的动作已清除文件:

(with-open [out (FileOutputStream. some-file)]
  :foo)

; => :foo
; side effect: some-file is now empty
您必须使用open
外部读取文件:

(let [foo (byte-array
           (filter #(not= 13 %)
                   (to-byte-array some-file)))]
  (with-open [out (FileOutputStream. some-file)]
    (.write out foo)))

谢谢你的详细解释。请看一下我问题的后续部分(字节数组在我的场景中不起作用)。