ストリームが良く分かっていないのですが。
(現在の知識としては、バイトデータのようなデータ項目の流れ)という曖昧なイメージのままなのですが・・・

javaでストリームが必要な時とはどのような場合ですか?
もしこれが無かった場合、データの入出力に当たってどのような不都合が生じるのでしょうか?

またどうして、ストリームはバイト単位でデータを取り扱うのですか?
(どうしてビット単位ではないのでしょうか?)

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ストリームがないとデータは取り出せません。

ストリームというかバッファですか?バッファがなくてもデータは取れますが、HDDのIOなどの問題でデータが連続的(スムーズ)に取り出せない場合のクッションの役割としてバッファが存在します。


バイト単位なのはコンピュータの構造の問題です。ビット単位でデータを扱うことはできますが、バイト単位でデータを扱うことを前提にコンピュータは設計されているので、処理上無駄が多くなってしまうのです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ストリームの存在意義がわかってきた気がします。

もしよろければ、
そこから少し突っ込んだご回答の方いただきたいのですが・・・

【ストリームについて】
>ストリームがないとデータは取り出せません。
データが取り出せないというのは「HDDのファイルから」になるのでしょうか?

HDDのデータ入出力には、「クッション(仲介役)」がなければ、連続的にすることができないということですよね・・・?
(違ったらすみません汗)


例えば次のようなデータがあったとき、

●ストリームがある場合
--------------------------------------------------------------
一度バッファ?に溜め込むことで、連続して出力が可能

Stream.txt
 10000000 11000000 11100000  ⇒  10000000 11000000 11100000
 
 ・全バイト情報のインプット → 全バイト情報のアウトプットが可能
--------------------------------------------------------------


●ストリームがない場合
--------------------------------------------------------------
ひとつひとつファイルにアクセスしなければならない?

Stream.txt
  [10000000] 11000000 11100000 ⇒  10000000
  10000000 [11000000] 11100000 ⇒  11000000
  10000000 11000000 [11100000] ⇒  11100000

・テキスト中の1バイトをインプット → インプットで得た1バイトを出力
--------------------------------------------------------------

イメージとしてはこのような形でしょうか?


【コンピュータがバイト扱いになっている点について】
 バイト単位で扱うようになっているコンピュータの構成については、「ビットでは人が扱いにくすぎる、だからバイトにしよう」的な裏づけがあるのでしょうか?

お礼日時:2009/05/15 21:59

>となると・・・ こういうことでしょうか?


>「INPUTからOUTPUTのIOをまとめなかった場合、
>aにはaというIO 、 bにはbというIO CにはCというIO・・・
> と、一つ一つのIOに着目して対応をしていたのでは、手間が掛かるた>め、IO関係はIO関係という括りで取り扱いができるようにした」


>ということでしょうか?
>(一つの考えとしてそのためにストリームが産まれたと考えられますでしょうか?)

はい、そのとおりだと僕は理解しております。
    • good
    • 0
この回答へのお礼

どうも、ありがとうございます。

お礼日時:2009/05/17 23:51

追記です。



ちなみにバッファとストリームは違うと思います。バッファを使う場合には、例えばBufferedReaderでラップしたりします。

質問者さんが興味を持っているあたりは、ByteStreamがやっていることですので、その辺から調べていくのもありかもしれません。
    • good
    • 0
この回答へのお礼

どうも、ありがとうございます。

お礼日時:2009/05/17 13:11

javaの「ストリーム」の位置づけとしては、「いろいろな種類のあるIOを、「ストリーム」という概念で統合してしまい、隠蔽化しよう」という考え方だと思います。

つまり分類としては高水準の話ですね。

ですから、ストリームといっても、ネットワークからデータの流れがある場合もあるし、ファイルから読むこともあるでしょう。しかし、いろいろなIOをまとめてストリームという概念で扱うので、プログラムの再利用性が高まるのです。

つまり、最初はディスクから情報を取得するクラスとして書いておいて、ネットワークから情報を取得するよう改造するときに非常に楽になる、というようなものです。

質問者さんはかなり低水準のことに興味を持っておられるようなので、ストリームにこだわらすIOについて勉強したり、JavaのIO周りのクラスのソースをご覧になったらいかがでしょうか。この場合は、先に少しデコレータパターンというものをちらっと勉強しておけば、見通しがききやすいかなと思います。お勧めとしては、thinking in javaがあります(ネットで検索してみてください。無料のjava本です。IOの項にかなりいい説明があります)
    • good
    • 0
