• ベストアンサー

ストリームについて

バイト・ストリームとキャラクタ・ストリームの2種類が存在していますが、バイト・ストリームは、生のバイト (イメージデータなど) を読み込む時、また、文字(テキストファイル)を読み込むときはキャラクタ・ストリームを利用するという認識で良いのでしょうか? テキストファイル(アルファベット、日本語)処理ならどんな場合でもキャラクタ・ストリーム(FileReader,FileWriter)を使えばいいという考えでよろしいのかということでしょうか? 逆にバイト・ストリームで読み込んで処理する場合も可能ですよね? その場合、テキストファイルをバイト・ストリームで扱うメリットってあるのでしょうか? 何故疑問に思ったのかと言いますと、参考書にバイト・ストリームを扱った例文があり、テキストファイルを処理していたためです。テキストファイルの処理ならキャラクタストリームでいいんじゃないかと思い、逆にバイトストリームで扱うメリットを知りたかったのです。 よろしくお願いいたします。

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

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

  • ベストアンサー
回答No.1

メリットはあまりないと思いますが、エンコードの解釈をしなくて済む分だけ高速になります。その代わり読んでいるテキストが US-ASCII や ISO-8859-1 のような1バイトで1文字を表すエンコード以外のエンコードだった場合に正常な動作は期待できません。(UNICODEへの変換処理を自分でする場合は別ですが)。

xyz12345
質問者

お礼

なるほど。 エンコードの会社の分だけ高速になるということ ですか。ありがとうございました。

その他の回答 (1)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

まず、データとは何かを理解してください。 テキストデータをバイナリ処理した場合、そのデータは使用できますが、 バイナリデータをテキスト処理した場合はバイナリとして使用できません。 例えば実験してみてください。 エクセルファイルなどのバイナリデータをメモ帳などで開いた後にメモ帳で保存したファイルはエクセルで開けますか? テキストデータはキャラクタ・ストリームで、バイナリデータはバイト・ストリームで処理するのはデータを処理する上での前提です。

xyz12345
質問者

お礼

ありがとうございました。

関連するQ&A

  • ストリーム テキスト

    初心者の質問です。よろしくお願いします。 Javaのストリームを勉強しているのですが、FileReaderでテキストファイル(txt)を入力するにはどうすれば良いのでしょうか? Javaファイルは正しく入力できたのですが。 FileReader fr=new FileReader(args[0]);では、問題があるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ストリームについて

    ストリームが良く分かっていないのですが。 (現在の知識としては、バイトデータのようなデータ項目の流れ)という曖昧なイメージのままなのですが・・・ javaでストリームが必要な時とはどのような場合ですか? もしこれが無かった場合、データの入出力に当たってどのような不都合が生じるのでしょうか? またどうして、ストリームはバイト単位でデータを取り扱うのですか? (どうしてビット単位ではないのでしょうか?)

    • ベストアンサー
    • Java
  • プログラムの添削をお願いします。

    読み込んだテキストファイルを十文字ごとに改行して、別のファイルにコピーするプログラムです。 import java.io.*; public class CopyText{ public static void main(String[] args) throws IOException { FileReader in = new FileReader("inputtext.txt"); FileWriter out = new FileWriter("outputtext.txt"); int ccode, count; while ((ccode = in.read()) ! = -1){ out.write(ccode); count=count+1; if (count=10){fw.write('\n');, count=0}; } in.close(); out.close(); } } 7行目のところで、「')'がありません」「互換性のない型」というエラーが出るのですが、どう直したらいいのかがわからないのでご指導お願いします。

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

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

    • ベストアンサー
    • Java
  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • unicodeファイルの読み込み

    javaアプレット上で BufferedReader file = new BufferedReader(new FileReader("C:/test/list.txt")); で外部テキストファイルを読み込んでいるのですが、この外部テキストファイルの文字コードをANSIからUnicodeに変えるとプログラムが動かなくなります。日本語やアルファベットではない文字の保存のためにテキストをUnicodeにて保存しなければならないのですが、どうすればUnicodeのテキストファイルを読み込むことができますか。

    • ベストアンサー
    • Java
  • javaで大量のファイルを読み込む方法

    javaプログラミングについて質問です。 例えば、a1.txt~a100.txtの100個のテキストファイルがある として、これをループか何かを使って順番に読み込みたいのですが、 そのような方法はあるのでしょうか。 // ファイル入力ストリームを取得 BufferedReader br = new BufferedReader(new FileReader("a1.txt")); BufferedReader br2 = new BufferedReader(new FileReader("a2.txt")); BufferedReader br3 = new BufferedReader(new FileReader("a3.txt")); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ BufferedReader br100 = new BufferedReader(new FileReader("a100.txt")); という風に書くのが面倒に思っています。 宜しくお願いします。

    • ベストアンサー
    • 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
  • ストリームでのアバウト(?)な検索

    Javaでストリームを少し扱い始めたのですが、少々行き詰ってしまいました。 例えばtext.txtというファイルの内容が 1 100 A だとして、Java側が1~100の間の数値を入力した場合には 「A」を出力する、といった感じにしたいのですが、文字列検索まではどうにかなるのですが 1~100の間の数字となると、文字列検索とはまた別の構文が必要な気がするのですが、それが全く分かりません。 If文を使わないでこのような構文を書く場合どうすれば良いのでしょうか。 分かりにくい文章ですが、どうかお知恵をお貸しください。

  • 複数ストリームの音声をそのままに動画をiPad用に

    まとまった時間がとれないので、iPad を使ってながらで動画を見ています。 現在は、TMPGEnc Video Mastering Works5を使って画像をiPad用に変換し、iTunes を使ってiPadに移動しています。で、問題なのは複数の音声ストリームを持つ画像です。例えば、日本語の音声ストリームと英語の音声ストリームがある場合、TMPGEncでどちらか片方の音声ストリームを使ってiTunes用に変換することはできますが、そうすると日本語と英語の両方にすると、ファイルが2倍、処理時間も2倍になってしまいます。 なので、複数の音声ストリームをそのままにiPadに持って行けたら良いのですが、良い手段はあるでしょうか。

専門家に質問してみよう