• 締切済み

Writer & PrintWriter

import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(w); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } と import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { //Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(args[0]); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } の結果が同じになるんですけど、 Writer w = new FileWriter(args[0]); PrintWriter pw = new PrintWriter(w); とするのはなぜなんですか? 何か意味はあるんですか?

みんなの回答

  • covachan
  • ベストアンサー率38% (46/120)
回答No.4

前の方が書かれていますがちょっと意味合いが違いそうなので書かせていただきます。 まず、1.4から1.5の違いというのはそんなに大きな意味はもたないと思います。何故ならおそらくですが、単にStringを引数に持つメソッド追加しただけで、メソッド内部ではおそらく同じことを書いているだけで、コードの簡略化を図っただけだと思いますので。 では一番のこの手法のメリットは何でしょうか? PrintWriterはprintlnメソッドにより自動フラッシュを行ってくれることや改行文字を自動的にプラットフォームにあわせてくれるなど、最終的に出力する際に都合のいいような機能を持っています。ですのでPrintWriterにラッピングするのですが、その引数に与えるWriterは様々な種類があります。大きなところで、Stream、Piped、Fileなどです。これらを使用する際にその操作を汎用的に、統一しようというポリシーを持たせているのではないでしょうか?ラッピングしたクラスで操作することでメソッドも操作も統一されます。ラッピングされたオブジェクトを意識する必要がないですよね?今回はFileWriterですが、時にはSocketのStreamをラッピングしたとしても違いをキにせず同様に扱えます。そういったことではないでしょうか?

  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

前の方が書かれていますがちょっと意味合いが違いそうなので書かせていただきます。 まず、1.4から1.5の違いというのはそんなに大きな意味はもたないと思います。 何故ならおそらくですが、単にStringを引数に持つメソッド追加しただけで、 メソッド内部ではおそらく同じことを書いているだけで、コードの簡略化を図っただけだと思いますので。 では一番のこの手法のメリットは何でしょうか? PrintWriterはprintlnメソッドにより自動フラッシュを行ってくれることや、 改行文字を自動的にプラットフォームにあわせてくれるなど、最終的に出力する際に都合のいいような機能を持っています。 ですのでPrintWriterにラッピングするのですが、その引数に与えるWriterは様々な種類があります。 大きなところで、Stream、Piped、Fileなどです。これらを使用する際にその操作を汎用的に、統一しようというポリシーを持たせているのではないでしょうか? ラッピングしたクラスで操作することでメソッドも操作も統一されます。 ラッピングされたオブジェクトを意識する必要がないですよね? 今回はFileWriterですが、時にはSocketのStreamをラッピングしたとしても違いをキにせず同様に扱えます。 そういったことではないでしょうか?

回答No.2

PrintWriter(String)は、Java1.5から導入された形式ですね。 使用されている参考書は1.4以前当時に作成されてのでしょう。 Java-特に標準APIでは、1つのクラスでは単一の機能で扱いましょうという原則があります。ファイルに文字を出力するならFileWriter、バッファリング機能付きで文字を出力するならBufferedWriter、エラー処理を省く簡易な文字列出力機能を求めるならPrintWriter、と言った具合です。 複数の機能を兼ねたいのであれば、それを順次ラッピングすることになります。 ファイルに出力し、かつ、簡易な文字列を出力するなら、疑問に思われた書き方:   Writer w = new FileWriter(args[0]);   PrintWriter pw = new PrintWriter(w); に、なります。 ところが、おそらく要望が多く、1.5からはファイル名でPrintWriterを作成できるようにしたと思われます。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/PrintWriter.html
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.1

J2SE 5.0 をお使いのようですね。 J2SE 5.0では PrintWriter pw=new PrintWriter(args[0]); と書けるのですが、 前バージョンのJ2SE 1.4では Writer w = new FileWriter(args[0]); PrintWriter pw = new PrintWriter(w); と2段階で書かなければなりません。 今のところ、5.0よりも1.4が主流ですから、例題も1.4に対応させてあるのだと思います。