質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4298閲覧

JavaのFileReaderクラスのread()メソッドについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/08/12 12:33

FileReaderクラスのread()メソッドについての質問です。

import java.io.FileReader; public class Main { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader("sample.java"); int i = fr.read(); while (i != -1) { char c = (char) i; System.out.print(c); i = fr.read(); } } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { if (fr != null) { try { fr.close(); } catch (Exception e) { } } } } }

このコードでsample.javaの文字を出力することができますが、質問があります。
まず、
int i = fr.read();
とすることにより、一文字目を読み込んでいます。
次にwhile文の中で二文字目以降を読むことになっていますが、なぜ二文字目以降を読めるのでしょうか。
このコードのどこの部分が一文字目ではなく、二文字目にシフトさせるのかわかりません。
一体どうして二文字目以降を読むことができるのでしょうか。
回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

詳細はJava8 API リファレンスにもありますけれど、やや不親切ですね。

FileReaderなどの入力ストリーム系のクラスは読み込んだ位置を覚える機能もあり、read()メソッドは次の位置にある1文字を読み込む処理を行います。

まだ一度も読み込んでいなければ先頭の文字を返しますし、readメソッドを呼ばれるたびに読み込む位置を1つずらしてくれます。
次に読み込む位置を覚えてくれる機能がありますし、特定の位置から読み直す機能も提供されています。

投稿2016/08/12 12:43

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

down_voter

2016/08/13 01:05

名前からわかるとおり、Streamとは水の流れのようなものの比喩で、「読み込んだ位置を覚え」ているというよりは後戻りができないという方が適切です。 1文字目を受け取ってしまったら次に受け取れるのは2文字目(以降)で、再度1文字目をもらおうと思っても不可能です。 「読み直す機能」は、示されているjavadocに書かれている通り「効率性の向上または機能の追加」のためのもので「すべての文字入力ストリームでmark()/reset()オペレーションがサポートされているわけではありません」。 すなわちオプショナルな機能であり、ストリームという語が表しているものの本質ではありません。 オフィシャルなチュートリアルとして以下のページがあります。(※英語です) https://docs.oracle.com/javase/tutorial/essential/io/streams.html
guest

0

そのような処理は read() の中でやっていますので、ここに上げているソースの中には出て来ません。
実際にどうやっているかを知りたいのであれば、read() のソースを見るしかありません。

投稿2016/08/12 12:43

yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問