お世話になります、
画像ファイル(データ)をJavaアプリケーションで取り込んで別のディレクトリに同じ画像を複製する方法を探しています。
単なる画像ファイルのコピーではなく、Java側で画像データ(バイナリ)を取得して、新規に作成したファイル(Fileクラスで作成)にそのデータをWriteして複製する方法を探しています。
FileInputStreamやFileOutputStream等の方法で行ってみたのですが、微妙にデータが異なってしまって、画像が表示されません(画像ファイルを秀丸等で表示してデータを比較しました)。
以下にソースを貼り付けます。何か良い方法等ありましたらよろしくお願いします。
//画像ファイルのデータを読み込む
CharArrayWriter caw = new CharArrayWriter();
Reader fr = new FileReader("D:\\image\\abcd.gif");
Reader in = new BufferedReader(fr);
//新規にファイルを作成する
File fil = new File("C:\\image\\abcd.gif");
fil.createNewFile();
FileOutputStream fo = new FileOutputStream(fil);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fo));
int count = 0;
char[] buf = new char[16384];
while ((count=in.read(buf)) != -1) {
if (count > 0) caw.write(buf, 0, count);
}
in.close();
//読み込んだ画像ファイルデータを作成したファイルに書き込む
bw.write(caw.toCharArray());
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
画像ファイルにReader、Writerのクラスを使用してはいけません。
このクラスはデータをテキスト形式で処理します。なので画像ファイル
の場合はバイナリ形式のまま処理するStream系のクラスを使いましょう。
ということでたぶん
FileReader → FileInputStream
BufferedReader → BufferedInputStream
BufferedWriter → BufferedOutputStream
OutputStreamWriter → ObjectInputStream
になるのではないかと。
参考URLはクラスの意味をわかりやすく説明しているので参考にして下さい。
参考URL:http://java-house.jp/ml/archive/j-h-b/017380.htm …
この回答への補足
以下のソースのように修正したところ、出来上がったファイル
の画像データの先頭に
→「ャ・z GIF89ax」がついてしまって
その部分だけが2つのファイルで異なっている点です。
しかしその部分を削除して保存しても画像は表示されません。
FileInputStream fr = new FileInputStream(filePath);
BufferedInputStream in = new BufferedInputStream (fr);
//読み込んだ画像ファイルデータをファイルに書き込む
File fil = new File("c:\\image\\aoki.gif");
fil.createNewFile();
FileOutputStream fo = new FileOutputStream(fil);
BufferedOutputStream bw = new BufferedOutputStream(new ObjectOutputStream(fo));
int count = 0;
byte[] buf = new byte[16384];
while ((count=in.read(buf)) != -1) {
bw.write(buf, 0, count);
}
in.close();
bw.close();
fo.close();
何がいけないんでしょうか。。。
以下の方法で成功しました、ありがとうございました。
m(_ _)m
//画像ファイルのデータを読み込む
FileInputStream fr=new FileInputStream(filePath);
//読み込んだ画像ファイルデータをファイルに書き込む
File fil = new File("c:\\image\\aoki.gif");
fil.createNewFile();
FileOutputStream fo = new FileOutputStream(fil);
int count = 0;
byte[] buf = new byte[16384];
while ((count=fr.read(buf)) != -1) {
fo.write(buf, 0, count);
}
fr.close();
fo.close();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Excel(エクセル) エクセル、画像ファイル名の書かれたセル(複数個所)に画像を一括で表示させる方法 1 2023/04/19 00:19
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グローバルIPとプライベートIP...
-
配列の重複する値とその個数を...
-
どこからも呼ばれていない無意...
-
UMLのクラス図はmain()も含むん...
-
java eclipse 型に解決できません
-
main()を持つクラスが2つ以上...
-
Sub-LVDS規格とは
-
同一パッケージにあるクラスが...
-
「天声人語」をインターネット...
-
意味の違いを教えてください Sh...
-
ラッパークラスってインヘリタ...
-
自作のクラスファイルがインポ...
-
1 つのヘッダファイルに複数の...
-
IPアドレスの3バイト目の呼び方
-
クラスの行数は?
-
同じクラスにならない確率を教...
-
Java「デフォルトのパッケージ...
-
重複エラーを解決するには
-
クラスのプロパティに構造体を...
-
VC++でMFCアプリ作成中です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
河合塾のクラス分けについて
-
同じクラスにならない確率を教...
-
3年間同じクラスになる確率
-
「天声人語」をインターネット...
-
グローバルIPとプライベートIP...
-
配列の重複する値とその個数を...
-
java eclipse 型に解決できません
-
同一パッケージにあるクラスが...
-
私はクラスLINEにまだ入れてな...
-
老い先短い ジジィ が ふと 思う...
-
自作のクラスファイルがインポ...
-
どこからも呼ばれていない無意...
-
main()を持つクラスが2つ以上...
-
数学の計算問題。 3年間同じク...
-
クラス見てから 女の子5人 ネタ...
-
javaのコンパイルができません...
-
1 つのヘッダファイルに複数の...
-
重複エラーを解決するには
-
IPアドレスの3バイト目の呼び方
-
packageとimport の違いって?
おすすめ情報