• ベストアンサー

ストリームのread()の-1

はじめまして。 教えていただきたいのですが、ストリーム(例えばFileOutputStream)のread()メソッドについてす。 読み込みファイルの最後に達した場合-1をリターンするとあるのですがファイルの値で-1を持っていた場合、前者と後者の違いは何で判断するのでしょうか? お手数ですがお教え下さい。

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

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

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.4

分からない用語が出てきたら、まず検索してみましょう。 "unsigned int"、"signed int"で検索すれば、コレに対する説明はたくさんヒットします。 unsigned intは「符号なしint」で、いわゆるマイナスの値をとらない数値形式です。 signed intはその逆で「符号ありint」です。 両者の細かな説明はWebで調べるか、Cの本を読むといいと思います。 コンピュータの内部で負の値がどのように表現されてるかの勉強にもなります。

been2005
質問者

お礼

度々ありがとうございました!! 一度調べて確認しておきます。 ご教授ありがとうございました。

その他の回答 (3)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

readメソッドは、読み込んだ1byteのデータをunsigned intに変換し、それをさらにsigned intに変換して返します。 なのでreadメソッドはファイルの終端以外で負の値を返しません。 符号付の-1はビット列で表すと0xFFです。(これは分かりますよね?) 0xFFをunsigned intに変換すると255です。 なので、-1という値のデータはreadメソッドでは255が返ってきます。

been2005
質問者

補足

回答ありがとうございます!! 0xFFという表現方法は大丈夫なのですが、unsigned intとsigned intとはなんでしょうか。 たびたびすいません。。。

回答No.2

FileOutputStreamにはreadメソッドはありませんよ。 1byteずつ読み込むので -1 とファイルに書いてあった場合にreadメソッドで読み込むには、 「-」と「1」と2回読み込むことになります。

been2005
質問者

お礼

回答ありがとうございます。 FileInputStreamの間違いでした。。。。

  • sonetea
  • ベストアンサー率26% (9/34)
回答No.1

1byteの読み込みなので、ファイルから読み込まれた場合のデータは0x00~0xFF(0~255)までとなります。 データとしては-1は存在しません。

been2005
質問者

お礼

ありがとうございます!! もう一度試してみます!!

