Javaで画像ファイルの入出力方法

このQ&Aのポイント
  • Javaアプリケーションで画像ファイルの入出力方法を探しています。画像データをバイナリとして取得し、別のディレクトリに同じ画像を複製する方法を知りたいです。
  • 現在、FileInputStreamやFileOutputStreamを使用して画像ファイルのコピーを試みていますが、データの差異があり、画像が正しく表示されません。
  • 以下のソースコードを使用して画像ファイルのデータを読み込み、新しいファイルに書き込んでいます。しかし、うまくいっていません。良い方法があれば教えてください。
回答を見る
  • ベストアンサー

javaで画像ファイルの入出力方法

お世話になります、 画像ファイル(データ)を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()); よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • ct27
  • ベストアンサー率62% (48/77)
回答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.html#body
takataka111
質問者

お礼

以下の方法で成功しました、ありがとうございました。 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();

takataka111
質問者

補足

以下のソースのように修正したところ、出来上がったファイル の画像データの先頭に →「ャ・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(); 何がいけないんでしょうか。。。

関連するQ&A

  • JAVAで別端末へファイル転送

    JAVAで端末から端末にファイルを自動的に転送するプログラムを作成しています。転送手段はUNC(\\path)形式で以下のソースのように転送しています。 -------------------------------------------------- ※READ_FILE → 送信側ファイルパス  WRITE_FILE → 受信側ファイルパス //ファイルを読み込む FileInputStream readFile = new FileInputStream(READ_FILE); //読み込んだファイルを書き込む File writeFile = new File(WRITE_FILE); writeFile.createNewFile(); FileOutputStream fo = new FileOutputStream(writeFile); int count = 0; byte[] buf = new byte[16384]; while ((count=readFile.read(buf)) != -1) { fo.write(buf, 0, count); } readFile.close(); fo.close(); -------------------------------------------------- ここで問題になってしまったのが、認証です。エクスプローラでその端末の認証をすませてしまえば、問題なくこのソースは通るのですが、認証せずに実行すると FileInputStream readFile = new FileInputStream(READ_FILE); のところで落ち FileNotFoundException:(ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。) となってしまいます。 JAVAで認証するためにログオンするようなクラスはありますか?そのクラスの使い方、ソース、参考になるようなホームページがありましたら、教えてください。 よろしくお願い致します。

  • ログファイルの文字化け

    以前、ここでログ部品の作り方を教えていただきました。 ありがとうございます。 サーバーはUNIXでTOMCATを使っています。 ログインしてからTOMCATを起動するとログは正常に出るのですが、ログインせずにAUTOでTOMCATを起動するとログが文字化けしてしまいます。 File file = new File("log.log"); FileOutputStream OpS = new FileOutputStream(file.getPath(), true); BufferedWriter BW = new BufferedWriter(new OutputStreamWriter(OpS)); BW.write(value); BW.newLine(); BW.close(); といった形で作っているのですが、何かよい方法はないでしょうか?

    • ベストアンサー
    • Java
  • javaプログラミングでの文字化けの対処方法

    javaのソースを作成していて、 BufferedWriter bw = new BufferedWriter(new FileWriter(args[1])); のようにし、ファイル出力ストリームを取得しarg[1](テキストファイル)に bw.write(num); のようにしてint型の変数をファイルに書き込むようにしましたが、 できあがったテキストファイルを開いてみると文字化けしていました。 これを文字化けさせずにファイルに書き込む方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • BufferedWriterのcloseメソッド

    ファイル出力に関して、次のようなコードをよく目にします。 例外処理省略 FileOutputStream fos = new FileOutputStream("hoge.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); //ファイルに出力 bw.close(); osw.close(); fos.close(); 同様の処理で、次のようなコードも目にします。 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt"))); //ファイルに出力 bw.close(); 下のコードで、関連するソースを見てみると、BufferedWriterオブジェクトをcloseする際に、そのオブジェクトが参照を持っているOutputStreamWriterオブジェクトはcloseされているように見えるのですが、FileOutputStreamオブジェクトがcloseされているようには見えませんでした。 下のようなコードは安全といえるのでしょうか?BufferedWriterオブジェクトのcloseで引数として渡される各オブジェクトもcloseされるのでしょうか?

  • BufferedWriter(OutPutStream).write(String)で追記がしたい

    環境 windowsXP+tomcat4.0.1 Servlet内でExceptionをcatchし、ファイルに書き出したいのですが、追記が出来ません。上書きされてしまって困っています。 コード: FileOutputStream fos = new FileOutputStream(String); OutputStreamWriter osw = new OutputStreamWriter(fos,"M932"); BufferedWriter bw = new BufferdWriter(osw); bw.write(String); 最後のwrite()を追記型で起動したいのですが、参考書にBufferedWriterクラスに関することがほとんど載っていないため、どうしたらいいのやら。 ご存知の方がいましたら、ご回答お願いいたします。

    • ベストアンサー
    • Java
  • javaプログラミング

    javaとYahooのWebサービスを利用して、検索結果のxmlを取り出し、 ○○.xmlという引数を与えて、結果を書き出そうとしていますが、 以下のプログラムだと文字(日本語)が化けてしまいます。 どうにかして文字化けせず取り出すことはできないでしょうか。 よろしくおねがいします。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStream; import java.net.URL; public class YahooWebServiceExample { public static void main(String[] args) { String request = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch? appid=web_research&query=%e6%b2%96%e7%b8%84&results=2"; try { // ファイル出力ストリームを取得(第二引数) BufferedWriter bw = new BufferedWriter(new FileWriter(args[0])); URL url = new URL(request); InputStream in = url.openStream(); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { for (int i = 0; i < len; i++) { System.out.print((char) buf[i]); bw.write(buf[i]); } } in.close(); bw.close(); } catch (Exception e) { System.out.println("Web services request failed"); } } }

    • ベストアンサー
    • Java
  • Javaで名前付きパイプ

    Windows上でJavaとFortranを使用し、プロセス間通信を行いと考えています。単純に思いついたのが名前付きパイプなのですが、Javaで名前付きパイプを生成する方法が解りません。 どなたかご存じないでしょうか? ちなみに、 try { // ファイルオブジェクトを生成する file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream("\\\\.\\PIPE\\mypipe");<<ここでエラーになる。 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); // ファイルに書き込む内容をセットする String outputdata = "TESTDATA";   <<< 以下省略 >>>> こんな感じで、試してみたのですが、ファイルの生成ができませんでした。 色々と調べてはいるのですが、どなたか成功した方いらっしゃいませんか?最悪はJNIを利用するしかないのかなぁ?

  • Javaのプログラムについて教えてください!

    BufferedWriterを使ってコマンドプロンプトから文字を入力して実行時に与えたパスのテキストに書き込んでいくプログラムをコーディングしてみたのですがなかなか上手くいきません。添削をお願いします。 import java.io.*; class BW{ public static void main(String[] args){ try{ File fl = new File("args[0]"); FileWriter fw = new FileWriter(fl); BufferedWriter bw = new BufferedWriter(fw); for(int i = 0;args[i]==null;i++){ bw.write(args[i]); bw.newLine(); } bw.flush(); bw.close(); }catch(IOException e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • ファイル出力クラスの選択について(Java)

    少し長文になります。 Javaで、複数のオブジェクトに格納された文字列をループでgetして、 1つのファイル(test.txt)内に出力していくプログラムを作っています。 ファイル出力する際に使用可能なクラスがいくつもあるため、 どれを選択すればいいのか迷ってます。 以下の条件から、使用すべきクラスを教えて下さい! <ファイル出力の条件> ーーーーーーーーーーーーーー 1. ファイル(test.txt)は毎回新規で1ファイルのみ作成して、   そのファイル内にオブジェクトからループでgetした文字列を1行ずつ出力していく。   (次回実行の直前に、前回のtest.txtは手動削除する。) 2. test.txt内には日本語が出力される可能性があり、且つ、   test.txtをWindowsのアプリケーションで利用するため、   SJISにエンコードして出力する。   ※Javaの実行環境はLinux 3. バッファを使って出力する。 ーーーーーーーーーーーーーー 以上です。 私の考えでは、全てキャラクタストリームを使って、 ---------- FIleWriter fw = new FileWriter("test.txt",true);  OutputStreamWriter osw = new OutputStreamWriter(fw,"SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- でいいのかなと思ったのですが、 ネットを見ていると ---------- FileOutputStream os = new FileOutputStream("output"); OutputStreamWriter osw = new OutputStreamWriter(os, "JIS"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); ---------- という記述もあり、 わざわざキャラクタストリームとバイトストリーム(FileOutputStream)を混ぜて使っている意図もよく分かりません。 (文字列を扱うのに、バイトストリームを使う意味って無いですよね??) それから、私の例では FIleWriterインスタンス生成時の引数で"true"を指定して test.txtに"追記"するように設定してますが、 test.txt自体は毎回新規作成のものを使うので、この場合trueもfalseも不要でしょうか?? (→認識の確認として、 「trueやfalseはあくまで既存ファイルに対しての追記/上書きの設定であって、 ファイルをオープンしてクローズするまでの間はtrueなど設定しなくても ずっと末尾に追記されていく」という認識でOK?) また、true/falseが不要な場合、 FIleWriterは使わずに、 ---------- OutputStreamWriter osw = new OutputStreamWriter("test.txt","SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- としても問題無いでしょうか?? 以上、分かる方、アドバイスください!

    • ベストアンサー
    • Java
  • Double,Longをファイルに書き込み

    以下のように、Double,Longをファイルに書き込もうとした場合、どのようにキャストをすればよろしいのでしょうか? (String)でString型への変換や Integer.parseInt等を試したのですが、できませんでした。よろしくお願いします。 import java.io.*; class test { public static void main(String[] args) { double dNumber = 3.45; long lNumber = 12345; BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt")); bw.write(dNumber); bw.write(lNumber); } //end main } //end class

    • ベストアンサー
    • Java