この回答へのお礼

ありがとうございます。

>ネットワークからデータの流れがある場合もあるし、ファイルから読むこともあるでしょう。しかし、いろいろなIOをまとめてストリームという概念で扱うので、プログラムの再利用性が高まるのです。

となると・・・ こういうことでしょうか?
「INPUTからOUTPUTのIOをまとめなかった場合、
aにはaというIO 、 bにはbというIO CにはCというIO・・・
 と、一つ一つのIOに着目して対応をしていたのでは、手間が掛かるため、IO関係はIO関係という括りで取り扱いができるようにした」

ということでしょうか?
(一つの考えとしてそのためにストリームが産まれたと考えられますでしょうか?)


低水準について興味がでてきましたので、勉強していけたらいいなと思います。

お礼日時:2009/05/17 13:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qストリームのフロントグリル交換について

ストリーム(RN-3)12年式 のフロントグリル
を交換したいのですが、どうやって外すのですか?
やっぱりバンパーを外さないとできないのでしょうか?
自分でやられた方、難易度と所要時間はどれくらい
かかるものでしょうか?また、交換方法も教えて下さい。
よろしくお願いします。

Aベストアンサー

ストリームのグリルは下側がバンパーをビスで止まってるので
バンパーを外さないとグリルも外れません。

おそらく・・・初めてのバンパー外し作業ですよね?
余計な傷を増やしたりする危険が大きいので お店に頼んだ方が無難な気がします。
慣れればそんなに大変な作業ではないんですけどねぇ。。。

参考にページがありましたのでご覧ください。
http://www3.to/papion/

ここの右の「Tuning manual」から「フロントグリル取り付け手順」へ

これを見て自分でもできそうならチャレンジ!!
無理っぽかったら潔くお店に頼みましょう。

Q複数のストリームからのデータの受け取り

お世話になっております。
今、一つのホストに対して複数のホストからいっせいにデータを送るというプログラムを組もうとしています。
送りたいデータはdouble型の配列なのですがストリームに書き込むには多分? OutPutStreamクラスのwrite_double_arrayというメソッドを使うようなのですがこれの使い方がいまいちわかりません。

public abstract void write_double_array(double[], int offset, int length)
とあるように抽象メソッドなのでサブクラスでオーバーライドしなければいけないようなのですが、実装の仕方がわかりません。
また、これの引数のoffsetとは送信する複数のホストすべてで共通だとまずいですか?

入出力に関してはあやふやなところがおかしいのでなにか間違って認識しているようでしたらその指摘もお願いします。

Aベストアンサー

たぶんですが、CORBAの話であると推測します。

ですから、CORBAの入門サイト等で、お勉強してくると良いでしょう。

CORBAと関係ない話なら、この回答は無視してください。

参考になりそうなサイトを紹介しておきます。

JDK 6 Java IDL 関連 API & 開発者ガイド -- Sun Microsystems
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/idl/index.html

他にも、CORBA関係の入門サイトは検索すれば、みつかるかと思いますよ。

また、
> public abstract void write_double_array(double[], int offset, int length)
> とあるように抽象メソッドなのでサブクラスでオーバーライドしなければいけないようなのですが、実装の仕方がわかりません。
との事ですが、特に、CORBAを利用するアプリケーション側で、OutputStream内の
抽象メソッドを実装する必要は無い様子です。

たぶんですが、CORBAの話であると推測します。

ですから、CORBAの入門サイト等で、お勉強してくると良いでしょう。

CORBAと関係ない話なら、この回答は無視してください。

参考になりそうなサイトを紹介しておきます。

JDK 6 Java IDL 関連 API & 開発者ガイド -- Sun Microsystems
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/idl/index.html

他にも、CORBA関係の入門サイトは検索すれば、みつかるかと思いますよ。

