Writer
日本語 | 書記 |
英語 | writer |
ふりがな | らいたー |
フリガナ | ライター |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.Writer。
ストリームクラス。全ての文字出力ストリームクラスのスーパークラスである。
文字出力ストリームクラスの中では「出力先」に位置する。
対になる入力側のクラスはReaderクラスである。
全ての文字出力ストリームクラスのスーパークラス。
言い換えると、Writerクラスのサブクラスは文字出力ストリームクラスである、ということになる。
そういったスーパークラスとしての役目だけ持つため、このクラスを直接使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
そもそも抽象クラスであるため、インスタンスを作成することはできない。
基本的には、「出力先」となるクラスはこのWriterクラスのサブクラスとし、「中継ぎ」となるクラスはFilterWriterクラスのサブクラスとする。
Writerクラスのサブクラスを作成する場合、まず「本当の出力先」を用意する。「本当の出力先」は「文字の並び」を格納できるものとする。たとえばStringBufferクラスやchar型配列が該当する。また、byte型配列への変換処理を行えばバイト出力ストリームを指定することもできる。
この「一列に並べられた文字データ」を「本当の出力先」とする。
他の文字出力ストリームクラスを「出力先」としてもいいが、それであればWriterクラスではなくFilterWriterクラスのサブクラスとした方がいいだろう。
Writerクラスは抽象クラスであり、write()メソッドが抽象メソッドであるため、サブクラスは必ずwrite()メソッドをオーバーライドする必要がある。
オーバーライドするwrite()メソッドは引数が「( char[], int, int )」のものである。write()メソッドはオーバーロードされているが、他のオーバーロードされたメソッドは抽象メソッドではないのでオーバーライドする必要はない。また、他のオーバーロードされたメソッドをオーバーライドしなければ、「write( char[], int, int )」メソッドを呼び出してくれるため、このメソッドにのみ処理すればよい。
オーバーライドしたwrite()メソッドでは、「本当の出力先」に出力する処理を実装する。そうすることで、渡された文字を出力することができる。
write()メソッドの他に、flush()メソッドとclose()メソッドをオーバーライドする必要がある。この2つのメソッドも抽象メソッドのためである。
flush()メソッドは「フラッシュ」処理を行うよう実装する。
close()メソッドは「本当の出力先」を閉じる処理を行うよう実装する。特に、出力先がファイルやソケットといった、最後に「閉じる」処理が必要な「本当の出力先」の場合には必ずclose()メソッドをオーバーライドし、使用時にはfinallyで呼び出すようにする。
ストリームクラス。全ての文字出力ストリームクラスのスーパークラスである。
文字出力ストリームクラスの中では「出力先」に位置する。
対になる入力側のクラスはReaderクラスである。
全ての文字出力ストリームクラスのスーパークラス。
言い換えると、Writerクラスのサブクラスは文字出力ストリームクラスである、ということになる。
そういったスーパークラスとしての役目だけ持つため、このクラスを直接使用することはない。このクラスのサブクラスを使用するか、もしくはサブクラスを作成して使用する。
そもそも抽象クラスであるため、インスタンスを作成することはできない。
基本的には、「出力先」となるクラスはこのWriterクラスのサブクラスとし、「中継ぎ」となるクラスはFilterWriterクラスのサブクラスとする。
Writerクラスのサブクラスを作成する場合、まず「本当の出力先」を用意する。「本当の出力先」は「文字の並び」を格納できるものとする。たとえばStringBufferクラスやchar型配列が該当する。また、byte型配列への変換処理を行えばバイト出力ストリームを指定することもできる。
この「一列に並べられた文字データ」を「本当の出力先」とする。
他の文字出力ストリームクラスを「出力先」としてもいいが、それであればWriterクラスではなくFilterWriterクラスのサブクラスとした方がいいだろう。
Writerクラスは抽象クラスであり、write()メソッドが抽象メソッドであるため、サブクラスは必ずwrite()メソッドをオーバーライドする必要がある。
オーバーライドするwrite()メソッドは引数が「( char[], int, int )」のものである。write()メソッドはオーバーロードされているが、他のオーバーロードされたメソッドは抽象メソッドではないのでオーバーライドする必要はない。また、他のオーバーロードされたメソッドをオーバーライドしなければ、「write( char[], int, int )」メソッドを呼び出してくれるため、このメソッドにのみ処理すればよい。
オーバーライドしたwrite()メソッドでは、「本当の出力先」に出力する処理を実装する。そうすることで、渡された文字を出力することができる。
write()メソッドの他に、flush()メソッドとclose()メソッドをオーバーライドする必要がある。この2つのメソッドも抽象メソッドのためである。
flush()メソッドは「フラッシュ」処理を行うよう実装する。
close()メソッドは「本当の出力先」を閉じる処理を行うよう実装する。特に、出力先がファイルやソケットといった、最後に「閉じる」処理が必要な「本当の出力先」の場合には必ずclose()メソッドをオーバーライドし、使用時にはfinallyで呼び出すようにする。
参考サイト
// Sample.java
import java.io.Writer;
import java.io.PrintWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
NormalWriter normalWriter = null;
PrintWriter printWriter = null;
try
{
// 「出力先」のNormalWriterクラスを用意します。
normalWriter = new NormalWriter();
// このクラスを対象とするPrintWriterクラスを用意します。
printWriter = new PrintWriter( normalWriter );
// つまり、
// PrintWriter
// ↓
// NormalWriter
// という形で、文字出力ストリームクラスが連結したことになります。
// 出力します。
printWriter.write( 'あ' );
printWriter.write( 'い' );
printWriter.write( 'う' );
printWriter.write( "えお" );
// NormalWriter#write( char[], int, int ) : あ
// NormalWriter#write( char[], int, int ) : い
// NormalWriter#write( char[], int, int ) : う
// NormalWriter#write( char[], int, int ) : えお
// このように、printWriterのwrite()メソッドを呼ぶと、
// normalWriterのwrite()メソッドを呼び出します。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printWriter != null )
{
printWriter.close();
// NormalWriter#close()
// この結果から分かるとおり、printWriterのclose()メソッドを
// 呼ぶと、「出力先」のnormalWriterのclose()メソッドも呼び
// 出されるので、本当は下のclose()メソッドを呼ぶ必要は
// ありません。でも必ずしも呼ばれるとは限らない
// (Javadocの仕様に書かれていないので)呼んでおきましょう。
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalWriter != null )
{
normalWriter.close();
// NormalWriter#close()
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
}
}
}
/**
* NormalWriterクラス。
* Writerクラスのサブクラスです。
*/
class NormalWriter extends Writer
{
/**
* write()メソッド。
* このクラスを利用する文字出力ストリームクラスの
* write()メソッドから呼び出されます。
* これをオーバーライドしておけば、他のオーバーロードされた
* write()メソッドが呼ばれても、最終的にこのメソッドが呼ばれるので
* 適切に処理できます。
*/
public void write( char[] cbuf, int off, int len) throws IOException
{
System.out.println( "NormalWriter#write( char[], int, int ) : " + new String( cbuf, off, len ) );
}
/**
* flush()メソッド。
* ストリームをフラッシュするために呼び出されます。
*/
public void flush() throws IOException
{
System.out.println( "NormalWriter#flush()" );
}
/**
* close()メソッド。
* ストリームを閉じるために呼び出されます。
*/
public void close() throws IOException
{
System.out.println( "NormalWriter#close()" );
}
}
import java.io.Writer;
import java.io.PrintWriter;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
NormalWriter normalWriter = null;
PrintWriter printWriter = null;
try
{
// 「出力先」のNormalWriterクラスを用意します。
normalWriter = new NormalWriter();
// このクラスを対象とするPrintWriterクラスを用意します。
printWriter = new PrintWriter( normalWriter );
// つまり、
// PrintWriter
// ↓
// NormalWriter
// という形で、文字出力ストリームクラスが連結したことになります。
// 出力します。
printWriter.write( 'あ' );
printWriter.write( 'い' );
printWriter.write( 'う' );
printWriter.write( "えお" );
// NormalWriter#write( char[], int, int ) : あ
// NormalWriter#write( char[], int, int ) : い
// NormalWriter#write( char[], int, int ) : う
// NormalWriter#write( char[], int, int ) : えお
// このように、printWriterのwrite()メソッドを呼ぶと、
// normalWriterのwrite()メソッドを呼び出します。
}
finally
{
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
if( printWriter != null )
{
printWriter.close();
// NormalWriter#close()
// この結果から分かるとおり、printWriterのclose()メソッドを
// 呼ぶと、「出力先」のnormalWriterのclose()メソッドも呼び
// 出されるので、本当は下のclose()メソッドを呼ぶ必要は
// ありません。でも必ずしも呼ばれるとは限らない
// (Javadocの仕様に書かれていないので)呼んでおきましょう。
}
// 処理が終わったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( normalWriter != null )
{
normalWriter.close();
// NormalWriter#close()
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
}
}
}
/**
* NormalWriterクラス。
* Writerクラスのサブクラスです。
*/
class NormalWriter extends Writer
{
/**
* write()メソッド。
* このクラスを利用する文字出力ストリームクラスの
* write()メソッドから呼び出されます。
* これをオーバーライドしておけば、他のオーバーロードされた
* write()メソッドが呼ばれても、最終的にこのメソッドが呼ばれるので
* 適切に処理できます。
*/
public void write( char[] cbuf, int off, int len) throws IOException
{
System.out.println( "NormalWriter#write( char[], int, int ) : " + new String( cbuf, off, len ) );
}
/**
* flush()メソッド。
* ストリームをフラッシュするために呼び出されます。
*/
public void flush() throws IOException
{
System.out.println( "NormalWriter#flush()" );
}
/**
* close()メソッド。
* ストリームを閉じるために呼び出されます。
*/
public void close() throws IOException
{
System.out.println( "NormalWriter#close()" );
}
}
// Sample.java import java.io.Writer; import java.io.PrintWriter; import java.io.IOException; public class Sample { public static void main( String[] args ) { NormalWriter normalWriter = null; PrintWriter printWriter = null; try { // 「出力先」のNormalWriterクラスを用意します。 normalWriter = new NormalWriter(); // このクラスを対象とするPrintWriterクラスを用意します。 printWriter = new PrintWriter( normalWriter ); // つまり、 // PrintWriter // ↓ // NormalWriter // という形で、文字出力ストリームクラスが連結したことになります。 // 出力します。 printWriter.write( 'あ' ); printWriter.write( 'い' ); printWriter.write( 'う' ); printWriter.write( "えお" ); // NormalWriter#write( char[], int, int ) : あ // NormalWriter#write( char[], int, int ) : い // NormalWriter#write( char[], int, int ) : う // NormalWriter#write( char[], int, int ) : えお // このように、printWriterのwrite()メソッドを呼ぶと、 // normalWriterのwrite()メソッドを呼び出します。 } finally { // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 if( printWriter != null ) { printWriter.close(); // NormalWriter#close() // この結果から分かるとおり、printWriterのclose()メソッドを // 呼ぶと、「出力先」のnormalWriterのclose()メソッドも呼び // 出されるので、本当は下のclose()メソッドを呼ぶ必要は // ありません。でも必ずしも呼ばれるとは限らない // (Javadocの仕様に書かれていないので)呼んでおきましょう。 } // 処理が終わったら、最後にclose()メソッドを呼んで // 後処理をします。また、これは必ず行うため、 // finally内で行います。 try { if( normalWriter != null ) { normalWriter.close(); // NormalWriter#close() } } catch( IOException e ) { // close()メソッドはIOExceptionがthrows指定されているので // 一応受け取ります。 e.printStackTrace(); } } } } /** * NormalWriterクラス。 * Writerクラスのサブクラスです。 */ class NormalWriter extends Writer { /** * write()メソッド。 * このクラスを利用する文字出力ストリームクラスの * write()メソッドから呼び出されます。 * これをオーバーライドしておけば、他のオーバーロードされた * write()メソッドが呼ばれても、最終的にこのメソッドが呼ばれるので * 適切に処理できます。 */ public void write( char[] cbuf, int off, int len) throws IOException { System.out.println( "NormalWriter#write( char[], int, int ) : " + new String( cbuf, off, len ) ); } /** * flush()メソッド。 * ストリームをフラッシュするために呼び出されます。 */ public void flush() throws IOException { System.out.println( "NormalWriter#flush()" ); } /** * close()メソッド。 * ストリームを閉じるために呼び出されます。 */ public void close() throws IOException { System.out.println( "NormalWriter#close()" ); } }
「みだし」に含まれているページ
「解説」に含まれているページ
- BufferedReader
- BufferedWriter
- CharArrayReader
- CharArrayWriter
- FileOutputStream
- FileReader
- FileWriter
- FilterReader
- FilterWriter
- HttpServletResponse
- InputStreamReader
- JspWriter
- JSP暗黙オブジェクト「out」
- JSP暗黙オブジェクト「response」
- OutputStreamWriter
- PipedReader
- PipedWriter
- printStackTrace
- PrintWriter
- Reader
- Rss4j
- StringReader
- StringWriter
- Writer
- ストリーム
- テキストファイル
- フラッシュ
- 改行文字
- 文字ストリーム
- 文字入力ストリーム
- 文字出力ストリーム
「サンプルプログラムとか」に含まれているページ
- 127.0.0.1
- <%! %>
- BufferedWriter
- CharArrayWriter
- classesディレクトリ
- Cookie
- doGet
- DOM
- doPost
- FileWriter
- FilterWriter
- GET
- HEAD
- HTTP
- HttpServlet
- HttpServletResponse
- HttpSession
- JspWriter
- JSP宣言
- JSP暗黙オブジェクト「pageContext」
- JSP暗黙オブジェクト「response」
- localhost
- Node
- OutputStreamWriter
- PageContext
- PipedReader
- PipedWriter
- POST
- printStackTrace
- PrintWriter
- RSS
- Rss4j
- ServletConfig
- StringWriter
- TCP
- web.xml
- Writer
- Xerces
- XML
- カスタムタグライブラリ
- キャッシュ
- クッキー
- クライアント
- クライアントサーバーシステム
- クロスサイトスクリプティング
- サニタイジング
- サーバー
- サーブレット
- ステートレス
- セッション
- セッションID
- ソケット
- テキストファイル
- バイナリーファイル
- フラッシュ
- リクエスト
- リクエストパラメーター
- リクエストヘッダー
- レスポンス
- レスポンスヘッダー
- 入力フォーム
- 改行文字
- 文字出力ストリーム