Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

FileInputSteamのread()について

調べてもわからなくて、どなたか回答をお願いします。
import java.io.*
class Test {
      public static void main(String[] args) {
            int c;
            int kei=0;
            try {
                 FileInputStream fis=new FileInputStream("Data1.txt");
                 while ((c=fis.read()) !=-1) {
                         kei+=c;
                ---省略--------
ファイルの終わりではread()メソッドは -1 を返すのでwhile文の条件となってますが、
データの中に -1 があったらどうなるのかと考えました。
-1とかマイナスの値は表現しないということでしょうか。

初歩的な質問ですみません。

4

回答

35620

閲覧

4件の回答

評価

0

FileInputStreamに限らずInputStreamは何でも一緒だが。
データそのもの(byte)はマイナスの値になり得る。
read()の戻り値がbyteではなくintである、という点に注目しよう。

評価

0

回答をありがとうございます。
c=fis.read()
は、1バイトのデータを4バイトのint型に変換してcに代入しているのでしょうか?
それならマイナスにはなりませんね。
こんな理解でいいでしょうか。

評価

0

>1バイトのデータを4バイトのint型に変換してcに代入しているのでしょうか?
日本語の問題かも知れないが、int型に変換しているのはFileInputStream.read()内。
そして、その変換と同時に一度int型の「戻り値」へ代入している。

JDKならJava部分のソースコードが同梱されているので、読んでみると勉強になる。
中級レベルと言える人でも、意外と一見「え?」と思ってしまい、じっくり読んでみると「なるほど」と思えるところもある。
FileInputStreamのread()はネイティブコードだが、Java7で導入されたFiles.newInputStream()の実体ChannelInputStreamの例が以下。

    public synchronized int read() throws IOException {
        if (b1 == null)
            b1 = new byte[1];
        int n = this.read(b1);
        if (n == 1)
            return b1[0] & 0xff;
        return -1;
    }
なんで「& 0xff」なのかアヤフヤなら、もう一回調査してみよう。

評価

0

read()の中での処理があったんですね。
1バイトをただ読み込むだけと思ってました。
下のほうに書いていただいたメソッドは自分には理解できませんので、
もう少し勉強してから見直してみます。
ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。