また、
> public abstract void write_double_array(double...続きを読む

QCR-Z第2世代のフロントグリルに対応?

最近発売されたばかりのCR-Z第2世代を購入したのですが、第1世代で無限オプションとしてあった「フロントスポーツグリル」と「イルミネーション」は適合するでしょうか?

http://item.rakuten.co.jp/uous/mugen-aero-crz/#mugen-aero-crz

一応同じラインの車でエンジンやバッテリー等が少し良くなったみたいですが、フロント部分やデザインは同じだと思ってるのですが・・・

CR-Zに詳しい方、教えてください!

Aベストアンサー

マイナーチェンジ前と後の2台とも持っています。
(前の1台はもうすぐ譲渡予定)

「グリルの幅など」は実際に計ってみました。

マイチェン後は、無限オプション品の設定も、似て非なるものになっています。

無限オプション扱いディーラーで確認すればいいでしょう。

補足の記述文面からは
質問者様の疑念と非礼を感じますので
「実車で調べてくれ」という補足には
「失礼ながら」答えられないでしょう。

Q文字・バイトストリームについて?

JAVAではなく、プログラミングに関する質問になってしまうのかもしれないのですけど。

テキストに~print((byte)’A’)でAはbyte値65と書かれていたのですけどAはどういう基準で65なのですか?

それと文字ストリームはunicodeという約束ごとで文字の数字が決まると思うのですがバイトストリームはどう言った基準で文字が数字になるのですか?Aは65と書きましたがバイトストリーム上では違う数字になっていると思いますが違いが分かりません(同じバイトなのに)

あと文字バイトストリームに関する基本的なことが分かるテキストがあったら教えてください。

よろしくお願いします。

Aベストアンサー

コンピュータでは、文字に数を割り当てて文字を扱っていることはご存知なのですね? Javaでは、Unicodeで定められた番号付けで文字を扱っています。

例えば、'A'という文字はUnicodeでは0x41番に割り当てられています。「0x41」というのは16進法で41になるという意味で、10進法なら65になります。プログラム中に 'A' と書いた場合、実際には 'A' という文字そのものではなくてそれに対応する 0x41 (65) という数を表していることになるわけです。つまり、65というのは 'A' のUnicode番号というわけですね。

(ちなみに、'A'のUnicode番号とASCII番号は同じですが、Javaで使われているのはあくまでもASCIIではなくUnicodeです。)

プログラム中に 'A' と書くと、char型のデータとして、つまり文字を表す数として扱われますが、その左に (byte) をくっつけることでchar型からbyte型に変換(キャスト)しているわけです。
char型には文字を表すという明確な意図がありますが、byte型は単に8ビットのデータとして扱われるだけで、明確な意味づけはされていません。つまり、
「バイトストリームはどう言った基準で文字が数字になるのですか?」
という質問の答えは「基準はない」です。
byte型はあくまでもデータに過ぎないので、「文字」との直接の関連はないのです。

ただし、byteと「文字(char)」を間接的に関連付けるものはあります。それが「エンコーディング」というものです。「Shift_JIS」「EUC-JP」「UTF-8」などが有名ですが、他にもいろいろなエンコーディングがあります。エンコーディングによって単なるデータ(byte)と意味のある文字(char)との相互変換ができるわけです。
なお、型をキャストすれば無理やりbyteとcharを相互変換できますが、それではただ型が変わっただけで、意味がありません(情報が壊れてしまう)。

質問文にあるプログラムでは文字をbyteにキャストしていますが、キャストした時点で「'A'という文字を表している」という情報は失われてしまうのです。


バイトストリームと文字ストリームの違いはバイトと文字の違いと同じです。
もちろん、バイトストリームで文字をやり取りしたり、文字ストリームでバイトをやり取りしたりすることはそのままではできないので、必要に応じてエンコードをすることになります。

コンピュータでは、文字に数を割り当てて文字を扱っていることはご存知なのですね? Javaでは、Unicodeで定められた番号付けで文字を扱っています。

例えば、'A'という文字はUnicodeでは0x41番に割り当てられています。「0x41」というのは16進法で41になるという意味で、10進法なら65になります。プログラム中に 'A' と書いた場合、実際には 'A' という文字そのものではなくてそれに対応する 0x41 (65) という数を表していることになるわけです。つまり、65というのは 'A' のUnicode番号というわけですね。

(...続きを読む

QMUGENをダウンロード出来るサイト教えて下さい

「mugen1.0」をダウンロードしたいのですが、
ダウンロード出来るサイトがいくつもあってどれが安全なダウンロード方法か分かりません。

どなたか「mugen1.0」を安全にダウンロード出来るサイトがありましたら教えて下さい!

Aベストアンサー

無料ダウンロードできるURLは、

http://mugen.softonic.jp/

>安全にダウンロード出来るサイトがありましたら教えて下さい!

パソコンを起動した時点で安全ではありません…、そのためにウイルス除去ソフトがインストールするのです、これでも完全と言えない世界なのです、
以上の条件を整えて、ソフトをダウンロードするときは何があっても自分の責任のうえで実行すること、できない場合はやめておく、
以上お役に立てれば幸いです、
gansan & mituzi Japan

Q出力ストリームをバイト配列へ変換するには

出力ストリームをバイト配列へ変換するには

いつもお世話になります。

BufferedOutpuStreamで取得したオブジェクトを(ByteArrayOutputStreamでインスタンス生成)、バイト配列へ変換するにはどのようにすればよいでしょうか。
ByteArrayOutputStreamだと、toByteArrayメソッドでバイト配列へ変換できるのですが、効率化を考慮し、BufferedOutputStreamへ出力するように
しているのですが、この場合だと取得したBufferedOutputStreamをバイト配列へ変換する方法が分からず困っています。

宜しくお願いします。

Aベストアンサー

>ByteArrayOutputStreamでインスタンス生成

ByteBufferじゃ駄目なんですか?

 Bruce Eckel, "Thinking in Java (4th Edition)" (Prentice Hall, 2006)
によると、p.946~p.948に、次のようにあります。


The Java “new” I/O library, introduced in JDK 1.4 in the java.nio.* packages, has one goal: speed.
(中略)

The speed comes from using structures that are closer to the operating system’s way of performing I/O: channels and buffers.
(中略)

The only kind of buffer that communicates directly with a channel is a ByteBuffer?that is, a buffer that holds raw bytes.
(中略)

Three of the classes in the “old” I/O have been modified so that they produce a FileChannel: FileInputStream, FileOutputStream, and, for both reading and writing, RandomAccessFile.
Notice that these are the byte manipulation streams, in keeping with the low-level nature of nio.
The Reader and Writer character-mode classes do not produce channels, but the class java.nio.channels.Channels has utility methods to produce Readers and Writers from channels.

Here’s a simple example that exercises all three types of stream to produce channels that are writeable, read/writeable, and readable:

//: io/GetChannel.java
// Getting channels from streams
import java.nio.*;
import java.nio.channels.*;
import java.io.*;

public class GetChannel {
private static final int BSIZE = 1024;
public static void main(String[] args) throws Exception {
// Write a file:
FileChannel fc =
new FileOutputStream("data.txt").getChannel();
fc.write(ByteBuffer.wrap("Some text ".getBytes()));
fc.close();
// Add to the end of the file:
fc =
new RandomAccessFile("data.txt", "rw").getChannel();
fc.position(fc.size()); // Move to the end
fc.write(ByteBuffer.wrap("Some more".getBytes()));
fc.close();
// Read the file:
fc = new FileInputStream("data.txt").getChannel();
ByteBuffer buff = ByteBuffer.allocate(BSIZE);
fc.read(buff);
buff.flip();
while(buff.hasRemaining())
System.out.print((char)buff.get());
}
} /* Output:
Some text Some more
*///:~

>ByteArrayOutputStreamでインスタンス生成

ByteBufferじゃ駄目なんですか?

 Bruce Eckel, "Thinking in Java (4th Edition)" (Prentice Hall, 2006)
によると、p.946~p.948に、次のようにあります。


The Java “new” I/O library, introduced in JDK 1.4 in the java.nio.* packages, has one goal: speed.
(中略)

The speed comes from using structures that are closer to the operating system’s way of performing I/O: channels and buffers.
(中略)

The only kind of buffer that communica...続きを読む

Qフリーゲーム『MUGEN』について色々解らない事が。

私は二ヶ月ほど前から『MUGEN』と言うフリーゲームをやっているのですが、
このゲームを知っている方なら分かると思いますが、
このゲームは自由に「キャラクター・ステージ」等を変えたりすることが出来るんですが、
今一キャラの追加方法が全く分かりません。
キャラをダウンロードし、デスクトップにそのファイルを置いたのですが、そこからが解りません。
だれかこれらの事に詳しい・精通している方がおられましたら、どうぞよろしくお願いします。

ちなみにこの様な些細な事でスレッドを建ててしまい申し訳御座いません。

※MUGENについて知らない方はこちら
http://mugen-site.hp.infoseek.co.jp/

Aベストアンサー

どうも、こんにちは。
多分問題はもう解決されてると思いますが、一応助言させてもらいます。

ファイルを解凍するにはこれが必要です。
http://www.diana.dti.ne.jp/~winrar/

あとは無限小学校見ればわかると思います。

Qsubstring バイト単位でやりたい

Java初心者でちょっと困ったことがありまして・・・
文字列をバイト単位で切り取りたいのですが やり方がわかりません。
substringを使ってやろうとすると、
純粋に文字の単位で切り取ってしまいます。
bbb = "あいう"
#bbb.substring(1,2)# →"い"
bbb = "abc"
#bbb.substring(1,2)# → "b"

バイト単位で文字列の切り出しを行いたい場合
どのような方法で実現すればよいのか知恵をおかりしたいのですが
よろしくお願いいたします。

Aベストアンサー

char単位でなく、byte単位で切り出したいのでしたら、
byte配列に変換してからやればOKです。

String a = "あいう";
String b = "abcdef";
//aの2バイト目から4バイト→"いう"
System.out.println(new String(a.getBytes(), 2, 4));

//bの2バイト目から4バイト→"cdef"
System.out.println(new String(b.getBytes(), 2, 4));

ただし、注意点があります。
String-byte配列の変換には、どの文字エンコーディングで
を使用するか指定する必要があります。
「EUC_JPのbyte配列に」とか「Shift_JISのbyte配列に」とかで意味が変わるからです。

上記の例のように文字エンコーディングを指定しない場合は、
システムのデフォルトの文字エンコーディングが使用されます。
システムのデフォルトを使用すると、実行環境によって結果が変わってきます。
同じ半角カタカナの"ア"でも、実行環境によって
1バイトだったり2バイトだったり3バイトだったりするので要注意です。

文字エンコーディングの指定の仕方は、こんな感じです。
a.getBytes("Shift_JIS") //StringをShift_JISのbyte配列に
new String(bytes, "Shift_JIS") //Shift_JISのbyte配列をStringに

詳しくはAPIリファレンスを見てください。

char単位でなく、byte単位で切り出したいのでしたら、
byte配列に変換してからやればOKです。

String a = "あいう";
String b = "abcdef";
//aの2バイト目から4バイト→"いう"
System.out.println(new String(a.getBytes(), 2, 4));

//bの2バイト目から4バイト→"cdef"
System.out.println(new String(b.getBytes(), 2, 4));

ただし、注意点があります。
String-byte配列の変換には、どの文字エンコーディングで
を使用するか指定する必要があります。
「EUC_JPのbyte配列に」とか「Shift_JISのby...続きを読む

Qmugenで織田信長をダウンロードしましたが、

http://mugen.shisyou.com/このサイトでダウンロードしましたが、mugenを起動してみると、キャラ選択画面にいることはいる(キャラの顔写真はでません)のですが、選択して開始しようとすると英語の表記が出てきて勝負ができません。
一体どうすれば良いでしょうか?

Aベストアンサー

MUGENがどういう性質の物か理解されてますか?
ゲーム画像をそのまま使用するなどするものがあったりするため、グレーゾーンのキャラが多いということを理解されてますか?
不用意にキャラクター製作者様のサイトを晒さないでください。
こうしたことが原因で作成中のキャラが、他のキャラ共々削除されるということが実際に今まであるのです。

また、なぜキャラクター作成者のサイトで聞かないのですか?
そもそも、現在公開停止中のキャラだと記憶しておりますが。
自己解決を必ずするというのは無理があるでしょうが、
基本MUGENは自分で調べてどうにかするものです。
分からないから聞く、のではなくちゃんと調べて、
分からないなら分からないなりにどういったエラーが出たか、
こうした所ではなくMUGEN関連の掲示板などで聞いてください。

Qファイルの1行のデータをbyte単位でストリング配列に書き込みたい

こんばんは。お世話になります。

ファイルに固定長のデータがあります。1行につき20件位あります。
データは固定長なので、行が変わってもデータの項目名は変わりません。最終的には、このデータをDBに入れます。

CSVファイルだと、カンマで区切ってあるので、データを分けることが出来るのですが、固定長のデータはどういう方法で、区切るのでしょうか?

誰か分かる方は教えてください。よろしくお願いします。

Aベストアンサー

コンストラクタに
String(byte[] bytes, int offset, int length)
と言うのがありますがこれを使えばすむ話ではないのですか?


人気Q&Aランキング

おすすめ情報