transferFrom/transferToによる2GBを超えるファイルのコピーで嵌められる
久々に書いてみる。
Javaでファイルをコピーするには、java.nioのtransferFrom/transferToを使うと早いとされていますが、そこには落とし穴が。
だいたい、どんなサイトでも以下のようなサンプルが載っています。
FileChannel src = new FileInputStream(source).getChannel();
FileChannel dst = new FileOutputStream(destination).getChannel();
dst.transferFrom(src, 0, src.size());
dst.close();
src.close();
が、これがダメなんだな。
以下のようにしないと、不完全なコピーが出来上がることがある。
FileChannel src = new FileInputStream(source).getChannel();
FileChannel dst = new FileOutputStream(destination).getChannel();
long pos = 0;
long size = src .size();
while (pos < size) {
long add = src .transferTo(pos, size, dst);
if (add == 0) {
throw new IOException();
}
pos += add;
}
dst.close();
src.close();
そう、1回でコピーしきれないことがある。それが2G超のファイルで顕著に表れる。
(JVMの実装依存だとは思うんだが。)
単純にStreamをwhileで回すだけだと問題は起きないので、高速化しようとして陥る罠ってところですな。
LED照明の導入
1年ほど前、玄関内のセンサーで自動点灯するレフランプをLED照明にしようと思ったのだが、明るさが代替できるものがなかったのであきらめたことがあった。しかし、このご時世。再度、LED照明にしてみることにした。
まず、該当のランプの仕様を調べる。ランプ自体には「TOKI RF110V95W」、ソケット側には「E26」と書いてある。まったく同じものを見つけることはできなかったが、全光束が1000lm程度であることを確認。
「うーん、そんな明るさのLED照明は出ているのか?以前はなかったような…。」とか思いながら調べると、今年出たユニティのXLEDIAシリーズがかなり明るい(X15-CJで1300lm)らしい。3年保証だし。
色々検討した結果、電球色で820lmのX13-WJにしてみた。
[rakuten:hitline:11435456:detail]
で、実際に交換してみた結果、気にならない程度に少しだけ暗くなったけどなかなかいい感じ。これで消費電力85%OFF!
あとは自治体のLED照明等購入費補助制度などを利用してみるか。
HDL4-G1.0をHDL4-G4.0に改造(7)
やっと終わったよ。。。
HDDが1台初期不良で、交換したりしてました。
bashいれて、パッチあてて、vsftpd入れて。
そこら辺も追々書いていきます。
HDL4-G1.0をHDL4-G4.0に改造(6)
Debian化後にしてはいけないこと。
それはシステム初期化。
「すべて」が初期化されたw
前回のサイトの情報だけではうまくいかず、「HDL4-G1.0をHDL4-G4.0相当(3.0テラバイト)化」と「LAN-DISK Memo」を参考に現在ボリューム再構築中。
その過程でシステム初期化をしてみたら、HDL4-G4.0にはなったものの、最初のとおり、「すべて」が初期化されちゃいました。
ファームも1.00てw
HDL4-G1.0をHDL4-G4.0に改造(5)
「HDL4-G1.0を2TB化」を参考に現在換装作業中。
HDL4-G1.0をHDL4-G4.0に改造(4)
「LANDISK Home (HDL4-G) Hack」と「HDL4-G hack(2)」と「HDL-Gぷちハック手順 (最新版)」を参考にDebian化。
問題は /var/lib/dpkg/status の入手。
最小のDebian環境を作るのが面倒だったのでいろいろ試行錯誤。
# apt-get install dpkg
すると、パッケージのダウンロードは完了するが、インストールでエラーが出る。
一応 /var/lib/dpkg/status は生成されているようだ。
Status が non-installed になっているので installed に書き換え。
再度 apt-get & installedに書き換え、を正常終了するまで繰り返す。
その後、
# dpkg -i /var/cache/apt/archives/*.deb
で完了した。
HDL4-G1.0をHDL4-G4.0に改造(3)
「HDL4-Gのsmb.conf変更」を参考に設定修正。
っつーか、時々コピーが止まると思ったらsambaの設定ミスかい。