- PR -

FileReader.readの中身について

投稿者投稿内容
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2004-11-10 19:10
Java1.4.2を使っていますがやはりダメです。
System.setProperty("file.encoding", ...)
した後に
System.getProperty("file.encoding")
するとsetしたエンコーディング名を取得できるのですが、
一番最初に示したコードで試してみると出力結果は全く同じでSJISファイルのみ正しい結果になります。
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2004-11-10 19:11
Java1.4.2を使っていますがやはりダメです。
System.setProperty("file.encoding", ...)
した後に
System.getProperty("file.encoding")
するとsetしたエンコーディング名を取得できるのですが、
一番最初に示したコードで試してみると出力結果は全く同じでSJISファイルのみ正しい結果になります。
でくのぼう
大ベテラン
会議室デビュー日: 2003/10/06
投稿数: 162
投稿日時: 2004-11-10 19:16
ああ、System.setProperty() じゃなくて
-Dfile.encoding オプションをつけて JVM 起動してみてください。
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2004-11-10 19:37
[QUOTE]

ああ、System.setProperty() じゃなくて
-Dfile.encoding オプションをつけて JVM 起動してみてください。
[/QUOTE]

それもやってみましたが結果は同じでした。

しかし、ということはReaderはWindows環境ではShiftJISファイルにしか使用できないということになるのでしょうか。。。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-10 20:03
デフォルトのエンコーディングを決めうちしてコーディングするのは危険ではないですかね?
とりあえず当初の疑問は解決されているようですので、デフォルトエンコーディングについてさらなる議論が必要であれば新しいスレッドを立てるのが有意義だと思います。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-11-11 00:50
引用:

しかし、ということはReaderはWindows環境ではShiftJISファイルにしか使用できないということになるのでしょうか。。。


(BBコードとやらの記述はこれで良いのかしら?w)

デフォルトエンコードの変更が効かないからといって、デフォルトエンコード以外の
ファイルを使用できないって訳ではないと思いますけど。。。
確かにjava.io.Readerでは文字コードの指定は出来ませんが、そもそもこのクラスは
「何某かの文字情報を読み込む」という作業を抽象化した根底的抽象クラスであって、
具体的に「何某か」を定義するのはサブクラスに任されています。
例えばサブクラスのStringReaderなどは、Java内で使われているStringクラスを読む
ということに特化したクラスですよね?
JavaのStringはUnicode文字列と端から決まっていますから、StringReaderクラスに
文字コードの指定などは必要はないわけです。
この必要ない機能を親クラスが持ってたとしたら嫌でも子クラスはその機能を継承せ
ざる得なくなるわけで、設計として「これはどうか」という事になります。
エンコード処理が必要な文字情報の読み取りを行う為に、java.io.Readerを継承した
java.io.InputStreamReaderというのがライブラリには用意されています。
文字コードを指定し、エンコード処理をしながら読み込みたい場合には、このクラスを
使用しろ、という事だと思います。
で肝心のファイルからの読み取りクラスjava.io.FileReaderが、InputStreamReader
を継承しておきながら任意の文字コードを指定できないという事に不満があると思われ
ますが、これに関しては私も「何故?」という気持ちが無いわけではありませんw
「変更出来ない」というよりは「変更出来ないようにした」わけですから。

引用:

このクラスのコンストラクタは、文字エンコーディングとバイトバッファのサイズはデフォルトで適切な設定がされていることを仮定しています。 
                         〜リファレンスより引用〜



けれど、これの前文にある「文字ファイルからの読み込みのための簡易クラスです」の
「簡易」を突き詰めた結果が、StringReaderクラスのこの限定的な仕様になったと解釈
すれば、ある程度は納得出来る話でもあります。

文字コードを指定した上でファイルを読み込みたいのならば、
File->FileInputStream->InputStreamReader(必要なら->BufferedReaderまで拡張)
という手順を踏んで下さい。って事なのでしょう。
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2004-11-11 11:13
Readerのサブクラスを使用する分にはいいけれどReaderクラスそのものを関数のインターフェイスに使用したりするのはまずいということになりますね。

デフォルトエンコーディングについてはもし変更できたとしてもJavaのバージョンが上がるたびに仕様が変わりそうで怖くて使えないですね。マルチスレッドにしたときの問題もあるし。

ありがとうございました。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-11 11:25
Readerをメソッド引数にするのは問題ないと思います。

プログラム上でくだんのメソッドに引数として渡すReaderオブジェクトを作成する
責任を負っている個所が、正しいエンコードを指定して作成している、という前提
条件にすればよいのですよ。


また、一つのReaderオブジェクトをスレッド間で共有するなどということは、常識
的にやってはいけないことだと思いますよ。
ほかのスレッドでも言っていますが、ストリームI/Oの概念について勉強してみると
良いかと思います。

スキルアップ/キャリアアップ(JOB@IT)