- - PR -
FileReader.readの中身について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-10 19:10
Java1.4.2を使っていますがやはりダメです。
System.setProperty("file.encoding", ...) した後に System.getProperty("file.encoding") するとsetしたエンコーディング名を取得できるのですが、 一番最初に示したコードで試してみると出力結果は全く同じでSJISファイルのみ正しい結果になります。 | ||||||||
|
投稿日時: 2004-11-10 19:11
Java1.4.2を使っていますがやはりダメです。
System.setProperty("file.encoding", ...) した後に System.getProperty("file.encoding") するとsetしたエンコーディング名を取得できるのですが、 一番最初に示したコードで試してみると出力結果は全く同じでSJISファイルのみ正しい結果になります。 | ||||||||
|
投稿日時: 2004-11-10 19:16
ああ、System.setProperty() じゃなくて
-Dfile.encoding オプションをつけて JVM 起動してみてください。 | ||||||||
|
投稿日時: 2004-11-10 19:37
[QUOTE]
ああ、System.setProperty() じゃなくて -Dfile.encoding オプションをつけて JVM 起動してみてください。 [/QUOTE] それもやってみましたが結果は同じでした。 しかし、ということはReaderはWindows環境ではShiftJISファイルにしか使用できないということになるのでしょうか。。。 | ||||||||
|
投稿日時: 2004-11-10 20:03
デフォルトのエンコーディングを決めうちしてコーディングするのは危険ではないですかね?
とりあえず当初の疑問は解決されているようですので、デフォルトエンコーディングについてさらなる議論が必要であれば新しいスレッドを立てるのが有意義だと思います。 | ||||||||
|
投稿日時: 2004-11-11 00:50
(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まで拡張) という手順を踏んで下さい。って事なのでしょう。 | ||||||||
|
投稿日時: 2004-11-11 11:13
Readerのサブクラスを使用する分にはいいけれどReaderクラスそのものを関数のインターフェイスに使用したりするのはまずいということになりますね。
デフォルトエンコーディングについてはもし変更できたとしてもJavaのバージョンが上がるたびに仕様が変わりそうで怖くて使えないですね。マルチスレッドにしたときの問題もあるし。 ありがとうございました。 | ||||||||
|
投稿日時: 2004-11-11 11:25
Readerをメソッド引数にするのは問題ないと思います。
プログラム上でくだんのメソッドに引数として渡すReaderオブジェクトを作成する 責任を負っている個所が、正しいエンコードを指定して作成している、という前提 条件にすればよいのですよ。 また、一つのReaderオブジェクトをスレッド間で共有するなどということは、常識 的にやってはいけないことだと思いますよ。 ほかのスレッドでも言っていますが、ストリームI/Oの概念について勉強してみると 良いかと思います。 |