ファイルの書き出しについて、どちらの方法が最適ですか?

このQ&Aのポイント
  • ファイルの書き出しには、「useString」と「useStream」という2つのメソッドがあります。実行時間的には「useString」の方が若干速いですが、メモリ消費やセオリーなど他の要素も考慮する必要があります。
  • 「useString」メソッドでは、URLからデータを読み込み、文字列として一時的に保持します。そして、その文字列をファイルに書き込みます。一方、「useStream」メソッドでは、URLから直接データを読み込み、そのままファイルに書き込みます。
  • 結果的には、どちらの方法でも同じ結果が出力されますが、メモリ消費やセオリーの観点からは「useStream」メソッドがより効率的です。ただし、実行時間が若干遅くなる可能性があります。
回答を見る
  • ベストアンサー

ファイルの書き出しについて、どちらのほうが良い方法でしょうか?

下の2つのメソッドでどちらのほうがよいでしょうか? 実行時間的にはuseStringのほうが若干速いのですが... メモリ消費とかセオリーとか常識とかそういうのを含めて解説を頂きたいです。 今のところ結果は同じものが出力されています。 public static void useString() { try { System.out.println("start useString"); URL url = new URL("どこかのページ"); File outputFile = new File("test1.html"); InputStream input = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile.toString(), true)); String tmp = ""; String str; while ((str = reader.readLine()) != null) { writer.write(tmp); } reader.close(); input.close(); writer.write(tmp); writer.close(); } catch (IOException e) { e.printStackTrace(System.out); } } public static void useStream() { try { URL url = new URL("どこかのページ"); File outputFile = new File("test.html"); InputStream input = url.openStream(); FileOutputStream output = new FileOutputStream(outputFile); byte[] bytes = new byte[2048]; int n; while ((n = input.read(bytes)) >= 0) { output.write(bytes, 0, n); } input.close(); output.close(); } catch (IOException e) { e.printStackTrace(System.out); } }

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

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

  • ベストアンサー
  • ssj
  • ベストアンサー率73% (11/15)
回答No.1

> 下の2つのメソッドでどちらのほうがよいでしょうか? > メモリ消費とかセオリーとか常識とかそういうのを含めて解説を頂きたいです。 何より用途によって使い分けるべきです。 useString の方はテキストデータでなければいけません。 バイナリデータにアクセスすることがない 文字列として何かしらの処理を行うことが想定される といった場合には、useString を使うべきでしょう。 逆に、 バイナリデータにもアクセスするかもしれない テキストデータでも、それを意識する必要が全くない と言う場合であれば、useStreamを使うべきでしょう。 なお、useStreamの方でもBufferedInputStream/BufferedOutputStream を使った方がよいと思います。。。

watapen
質問者

お礼

お礼が遅くなって申し訳ありません。 有り難うございました。 ご回答を参考にし自分で例題をつくりやってみたところ 理解できました。 またひとつ賢くなれたような気がします。 ありがとうございました。