関連するQ&A

  • InputStream.read()でタイムアウトの処理をしたい。

    InputStream.read()でタイムアウトの処理をしたい。 現在自分は、InputStreamに入力されたデータをOutputStreamに移したいとかんがえているのですが、途中でreadメソッドが固まってしまいうまくいきません。 ソースで説明させていただきますと、 public static int copy(InputStream input,OutputStream output)throws IOException { byte[] buffer = new byte[1024 * 4]; int count = 0; int n = 0; while (0 < (n = input.read(buffer))) //ここで固まる { output.write(buffer, 0, n); count += n; System.out.println("available = " + input.available()); System.out.println(count + " byte = " + n); } return count; } このようなコピーするメソッドを書いたのですが、何度かループした後readメソッドで固まってしまいます。また、availableは常に0を返しております。 おそらくストリームの終わりが検出できないため、このような状態になっていると推測されるのですが、プログラムの性質上、InputStreamに入ってくるデータを変更することはできません。 なのでこの問題を解決するべく、ある程度の時間readメソッドがブロックされたら、breakするというような処理を書きたいのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • Java
  • Java ストリームでの文字列の扱いについて

    Javaのストリームを勉強している際に、下記のサンプルソースを見ました。 (ユーザが入力した内容を、1文字ずつそのまま画面に返すプログラムです。) 疑問点があるので教えて下さい。 ===== import java.io.*;  public class Sample{   public static void main(String args[]){   int b;   try{    while((b = System.in.read()) != -1){    System.out.print((char)b); 以下省略 ====== ■疑問箇所1. while((b = System.in.read()) != -1) とありますが、 (1)ユーザが入力した文字(整数ではない)が、何故、int型の変数に代入出来るのでしょうか? (2)read()メソッドはint型の戻り値を持つようですが、EOFの"-1"以外の時は、  どんな数値が返されているのでしょうか?  (read()メソッドは、1文字読み込んで、戻り値でその文字をUnicodeにエンコードした値を返しているとか?) ■疑問箇所2. System.out.print((char)b); とありますが、変数bには数値が入っていると考えられます。 これは、変数bの整数が、(char)でキャストされる事によって、 再び、文字に「変換」されているのでしょうか? 以上、教えて下さい。

    • ベストアンサー
    • Java
  • ファイル読み込み/書き込み速度を上げるには

    下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか? BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data")); BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data")); int c ; while((c = in.read()) != -1) { out.write(c); } in.close(); out.flush(); out.close();

    • ベストアンサー
    • Java
  • / が何時の間にか「Read-only file system」になってしまった

    PlamoLinuxの3くらいを使っています。 18日間起動しているマシンで、 いつものように作業をしようと思ったら、 なぜか動作が変でした。 いろいろと調べてみると、どうやら / が何時の間にか「Read-only file system」になっていました。 そのため、/tmpに一時的に書き込んだりする プログラムの動作がおかしくなったのではないかと思っています。 試しに「# touch /tmp/test」を実行すると 「Read-only file system」とか「読み込み専用ファイルシステムです」 と文句を言われてしまいます。 /etc/fstabと/etc/mtabを確認したところ、 「/dev/hda2 / ext3 defaults 1 1」 「/dev/hda2 / ext3 rw 0 0」 だったので、問題はないかなと思っています。 「# mount -o rw,remount /」を試してみると、 block device /dev/hda2 is write-protected, mounting read-only と言われてしまいました。 ログを確認したところ、7/30 04:26に書き込まれたのが最後で、 それ以上書かれていないところからすると、 その直後くらいに / がRead-onlyになってしまったようです。 ちなみに、ログにはおかしな記録は見当たりませんでした。 /dev/hda1がswap /dev/hda2が/ /dev/hda3が/boot /dev/hda4が/home で、/だけがRead-onlyになってしまったようで、 /home, /bootは書き込めました。 再起動はできるだけしたくないのですが、 元にもどす方法はないでしょうか? 宜しくお願いします。

  • 名誉毀損とプライバシー

    名誉毀損とプライバシー侵害の違いの一つは、前者は報じられた情報が事実である場合は免責されるのに対し、後者はたとえ真実であろうとも他者に知られたくない情報であると判断されれば免責されないことである、というのは正しいですか?

  • FileOutputStreamについて

    FileOutputStreamについて教えてください。 下記で行っている処理は入力ストリームからデータを受け取り、TEMPというファイルに 保存するというものです。たとえば入力ストリームから得るデータとしてはTEXTでA~Z まで書いたものだったとします。このデータは26バイトのデータです。よってwhile文を 2回実行して終わります。その後TEMPファイルを見るとYZというデータが入っているだけ でした。私の目的としてはA~Zまでファイルに書いてほしいのですがどうすればいいので しょうか?下記のfo = new FileOutputStream("TEMP",true);に変更して追加書き込みできる ようにしてみたらA~Zまで書いてくれるようになったのですが以前のデータが残っていると その続きから書いてしまいます。何かいい方法はないでしょうか? またfo.write(readBuffer,0,newData);の0の部分ですがこれはオフセットであると 書いてありますが、どういうときに使うものなのでしょうか? ***************************** byte[] readBuffer = new byte[20]; FileOutputStream fo; InputStream from_you; try{ fo = new FileOutputStream("TEMP"); }catch(IOException e){ System.err.println("例外" + e + "発生しました"); } try{ while(from_you.available() > 0){ nt newData = from_you.read(readBuffer); fo.write(readBuffer,0,newData); } fo.flush(); fo.close(); }catch(IOException e){ System.err.println("例外" + e + "発生しました"); }

    • ベストアンサー
    • Java
  • return new使用時

    いつもお世話になっています。 return返却時に、newインスタンスを使用する場合、 newクラス名()、newクラス名().メソッド名()での返却が可能だと思うのですが、このような場合の実装方法はどうなるのでしょうか? 考えているのは、実装すると、 (1)、return new クラス名().メソッド名()で行う場合 public クラス名 method1() { return クラス名; //実現できない return このクラスに存在するメソッド名(); //OK return null; //OK } といった形になり、クラス名()が実装できない (2)、return new クラス名()で行う場合 public クラス名 method2() { return クラス名; //OK return null; //OK } となり、 (1)で返却された場合、返却されたメソッドの機能を持つことができると同時に、クラス自体の機能も持つ(この場合、クラスオブジェクトは持てず単にそのメソッドのみ使用可だと思っていたのですが...) (2)で返却された場合、返却されたクラスオブジェクトを持つことができる といった感じになります。 実際に、試したところ(1)と(2)でさほど変化がありません。 言いたいことは、 return時に、クラス名()で返却された場合、とクラス名().メソッド名()で返却された場合の違いと、 実際に使用されるのはどういったときかを教えて頂きたいのですが。 また、メソッドがつくのとつかない場合の違いはあったりするのでしょうか? 説明が不十分で申し訳ありません。 宜しくお願いします。

    • ベストアンサー
    • Java
  • staticのメリット、デメリット

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • バブルソート、あなたはどちら派?

    昇順にソートする場合ですが、 配列の先頭とその次の値を比較し、大きい数字の方を後ろへ持っていくパターンと 配列の最後とその手前を比較し、小さい数字を前へ持っていくパターンがあると思います。 前者のほうが、湖底から水面へ泡がだんだん大きくなっていくバブルのイメージで 長年これがスタンダードだと思っていたのですが、 後者についてを「小さい泡がだんだん移動していくイメージなのでバブルソートと言う」と 断言しているサイトや書籍もあります。 どちらも間違いではないと思います。 ですが、他人に教えることを想像したとき、 どちらかというと先に前者を教えてから、後者のやり方もあるよと伝えた方が 直感的に理解しやすいかなと思いました。 皆さんはどちら派ですか? また、前者と後者を使い分けるメリットがもしもあればご教示頂けませんか?

  • 虫歯1本と虫歯5本どちらを信じるか??

     ある日、某歯科に行った際に、虫歯が5本と宣告され、ショックを受けました。信じられなかったので、別の歯科に行きましたが、今度は1本といわれました。前者は、最近の感じの新しい歯科で若い歯科医です。後者は古いタイプの歯科医でお爺さんでした。  後者は虫歯を鏡で見せくれ、納得しました。これほどの違いがなぜ出るのでしょう?うそではないと思うのですが・・・ただ前者はレントゲンをとっています。これから判断したのでしょうか?  前者は、5本すべてに銀をつめなければならないといわれています(かなり抵抗感があります)。最終的にどちらを信じるべきか教えていただきたいと思います。