JavaのPrintstream紹介_動力ノードJava学院の整理
23730 ワード
PrintStream紹介
PrintStreamは、FilterOutputStreamに引き継がれるプリント出力ストリームである。
PrintStreamは、他の出力ストリームをデコレーションするために用いられる。他の出力ストリームに様々なデータ値表示形式を容易に印刷する機能を追加することができる。
他の出力ストリームと違って、PrintStreamは永遠にIOExceptionを投げ出さない。これによって生成されたIOExceptionは自身の関数によってキャプチャされ、エラーフラグを設定します。ユーザーはcheckErr()を通じてエラーマークを返すことができます。PrintStream内部でIOExceptionが発生しているかどうかを確認します。
また、PrintStreamは自動flashと文字セット設定機能を提供しています。自動flashとは、PrintStreamに書き込まれたデータがすぐにflash関数を呼び出します。
PrintStream関数一覧
例えば、
下記のコードを確認してください。これらの関数についてより明確な認識ができます。
PrintStreamソース分析(jdk 1.7.40ベース)
PrintStreamのソースコードは比較的簡単です。上記の注釈を読んでください。分からないところがあったら、まず後のPrintStreamの使用例を見てください。役割と使い方を確認してからソースを読みます。
PrintStreamとDataOutputStreamは異なる点です。
同じ点:他の出力ストリームを包装するために、FileOutputStreamを継承します。
違い点:
(01)PrintStreamとDataOutputStreamはデータをフォーマットして出力することができます。しかし、「出力文字列」では符号化が異なります。
PrintStreamは出力時にユーザが指定した符号化(PrintStreamを作成するときに指定された)を採用し、指定がない場合はシステムのデフォルトの文字符号化を採用する。DataOutputStreamはUTF-8を採用しています。
(02)それらの書込みデータの場合の異常処理メカニズムは異なります。
DataOutputStreamは、write()を介して「出力ストリーム」にデータを書き込む際に、IOExceptionが発生すると投げます。
PrintStreamは、write()を介して「出力ストリーム」にデータを書き込む際に、IOExceptionが発生すると、write()にキャプチャ処理が行われます。trueマークを設定します。ユーザは、chockError()を介してtrouble値を返し、出力ストリームに異常が発生しているかどうかを確認することができる。
(03)構造関数が異なる
DataOutputStreamのコンストラクタは一つだけです。Data Output Stream(Output Stream out)。つまり、「DataOutput Streamの出力ストリーム」として出力ストリームoutのみをサポートします。
PrintStreamの構造関数は多くあります。Data OutputStreamと同じように、出力ストリームoutを「PrintStream出力ストリーム」の構造関数としてサポートします。「Fileオブジェクト」または「Stringタイプのファイル名オブジェクト」としてのコンストラクションもサポートします。
また、PrintStreamのコンストラクタでは、「文字セットを指定する」と「自動flash()操作をサポートするかどうか」ができます。
(04)目的が異なる
DataOutputStreamは他の出力ストリームを装飾する役割を果たしています。それはData InputStreamと協力して使用します。アプリケーションはマシンと無関係に一階の入力ストリームからjavaデータタイプを読み書きできます。
PrintStreamの役割は、他の出力ストリームを装飾することでもあるが、マシンとは無関係に、一階からjavaデータタイプを読むことが目的ではない。他の出力ストリームのために様々なデータ値を印刷する形式を提供し、他の出力ストリームをprint()、print()、print()、またはprintf()などを介して様々なフォーマットのデータを出力することができるようにする。
サンプルコード
PrintStreamにおけるAPIの詳細な使い方については、例示コード(PrintStream Test.java)を参照する。
file.txtの内容は以下の通りです。
abcde
other.txtの内容は以下の通りです。
PrintStreamは、FilterOutputStreamに引き継がれるプリント出力ストリームである。
PrintStreamは、他の出力ストリームをデコレーションするために用いられる。他の出力ストリームに様々なデータ値表示形式を容易に印刷する機能を追加することができる。
他の出力ストリームと違って、PrintStreamは永遠にIOExceptionを投げ出さない。これによって生成されたIOExceptionは自身の関数によってキャプチャされ、エラーフラグを設定します。ユーザーはcheckErr()を通じてエラーマークを返すことができます。PrintStream内部でIOExceptionが発生しているかどうかを確認します。
また、PrintStreamは自動flashと文字セット設定機能を提供しています。自動flashとは、PrintStreamに書き込まれたデータがすぐにflash関数を呼び出します。
PrintStream関数一覧
/*
*
*/
// “ out” PrintStream , flush,
// “ flush”, print(), println(), write() , flush() ;
// “ flush”, flush() 。
PrintStream(OutputStream out)
// “ out” PrintStream , flush, 。
PrintStream(OutputStream out, boolean autoFlush)
// “ out” PrintStream , flush, charsetName 。
PrintStream(OutputStream out, boolean autoFlush, String charsetName)
// file FileOutputStream, FileOutputStream PrintStream , flush, 。
PrintStream(File file)
// file FileOutputStream, FileOutputStream PrintStream , flush, charsetName 。
PrintStream(File file, String charsetName)
// fileName FileOutputStream, FileOutputStream PrintStream , flush, 。
PrintStream(String fileName)
// fileName FileOutputStream, FileOutputStream PrintStream , flush, charsetName 。
PrintStream(String fileName, String charsetName)
// “ c” “PrintStream ”
PrintStream append(char c)
// “ start( ) end( ) ” “PrintStream ”
PrintStream append(CharSequence charSequence, int start, int end)
// “ ” “PrintStream ”
PrintStream append(CharSequence charSequence)
// flush“PrintStream ”,
boolean checkError()
// “PrintStream ”
synchronized void close()
// flush“PrintStream ”。
// ,PrintStream FileOutputStream, flush
synchronized void flush()
// “Locale ( )”
PrintStream format(Locale l, String format, Object... args)
// “ Locale ( )”
PrintStream format(String format, Object... args)
// “float f ” “PrintStream ” ,print write
void print(float f)
// “double d ” “PrintStream ” ,print write
void print(double d)
// “ str” “PrintStream ” ,print write
synchronized void print(String str)
// “ o ” “PrintStream ” ,print write
void print(Object o)
// “ c ” “PrintStream ” ,print write
void print(char c)
// “ chars ” “PrintStream ” ,print write
void print(char[] chars)
// “long l ” “PrintStream ” ,print write
void print(long l)
// “int i ” “PrintStream ” ,print write
void print(int i)
// “boolean b ” “PrintStream ” ,print write
void print(boolean b)
// “ args” “Locale ( )” format , “PrintStream ”
PrintStream printf(Locale l, String format, Object... args)
// “ args” “ Locale ( )” format , “PrintStream ”
PrintStream printf(String format, Object... args)
// “ ” “PrintStream ” ,println write
void println()
// “float + ” “PrintStream ” ,println write
void println(float f)
// “int + ” “PrintStream ” ,println write
void println(int i)
// “long + ” “PrintStream ” ,println write
void println(long l)
// “ o + ” “PrintStream ” ,println write
void println(Object o)
// “ chars + ” “PrintStream ” ,println write
void println(char[] chars)
// “ str+ ” “PrintStream ” ,println write
synchronized void println(String str)
// “ c + ” “PrintStream ” ,println write
void println(char c)
// “double + ” “PrintStream ” ,println write
void println(double d)
// “boolean + ” “PrintStream ” ,println write
void println(boolean b)
// oneByte “PrintStream ” 。oneByte int ,
synchronized void write(int oneByte)
// “buffer offset length ” “PrintStream ” 。
void write(byte[] buffer, int offset, int length)
注意:print()とprintln()は、いずれもパラメータを文字列に変換した後、入力ストリームに書き込みます。例えば、
print(0x61);
に等しい
write(String.valueOf(0x61));
上記のステートメントは、文字列97を出力ストリームに書き込みます。0 x 61に対応する十進数は97です。
write(0x61)
上の文は文字'a'を出力ストリームに書き込みます。0 x 61に対応するASCIIコードのアルファベット'a'ですので。下記のコードを確認してください。これらの関数についてより明確な認識ができます。
PrintStreamソース分析(jdk 1.7.40ベース)
package java.io;
import java.util.Formatter;
import java.util.Locale;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
{
// flush
// “ flush”, print(), println(), write() , flush() ;
// “ flush”, flush() 。
private final boolean autoFlush;
// PrintStream 。 PrintStream , , trouble true
private boolean trouble = false;
//
private Formatter formatter;
// BufferedWriter , “PrintStream ”。
// PrintStream OutputStream , ;
// BufferedWriter , OutputStreamWriter PrintStream BufferedWriter , 。
private BufferedWriter textOut;
private OutputStreamWriter charOut;
private static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
// csn
private static Charset toCharset(String csn)
throws UnsupportedEncodingException
{
requireNonNull(csn, "charsetName");
try {
return Charset.forName(csn);
} catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
// UnsupportedEncodingException should be thrown
throw new UnsupportedEncodingException(csn);
}
}
// “ out” PrintStream ,autoFlush flush , 。
private PrintStream(boolean autoFlush, OutputStream out) {
super(out);
this.autoFlush = autoFlush;
this.charOut = new OutputStreamWriter(this);
this.textOut = new BufferedWriter(charOut);
}
// “ out” PrintStream , flush, charsetName 。
private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
super(out);
this.autoFlush = autoFlush;
this.charOut = new OutputStreamWriter(this, charset);
this.textOut = new BufferedWriter(charOut);
}
// “ out” PrintStream , flush, charsetName 。
private PrintStream(boolean autoFlush, Charset charset, OutputStream out)
throws UnsupportedEncodingException
{
this(autoFlush, out, charset);
}
// “ out” PrintStream , flush,
public PrintStream(OutputStream out) {
this(out, false);
}
// “ out” PrintStream , flush, 。
public PrintStream(OutputStream out, boolean autoFlush) {
this(autoFlush, requireNonNull(out, "Null output stream"));
}
// “ out” PrintStream , flush, charsetName 。
public PrintStream(OutputStream out, boolean autoFlush, String encoding)
throws UnsupportedEncodingException
{
this(autoFlush,
requireNonNull(out, "Null output stream"),
toCharset(encoding));
}
// fileName FileOutputStream, FileOutputStream PrintStream , flush, 。
public PrintStream(String fileName) throws FileNotFoundException {
this(false, new FileOutputStream(fileName));
}
// fileName FileOutputStream, FileOutputStream PrintStream , flush, charsetName 。
public PrintStream(String fileName, String csn)
throws FileNotFoundException, UnsupportedEncodingException
{
// ensure charset is checked before the file is opened
this(false, toCharset(csn), new FileOutputStream(fileName));
}
// file FileOutputStream, FileOutputStream PrintStream , flush, 。
public PrintStream(File file) throws FileNotFoundException {
this(false, new FileOutputStream(file));
}
// file FileOutputStream, FileOutputStream PrintStream , flush, csn 。
public PrintStream(File file, String csn)
throws FileNotFoundException, UnsupportedEncodingException
{
// ensure charset is checked before the file is opened
this(false, toCharset(csn), new FileOutputStream(file));
}
private void ensureOpen() throws IOException {
if (out == null)
throw new IOException("Stream closed");
}
// flush“PrintStream ”。
// ,PrintStream FileOutputStream, flush
public void flush() {
synchronized (this) {
try {
ensureOpen();
out.flush();
}
catch (IOException x) {
trouble = true;
}
}
}
private boolean closing = false; /* To avoid recursive closing */
// PrintStream
public void close() {
synchronized (this) {
if (! closing) {
closing = true;
try {
textOut.close();
out.close();
}
catch (IOException x) {
trouble = true;
}
textOut = null;
charOut = null;
out = null;
}
}
}
// flush“PrintStream ”,
public boolean checkError() {
if (out != null)
flush();
if (out instanceof java.io.PrintStream) {
PrintStream ps = (PrintStream) out;
return ps.checkError();
}
return trouble;
}
protected void setError() {
trouble = true;
}
protected void clearError() {
trouble = false;
}
// b “PrintStream ” 。b int ,
public void write(int b) {
try {
synchronized (this) {
ensureOpen();
out.write(b);
if ((b == '
') && autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
// “buf off length ” “PrintStream ” 。
public void write(byte buf[], int off, int len) {
try {
synchronized (this) {
ensureOpen();
out.write(buf, off, len);
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
// “buf ” “PrintStream ” 。
private void write(char buf[]) {
try {
synchronized (this) {
ensureOpen();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush) {
for (int i = ; i < buf.length; i++)
if (buf[i] == '
')
out.flush();
}
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
// “ s” “PrintStream ” 。
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('
') >= ))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
// “ ” “PrintStream ” 。
private void newLine() {
try {
synchronized (this) {
ensureOpen();
textOut.newLine();
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
// “boolean ” “PrintStream ” ,print write
public void print(boolean b) {
write(b ? "true" : "false");
}
// “ c ” “PrintStream ” ,print write
public void print(char c) {
write(String.valueOf(c));
}
// “int i ” “PrintStream ” ,print write
public void print(int i) {
write(String.valueOf(i));
}
// “long l ” “PrintStream ” ,print write
public void print(long l) {
write(String.valueOf(l));
}
// “float f ” “PrintStream ” ,print write
public void print(float f) {
write(String.valueOf(f));
}
// “double d ” “PrintStream ” ,print write
public void print(double d) {
write(String.valueOf(d));
}
// “ s” “PrintStream ” ,print write
public void print(char s[]) {
write(s);
}
// “ s” “PrintStream ” ,print write
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
// “ obj ” “PrintStream ” ,print write
public void print(Object obj) {
write(String.valueOf(obj));
}
// “ ” “PrintStream ” ,println write
public void println() {
newLine();
}
// “boolean + ” “PrintStream ” ,println write
public void println(boolean x) {
synchronized (this) {
print(x);
newLine();
}
}
// “ x + ” “PrintStream ” ,println write
public void println(char x) {
synchronized (this) {
print(x);
newLine();
}
}
// “int + ” “PrintStream ” ,println write
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
// “long + ” “PrintStream ” ,println write
public void println(long x) {
synchronized (this) {
print(x);
newLine();
}
}
// “float + ” “PrintStream ” ,println write
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}
// “double + ” “PrintStream ” ,println write
public void println(double x) {
synchronized (this) {
print(x);
newLine();
}
}
// “ x+ ” “PrintStream ” ,println write
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
// “ x+ ” “PrintStream ” ,println write
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
// “ o + ” “PrintStream ” ,println write
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
// “ args” “ Locale ( )” format , “PrintStream ”
public PrintStream printf(String format, Object ... args) {
return format(format, args);
}
// “ args” “Locale ( )” format , “PrintStream ”
public PrintStream printf(Locale l, String format, Object ... args) {
return format(l, format, args);
}
// “ Locale ( )”
public PrintStream format(String format, Object ... args) {
try {
synchronized (this) {
ensureOpen();
if ((formatter == null)
|| (formatter.locale() != Locale.getDefault()))
formatter = new Formatter((Appendable) this);
formatter.format(Locale.getDefault(), format, args);
}
} catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
} catch (IOException x) {
trouble = true;
}
return this;
}
// “Locale ( )”
public PrintStream format(Locale l, String format, Object ... args) {
try {
synchronized (this) {
ensureOpen();
if ((formatter == null)
|| (formatter.locale() != l))
formatter = new Formatter(this, l);
formatter.format(l, format, args);
}
} catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
} catch (IOException x) {
trouble = true;
}
return this;
}
// “ ” “PrintStream ”
public PrintStream append(CharSequence csq) {
if (csq == null)
print("null");
else
print(csq.toString());
return this;
}
// “ start( ) end( ) ” “PrintStream ”
public PrintStream append(CharSequence csq, int start, int end) {
CharSequence cs = (csq == null ? "null" : csq);
write(cs.subSequence(start, end).toString());
return this;
}
// “ c” “PrintStream ”
public PrintStream append(char c) {
print(c);
return this;
}
}
説明:PrintStreamのソースコードは比較的簡単です。上記の注釈を読んでください。分からないところがあったら、まず後のPrintStreamの使用例を見てください。役割と使い方を確認してからソースを読みます。
PrintStreamとDataOutputStreamは異なる点です。
同じ点:他の出力ストリームを包装するために、FileOutputStreamを継承します。
違い点:
(01)PrintStreamとDataOutputStreamはデータをフォーマットして出力することができます。しかし、「出力文字列」では符号化が異なります。
PrintStreamは出力時にユーザが指定した符号化(PrintStreamを作成するときに指定された)を採用し、指定がない場合はシステムのデフォルトの文字符号化を採用する。DataOutputStreamはUTF-8を採用しています。
(02)それらの書込みデータの場合の異常処理メカニズムは異なります。
DataOutputStreamは、write()を介して「出力ストリーム」にデータを書き込む際に、IOExceptionが発生すると投げます。
PrintStreamは、write()を介して「出力ストリーム」にデータを書き込む際に、IOExceptionが発生すると、write()にキャプチャ処理が行われます。trueマークを設定します。ユーザは、chockError()を介してtrouble値を返し、出力ストリームに異常が発生しているかどうかを確認することができる。
(03)構造関数が異なる
DataOutputStreamのコンストラクタは一つだけです。Data Output Stream(Output Stream out)。つまり、「DataOutput Streamの出力ストリーム」として出力ストリームoutのみをサポートします。
PrintStreamの構造関数は多くあります。Data OutputStreamと同じように、出力ストリームoutを「PrintStream出力ストリーム」の構造関数としてサポートします。「Fileオブジェクト」または「Stringタイプのファイル名オブジェクト」としてのコンストラクションもサポートします。
また、PrintStreamのコンストラクタでは、「文字セットを指定する」と「自動flash()操作をサポートするかどうか」ができます。
(04)目的が異なる
DataOutputStreamは他の出力ストリームを装飾する役割を果たしています。それはData InputStreamと協力して使用します。アプリケーションはマシンと無関係に一階の入力ストリームからjavaデータタイプを読み書きできます。
PrintStreamの役割は、他の出力ストリームを装飾することでもあるが、マシンとは無関係に、一階からjavaデータタイプを読むことが目的ではない。他の出力ストリームのために様々なデータ値を印刷する形式を提供し、他の出力ストリームをprint()、print()、print()、またはprintf()などを介して様々なフォーマットのデータを出力することができるようにする。
サンプルコード
PrintStreamにおけるAPIの詳細な使い方については、例示コード(PrintStream Test.java)を参照する。
import java.io.PrintStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* PrintStream
*
*
*/
public class PrintStreamTest {
public static void main(String[] args) {
// 3 : “abcde” “file.txt” 。
// !
testPrintStreamConstrutor() ;
//testPrintStreamConstrutor2() ;
//testPrintStreamConstrutor3() ;
// write(), print(), println(), printf() 。
testPrintStreamAPIS() ;
}
/**
* PrintStream(OutputStream out)
*
* , “abcde” “file.txt”
*/
private static void testPrintStreamConstrutor() {
// 0x61 ASCII 'a',0x62 ASCII 'b', ...
final byte[] arr={0x61, 0x62, 0x63, 0x64, 0x65 }; // abced
try {
// “file.txt” File
File file = new File("file.txt");
// FileOutputStream
PrintStream out = new PrintStream(
new FileOutputStream(file));
// “ arr”
out.write(arr);
//
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* PrintStream(File file)
*
* , “abcde” “file.txt”
*/
private static void testPrintStreamConstrutor2() {
final byte[] arr={0x61, 0x62, 0x63, 0x64, 0x65 };
try {
File file = new File("file.txt");
PrintStream out = new PrintStream(file);
out.write(arr);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* PrintStream(String fileName)
*
* , “abcde” “file.txt”
*/
private static void testPrintStreamConstrutor3() {
final byte[] arr={0x61, 0x62, 0x63, 0x64, 0x65 };
try {
PrintStream out = new PrintStream("file.txt");
out.write(arr);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* write(), print(), println(), printf() 。
*/
private static void testPrintStreamAPIS() {
// 0x61 ASCII 'a',0x62 ASCII 'b', ...
final byte[] arr={0x61, 0x62, 0x63, 0x64, 0x65 }; // abced
try {
// FileOutputStream
PrintStream out = new PrintStream("other.txt");
// “hello PrintStream”+ ,
out.println("hello PrintStream");
// x
// x ASCII 'A', 'A'
out.write(0x41);
// "65" 。
// out.print(0x41); out.write(String.valueOf(0x41));
out.print(0x41);
// 'B'
out.append('B');
// "CDE is 5" +
String str = "CDE";
int num = 5;
out.printf("%s is %d
", str, num);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上のコードを実行すると、ソースディレクトリで2つのファイル「file.txt」と「other.txt」が生成されます。file.txtの内容は以下の通りです。
abcde
other.txtの内容は以下の通りです。
hello PrintStream
A65BCDE is 5
以上は小编が绍介したJavaのPrintstream知识です。皆さんのために役に立つことを望んでいます。もし何か疑问があれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。