関連するQ&A

  • 半角カナが含まれる文字列をファイル出力

    いつもお世話になっております。 以下のようにしてテキストファイルを出力 していますが、半角カナの出力時に文字化けして しまいます。 ------------------------------------------ FileOutputStream os = new FileOutputStream("D:\\java_src\\test1.txt"); OutputStreamWriter osw = new OutputStreamWriter(os,"Shift_JIS"); BufferedWriter writer = new BufferedWriter(osw); writer.write("テキヨウ"); writer.close(); osw.close(); os.close(); ------------------------------------------ 出力されるテキストファイルは 文字コード:Shift_JIS 改行コード:CRLF としたいのですが何かいい方法はありますでしょうか? 動作環境は WindowsXP + JDK5.0 です。 すいませんが、宜しくお願いします。

  • 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されるのでしょうか?

  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • HTMLが表示されない

        try{       URL url = new URL("https://job.mycom.co.jp/07/regist.cgi");       URLConnection con = url.openConnection();       InputStream is = con.getInputStream();       BufferedReader br = new BufferedReader(new InputStreamReader(is,"EUC-JP"));       BufferedWriter bf = new BufferedWriter(new FileWriter("input.html"));       String temp = null;       while((temp = br.readLine()) != null){         bf.write(temp);       }       br.close();       bf.close();     }catch(Exception e){       e.printStackTrace();     }   } このやり方でHTMLを作成し、開くと、何も表示されません。 どなたか原因を教えてください>< ループ内を System.out.println(temp); に変えて実行するとソースがすべて表示されたので、tempの中身はちゃんと入っていると思われます。

    • ベストアンサー
    • 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の勉強をしているのですが、 演習問題で分からないところがあります。 ファイルへの書き込みをする問題なのですが、 public void kakikomi(){ try { FileOutputStream out=new FileOutputStream("output.txt"); PrintWriter writer=new PrintWriter(out); writer.println(seibetu); writer.println(nenrei);   writer.println(taijuu); writer.println(sintyou); writer.flush(); writer.close(); }catch (FileNotFoundException e) {} } mainよりオブジェクトを作成しそれぞれの変数に(seibetu,nenrei...)値を入れファイルへ書き込みをするプログラムです。 上記のプログラムの場合性別を入れファイルを閉じる、身長を入れファイルを閉じるという作業をしているため 結果的に最後の項目である身長の値のみしかファイルに書き込み 出来ません。 どのようにすれば全ての項目をファイルに書き込むことが出来るでしょうか? よろしくお願いします。

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

    以前、ここでログ部品の作り方を教えていただきました。 ありがとうございます。 サーバーは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
  • あるファイルを選択するには

    下のプログラムで形態素解析ツールの茶筌を呼び出しています。 任意のファイルを選びそこに書かれているテキストを茶筌にかけたいと思っています。任意のファイルを選ぶためにはどのようにすればよいのか困っています。 是非お願いします。 import java.*; import java.io.*; import java.util.*; class test1 { public static void main(String[] arg) { String result; System.out.println(arg[0]); ChasenHandler ch = new ChasenHandler(); result = ch.doChasen(arg[0]); System.out.println(result); } } class ChasenHandler { StringTokenizer stn; String CHASEN_COMMAND[] = {"chasen"}; String CHASEN_END = "EOS"; Process process; BufferedWriter chasen_writer; BufferedReader chasen_reader; public ChasenHandler () { try { process = Runtime.getRuntime ().exec (CHASEN_COMMAND); } catch (IOException e) { System.out.println ("Error in ChasenHandler"); return; } InputStream is = process.getInputStream (); chasen_reader = new BufferedReader (new InputStreamReader (is)); OutputStream os = process.getOutputStream (); chasen_writer = new BufferedWriter (new OutputStreamWriter (os)); } String doChasen (String input) { String result = ""; try { chasen_writer.write (input , 0 , input.length()); chasen_writer.newLine (); chasen_writer.flush (); String line = ""; while (true) { if ((line = chasen_reader.readLine ()).equals (CHASEN_END)) { result = result + "EOS"; break; } result = result + line + ""; } } catch (Exception ie) { result = "\n"; ie.printStackTrace (); System.exit (0); } input = ""; return result; } }

    • ベストアンサー
    • Java
  • 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
  • java.io.Fileクラスは絶対パス長をチェックしないのですか?

    windows XP+Eclipse3.3+JDK1.5.0_15上でjava.io.Fileクラスを使ってテキストファイルの入出力を行うJavaプログラムを作成しました。 しかし、これによって、パス長が長すぎて(フルパスで300文字)アクセスできないファイルが作成されてしまいました。 (正確には、Windowsのファイルエクスプローラーに存在は表示されているけど、開けないし、削除も、ドラッグアンドドロップもできないという状態。このファイルの右クリックメニューの項目は「開く」と「送る」の2つしかありませんでした。) StreamReader・WriterもIOExceptionを返していませんでした。 Fileクラスは読み書きするにあたってパス長のチェックをしていないのでしょうか? ちなみに、フルパス長259文字のテキストファイル(数行の文字列を記入してある)を入力に与えたとき、空ファイルのように扱われていました。 このファイルをメモ帳で開こうとすると「パス長が長すぎる」というエラーが出て中身が読み取れませんでした。 以下にソース(例外処理を省略)を抜粋します。 ---------------- File inputFile = new File(args[i]); if (!inputFile.isFile() || !inputFile.canRead()) { // ファイルを読む inputStream = new FileInputStream(inputFile); InputStreamReader inputStreamReader = new InputStreamReader( inputStream, "UTF-8"); bufferReader = new BufferedReader(inputStreamReader);   (以下、読み出し処理) // 入力ファイルと同じ階層に「Result」ディレクトリを作る File resultDir = new File(resultDirPath); resultDir.mkdir(); // 読み取った1行の末尾に"a"を付加したものをファイルに書き込み、 // 「Result」ディレクトリに出力。 // ファイル名は「output_(入力テキストファイル名)」とする File outputFile = new File(resultDir.getOutputDirPath(), outputFileName); outputFile.createNewFile(); outputStream = new FileOutputStream(outputFile); outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); bufferedWriter = new BufferedWriter(outputStreamWriter);   (以下、書き込み処理) } ---------------- 以上、よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう