5

生のバイトをファイルに書き込む必要があります。私はそれを行います:

(.write (FileOutputStream "/path") bytes)

...ここで、バイトは byte[] 型でなければなりません。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)

続き:

Byte/TYPE を使用した配列への変換は正常に機能します。ただし、バイト配列はそうではありません。ファイルが空になります:

(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))))
4

3 に答える 3

6

バイト配列機能もあります。

バイト配列をパッキングする必要がある場合は、http://github.com/geoffsalmon/bytebuffer を確認する、基礎となる Java ByteBuffer のものを直接使用できます。

于 2010-08-10T16:23:03.737 に答える
3
(into-array Byte/TYPE (filter #(not (= % 13)) (.getBytes (slurp "e:/vpn.bat"))))

弦を仲介してもかまわないのなら、.getBytesパーツを自分のものに交換できると思いますがto-byte-array

(bytes)問題は、プリミティブ型の配列を期待していることだと思います。これをに指定しない場合は(into-array)、ボックス化されたタイプが返されます。

于 2010-08-10T17:11:46.617 に答える
3

更新: 質問の新しい部分 (「続き」) は最後に回答されます。


ここで実際に何が起こるかを明確にするために:

この質問は実際に興味深い点を示しています:配列キャスト関数-- bytesints、 ... --は変換関数としてではなく、使用できません。これらは対象の型にのみキャストします。つまり、特に、への入力がbytes既に適切な型の配列である必要があります。

int[]からへの変換long[]は、数値を別の観点から見るという単純な問題ではないため、これは理にかなっています。配列に別の量のストレージを割り当てる必要もあります。問題の操作が変換であるかキャストであるかは、良いことです。

Clojure などの動的言語でキャストが役立つ理由は、効率性 (型ヒントと一緒にキャストを使用して速度を上げることができます) と相互運用性 (適切な型のものがしばしば必要になる場合) に関係しています。コンパイラが正しい配列型を推測できない理由は、そうするのに十分な情報が常にあるとは限らないためです (言うまでもなく、「正しい」型が何であるかさえ明確ではない場合もあります)。

問題のスニペットを修正するには、Byte/TYPE(Jieren の提案に従って) またはinto-arrayandをスキップして代わりにbytesラップする(Brenton Ashworth の提案に従って) ことができます。filterbytes-array


質問テキストに新たに含まれるコードの問題はFileOutputStream、ファイルの内容を読み取る前にファイルを開くことです。FOS を開く操作で、ファイルは既にクリアされています。

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

; => :foo
; side effect: some-file is now empty

の外側のファイルから読み取る必要がありますwith-open

(let [foo (byte-array
           (filter #(not= 13 %)
                   (to-byte-array some-file)))]
  (with-open [out (FileOutputStream. some-file)]
    (.write out foo)))
于 2010-08-10T17:34:52.160 に答える