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

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

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

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

Q&A

解決済

1回答

1212閲覧

FileReaderとBufferedReaderについて

kobe2018

総合スコア21

Java

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

1グッド

1クリップ

投稿2020/07/09 11:21

FileReaderとBufferedReaderの内部構造がいまいち理解できていません。

html

1FileReader f = new FileReader("data.txt"); 2BufferedReader bf = new BufferedReader(f);

FileReaderは1文字ずつ文字を読み込むと習いました。
BufferedReaderがreadLine()メソッドで文字を読み込む際は1文字読み込むのを何回も繰り返してバッファにためるのでしょうか。
いまいちイメージがつきません。
読み込み処理は具体的にどういった内部処理がされているか教えてください。

A-pZ👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/09 11:52

javadoc を読むか jdk に添付されているコードをよんでください
momon-ga

2020/07/09 13:37

> BufferedReaderがreadLine()メソッドで文字を読み込む際は1文字読み込むのを何回も繰り返してバッファにためるのでしょうか。 たぶん、違うよ。それじゃ遅いから。
kobe2018

2020/07/09 13:44

momon-gaさん 回答ありがとうございます。 BufferedReaderはreadLine()というものがありますが、 毎回1行分(?)読み込むという認識であってますでしょうか。
momon-ga

2020/07/09 14:17 編集

ソース見てないんで、わからないですけど。 1行100バイトで10行のファイルがあった場合、 まとめて、1000バイトで1回ファイルアクセスして、内部にもちます。 readLineが呼ばれるたびに、メモリ上の1000バイトから、100バイト分を返す感じじゃないですか > 毎回1行分(?)読み込むという認識であってますでしょうか。 毎回1行分の読み込み?というのを上記でいうと、ファイルI/Oの話であれば、NOだと思ってます。 > FileReaderは1文字ずつ文字を読み込む というのも厳密には違ってJavadoc読めばわかる。バッファ分読み込むっていうメソッドもあって、 それを使えば1文字づつじゃないのよね。
momon-ga

2020/07/09 14:07 編集

想像の話なので、これは回答じゃないです。(読み込みをバッファするって、こうゆうもんでしょ?的な話) > 読み込み処理は具体的にどういった内部処理がされているか教えてください。 は、やはり自分でソース読むか、有識者の回答を待つかだねぇ。
kobe2018

2020/07/09 14:49

1行ごとの読み込みではない かといって大容量のデータをすべて一度に読み込むわけではない 1度に読み込める量は決まっていて、 読み込み→表示(バッファがなくなるまで)→読み込み→表示→(繰り返し) といった感じなのかなと推測しました。 回答を待ちつつ、自分でも調べてみます。 ありがとうございます。
guest

回答1

0

ベストアンサー

FileReaderは1文字ずつ文字を読み込むと習いました。

FileReader は「文字単位」で読み込みます。
1文字ずつ読むこともできるし、指定した文字数まとめて読むこともできます。

これは FileInputStream が「バイト単位」で読み込むことと対比されます。
FileInputStream は、1バイトずつ読むこともできるし、
指定したバイト数まとめて読むこともできます。

テキストファイルの文字コードは通常 UTF-8 などのマルチバイト文字セットです。
1文字が 1バイトだったり、2バイトだったり、3バイトだったりします。

FileReader はそれを意識せず、文字単位でデータを読むためのものです。
マルチバイト文字を 2バイト固定の char に変換しています。
しかし、行単位で読むといった不定長のデータを読むことには適していません。

そこで、BufferedReader が登場します。
BufferedReader は、固定長(例えば1024文字) のバッファを持っていて、
FileReader を使って文字を読み込み、そこから、行を切り出すということを
しているのでしょう。

投稿2020/07/11 23:16

編集2020/07/11 23:45
kazuma-s

総合スコア8224

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

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

bsdfan

2020/07/11 23:42

本題とは違う部分ですが、InputStreamReaderはFileReaderと同じで文字単位でreadします。 バイト単位はInputStream(とかFileInputStream)ではないでしょうか。
kazuma-s

2020/07/11 23:46

おっしゃる通りです。回答を訂正しました。
kobe2018

2020/07/18 13:50

返答が遅くなり、大変、大変申し訳ございません。 また丁寧にありがとうございます! >FileReader は「文字単位」で読み込みます。 >1文字ずつ読むこともできるし、指定した文字数まとめて読むこともできます。 文字数をまとめて読み込めるというのは新しい発見でした。 ということはBufferedReaderのreadLineメソッドは以下のような作業を行っているのでしょうか。 ①FileReaderで文字を読み込む ②それをBufferedReaderでためこむ ③②から1行分切り取る 本題とそれるのですが、ファイル読み込みに関するクラスいっぱいあって混乱します・・・ (FileReaderやらInputStreamReaderやら) みなさんどうやって覚えられたんだろって気になります。 話がそれてしまいましたが、解決しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問