
今JAVAを勉強しているのですが。
少しつまづいてしまいました。
----------------------------------------------
import java.io.*;
class Cat {
public static void main(String args[]) throws IOException {
File inputFile = new File(args[0]);
FileReader in = new FileReader(inputFile);
BufferedReader br = new BufferedReader(in);
//・・・続く
----------------------------------------------
上のプログラム全て、といいますか
import java.io.*; や BufferedReader のことが特によく分かりません。いろいろサイトや本などを見てみたのですが、それでもいまいち理解できませんでした。どなたか、教えてください、お願い致します
No.2ベストアンサー
- 回答日時:
あー、ここはつまづきますよねぇ。
IO系はもう、呪文ですよね、呪文。
でも、ここを正しく理解できるとその汎用性の高さや柔軟性に感動できますよ。
プログラムをもう少し細かくしてましょう。
import java.io.*;
class Cat {
public static void main(String args[]) throws IOException {
File inputFile = new File(args[0]);
FileInputStream fs = new FileInputStream(inputFile);
InputStreamReader ir = new InputStreamReader(fs);
BufferedReader br = new BufferedReader(ir);
//・・・続く
FileReaderはFileInputStreamとInputStreamReaderの組み合わせでしかないので、細かくするとこうなります。
なんだかごちゃごちゃしていますが、当然それぞれに役割があり、それを理解するためにはコンピューターにおける文字の取り扱いついて知っておく必要があります。
本当はコンピューターは意外とおばかさんで、文字というものを知りません。
数字しか知らないのです。
しかし、それでも文字を取り扱わなくてはいけません。
苦肉の策として、文字を数字として置き換えるという方法がとられました。
話を単純化させるために世界には「あいうえお」の5文字しか文字がないとしましょう。
コンピューターもわかるようにそれぞれに背番号を打ちます。
あ(0)、い(1)、う(2)、え(3)、お(4)
もし、「あいうえお」と書かせたテキストファイルがあるとしたら、実はそのファイルの中身は「01234」という数字が記録されているだけなのです。
問題が複雑なのが、この背番号制(文字コード)が複数あり、往々にしてファイルとして書かれている文字コードとJavaで内部的に使用している文字コードが違うことです。
ファイルで書かれている文字コードが上記、Java内部で使用されている文字コードが
あ(10)、い(11)、う(12)、え(12)、お(13)
と、しましょう。
では、Javaではこれをどのように読み込んでいくのかというと、
(1)まず、Fileクラス
ファイルのパス、つまり位置を表すクラスですね。
(2)次にFileInputStream
Fileで表してある位置の生のバイトデータを読み込むクラスです。今回の例で言うとファイルから「01234」という数字を順次読み込んでいきます。
(3)そして、InputStreamReader
InputStreamを内部に保持し、そのInputStreamから読み込まれた数字をJava内部で使用する文字コードに変換し文字をして解釈していきます。
たとえば、InputStreamから0が読み込まれるとそれを10に変換し、Java内部で「これは『あ』を表しているんだな」と解釈します。
これで、基本的には文字を読み込めます。
(4)では、BufferedReaderは何をやっているかというと、
InputStreamReaderで一文字づつ文字を読み込んでいると、そのたびにハードディスクにアクセスが発生し効率的ではありません。お猪口で井戸水をくみ上げているようなものですね。
読み込むときはドバッと読み込みたいわけです。
BufferedReaderはInputStreamReaderなどのReaderを内部に保持し、文字が必要なときに保持しているReaderからドバッと読み込み、ある程度自分の中に貯めておき、それを小出しにしてくれるわけです。
そうすることにより、ハードディスクへのアクセスのパフォーマンスが向上します。
だいたい理解できたでしょうか?
でも、なぜ、こんなに機能をばらばらにしてあるのでしょうか?
それは、柔軟性と汎用性にあります。
今回はFileInputStreamを使いましたが、これをSocketのInputStreamに変えるとあっという間にネットワークから文字を読み込むプログラムにはやがわり。
URLConnectionのInputStreamにするとWebから文字を読みことができ、組み合わせによっていろんなことでできます。
最初の敷居は高いのですが、いったんこの仕組みを理解することができれば、かえって覚えることは少なくてすみますよ。
No.3
- 回答日時:
要点だけ。
Reader系は"テキスト"データを読むためのものです。読み込んだデータは文字列として取得できます。
FileReaderは、ファイルから読み込むReaderです。つまりテキストファイルを読み込むReaderです。
Reader系はどれも同じように使用可能です。ファイルからだろうがストリームからだろうが、同じようにreadすることができるので、使い方が統一されていて覚えるのが楽です。
BufferedReaderは、他のReaderにかぶせて使うReaderです。バッファリングすることで効率的に読み込みを行います。
今回の例では、
FileからFileReaderを作りました。これでテキストファイルを読み込めます。
さらにFileReaderからBufferedReaderを作りました。これでバッファリングしながら(効率的に)テキストファイルを読み込めます。
BufferedReader→FileReader→File
Readerを連鎖させることで、色々な組み合わせができます。
BufferedReader→InputStreamReader→ソケット
ネットワークからのデータを文字列としてバッファリングしながら読み込むReader
BufferedReader→InputStreamReader→ByteArrayInputStream→バイト配列
バイト配列のデータを文字列としてバッファリングしながら読み込むReader
こんな感じでどうでしょう?
No.1
- 回答日時:
「import java.io.*」は「java.io」にある
全てのクラスをインポート、つまり使用可能にする
という意味です。
javaでインポートをする必要がないパッケージは
「java.lang」だけなので、
「java.io.BufferedReader」はインポートする必要が
あります。
「import java.io.*」を「java.io.BufferedReader」に
変えても問題ありません。
参考URL:http://www.toyama-cmt.ac.jp/I/ensyuu/java/docs/j …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java final 1 2022/06/10 22:49
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Ruby 教えてください 2 2023/01/04 17:50
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java eclipse実行ができない 2 2022/07/27 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
setAttribute(String, int)は適...
-
シャットダウンフックが呼ばれない
-
文字列を数式に
-
ColabでのPytorchのエラー
-
Xercesを使ったjavaでのXML解析
-
透過GIFの判定の仕方ありますか?
-
Androidで画面遷移ができません.
-
文字サイズが可変のラベル
-
javaで画像出力
-
java8のawtの解説サイトを教え...
-
<forEach> 内で供給された "ite...
-
javaでアプレットの描画が出来ない
-
Javaを使ってデジタル時計を作...
-
(急募)一覧表画面でパスワード...
-
JTabbedPaneのタブが開かれてい...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
ORA-01858: 数値を指定する箇所...
-
1~100までの数字を表示したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
ColabでのPytorchのエラー
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
シャットダウンフックが呼ばれない
-
importするには java.io.*; imp...
-
python OpenPyXLを使って出力結...
-
Javaを使ってデジタル時計を作...
-
HTMLでのTableタグデータ取得方法
-
Java での グローバルIP取得
-
Xercesを使ったjavaでのXML解析
-
JavaMailについて
-
コンパイルができません…
-
GridBagLayoutについての質問
-
透過GIFの判定の仕方ありますか?
-
サーバーAからサーバーBへPOST...
-
ある年月の前月(月の開始日)...
-
jFrameを使って複数の画面を生...
-
文字列を数式に
おすすめ情報