2017-08-09 17 views
1

私はファイルから一連のパラメータを読み込む必要がある小さなプログラムを作成しています.3つのクラス(3つのクラスすべてを継承同じ親クラス)。各操作の後に方法は、方法の1 出力1方法の1 出力3 1等複数のクラスで同じプリントライターを使用する方法(Java)

方法の2 出力2の方法のこの

出力1と同様に、出力ファイル内の行を印刷するようになっています3つのクラスのすべてのメソッドが同じファイルに出力されるべきであるという考え方は重要ではありません。

ブロック

if/method { 
.... do something 
text ="output of something"; 
    try(PrintWriter out = new PrintWriter("outputfile.txt") ){ 
     out.println(text); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    }//end if/method 

場合、私は/各メソッドの最後にこのコードを使用しているコードは確かしかし、それは常に前の行を上書きし、ファイルに何かを書くありません。したがって、たとえば、12行の「何か」の代わりに、私には1だけしかありません。

どうすればこの問題を解決できますか?私は毎回新しいPrintWriterを作成し、それを別の場所に宣言して各クラスに呼び出すことを考えていたからだと思う。それは働くだろうか?どのように私はそれを各クラスに呼び出すことになるでしょうか?

これは私の初めてのファイル操作です。ありがとうございました。

+0

はい、問題はあなたがすべての3つのクラスに新しいPrintWriterを作成することです。これを行う代わりに、パラメータとして渡す必要があります。たとえば、PrintWriterをパラメータとして受け入れるように処理メソッドをコーディングしてから、メインメソッドで単一のPrintWriterインスタンスを作成し、tryメソッドブロック内に3つのメソッド呼び出しを配置し​​ます。 –

+0

@BalázsNemesの場合、書き込み操作が同時ではなく、時間外に切り離された場合(つまり、各クラスは他の3つのクラスが何を行っているかにかかわらず書き込み可能です)、各クラスごとに独自のプリントライターを作成することは実際にはうまくいきます。 –

+0

@ M.Prokhorovさて、どうすれば上書きを避けることができますか? –

答えて

1

PrintWriterを作成するために使用しているコンストラクタは、FileOutputStreamの新しいインスタンスを内部的に使用します。あなたは、あなたのライターはデフォルトを使用します使用することを何モードを指定していなかったので

  • 上書き(デフォルト)
  • 追加

FileOutputStreamは、2つの一般的な書き込みモデルを持っています。どのモードを使用するかを指定するには、正しいモードでFileOutputStreamを作成する必要があります。たとえば、次のように:

try(PrintWriter out = new PrintWriter(new FileOutputStream("outputfile.txt", true))) { 
// note the boolean parameter in FileOS constructor above. Its "true" value means "Append" 
    out.println(text); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

同様PrintWriter、独自に作成し、各クラスについて語ったことに何かがあります:

  • それが何であれ、あなたのロジックに
  • それ(おそらく不必要)ネクタイを複製しますクラスは出力をファイルに具体的に操作します(代わりにhttpで書きたい場合はどうすればいいですか?)
  • ファイルを開く操作は通常安価ではないので、パフォーマンスは低下します

私の代わりに、独自の出力機能を作成し、各クラスの、それは代わりに外部から1を受けるべきであることを示唆している:

class MyClass { 
    public void outputTo(PrintWriter w) { 
    String text = ... 
    w.println(text); 
    } 
} 

and you use it like this: 

try (FileOutputStream fos = new FileOutputStream("filename", append); 
    PrintWriter w = new PrintWriter(fos)) { 
    new MyClass().outputTo(w); // first instance 
    new MyClass().outputTo(w); // second instance 
    //... etc. 
} 
+0

ありがとうございました。これは本当に助けになった! :) –

0

PrintWriterを親クラスの静的変数として宣言し、必要に応じてサブクラスで使用してください。

+0

なので、public static PrintWriter out? –

+1

@DanielBoksan、それは実際には本当に悪い考えです。なぜなら、クラスの誰もがいつライターを閉じるのか分からないからです。 –

関連する問題