openplanning

Hướng dẫn và ví dụ Java PrintStream

  1. PrintStream
  2. PrintStream Constructors
  3. PrintStream Methods
  4. Examples
  5. checkError()
  6. print(..) *
  7. print(Object)
  8. println()
  9. println(..) *
  10. println(Object)
  11. printf(..) *
  12. format(..) *
  13. append(..) *

1. PrintStream

PrintStream là một lớp con của FilterOutputStream, nó được sử dụng để in các dữ liệu vào một OutputStream mà nó quản lý, nó cũng được coi như một công cụ để bổ xung thêm các chức năng (functionality) cho OutputStream này.
Các đặc điểm của PrintStream:
Tất cả các phương thức của PrintStream không ném ra các ngoại lệ I/O, để kiểm tra ngoại lệ có xẩy ra hay không bạn có thể gọi phương thức checkError().
Theo tuỳ chọn, PrintStream có khả năng tự động xả (flush), nghĩa là phương thức flush() sẽ được gọi ngay sau khi gọi phương thức println(..) hoặc khi in một văn bản bao gồm ký tự '\n'.
Tất cả các ký tự được in bởi PrintStream đều được chuyển đổi thành các bytes bằng cách sử dụng encoding hoặc charset đã cho hoặc mặc định bởi hệ thống nếu không được chỉ định. Lớp PrintWriter nên được sử dụng trong các trường hợp yêu cầu viết các ký tự thay vì byte.
System.out
System.out là một đối tượng kiểu PrintStream rất thông dụng và quen thuộc, nó được sử dụng để in dữ liệu ra màn hình Console, nó giúp bạn nhớ lại đoạn code kinh điển mà bạn đã viết khi bắt đầu học Java:
System.out.println("Hello World!");
Xem thêm:
PrintWriter là một lớp tương tự với PrintStream, nó được sử dụng để in các dữ liệu vào một Writer hoặc OutputStream nội bộ mà nó quản lý.

2. PrintStream Constructors

Các constructor để tạo ra đối tượng PrintStream không có chế độ xả (flush) tự động:
public PrintStream(OutputStream out)

public PrintStream(File file) throws FileNotFoundException
public PrintStream(File file, Charset charset) throws IOException
public PrintStream(File file, String csn)
                      throws FileNotFoundException, UnsupportedEncodingException

public PrintStream(String fileName) throws FileNotFoundException  
public PrintStream(String fileName, Charset charset) throws IOException
public PrintStream(String fileName, String csn)
                      throws FileNotFoundException, UnsupportedEncodingException
Các constructor để tạo ra đối tượng PrintStream với tuỳ chọn chế độ xả (flush) tự động:
public PrintStream(OutputStream out, boolean autoFlush)
public PrintStream(OutputStream out, boolean autoFlush, Charset charset)
public PrintStream(OutputStream out, boolean autoFlush, String encoding)
                                             throws UnsupportedEncodingException
Các constructor tạo ra PrintStream để ghi dữ liệu vào một OutputStream:
public PrintStream(OutputStream out)
public PrintStream(OutputStream out, boolean autoFlush)  
public PrintStream(OutputStream out, boolean autoFlush, String encoding)
                                                                    throws UnsupportedEncodingException  
public PrintStream(OutputStream out, boolean autoFlush, Charset charset)
Các constructor tạo ra PrintStream để ghi dữ liệu vào một file:
public PrintStream(File file)
public PrintStream(File file, Charset charset) throws IOException
public PrintStream(File file, String csn)
                            throws FileNotFoundException, UnsupportedEncodingException

public PrintStream(String fileName) throws FileNotFoundException  
public PrintStream(String fileName, Charset charset) throws IOException  
public PrintStream(String fileName, String csn)
                            throws FileNotFoundException, UnsupportedEncodingException

3. PrintStream Methods

Các phương thức của PrintStream:
public boolean checkError()  
protected void setError()  
protected void clearError()  

public void print(boolean b)  
public void print(char c)  
public void print(int i)  
public void print(long l)  
public void print(float f)  
public void print(double d)
public void print(char[] s)  
public void print(String s)  

public void print(Object obj)  

public void println()  
public void println(boolean x)  
public void println(char x)  
public void println(int x)  
public void println(long x)
public void println(float x)  
public void println(double x)
public void println(char[] x)  
public void println(String x)  

public void println(Object x)  

public PrintStream printf(String format, Object... args)  
public PrintStream printf(Locale l, String format, Object... args)

public PrintStream format(String format, Object... args)  
public PrintStream format(Locale l, String format, Object... args)  

public PrintStream append(CharSequence csq)  
public PrintStream append(CharSequence csq, int start, int end)  
public PrintStream append(char c)
Các phương thức khác, ghi đè (override) các phương thức của lớp cha và không ném ra ngoại lệ:
public void write(int b)  
public void write(byte[] b)  
public void write(byte[] b, int off, int len)  

public void flush()  
public void close()

4. Examples

Lấy nội dung dò lỗi (stack trace) từ một Exception.
GetStackTraceEx.java
package org.o7planning.printstream.ex;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;

public class GetStackTraceEx {

    public static void main(String[] args) {
        try {
            int a = 100 / 0; // Exception occur here
        } catch (Exception e) {
            String s = getStackTrace(e);
            System.err.println(s);
        }
    }

    public static String getStackTrace(Throwable t) {
        OutputStream baos = new ByteArrayOutputStream();

        // Create PrintStream via PrintStream(OutputStream) constructor.
        PrintStream pw = new PrintStream(baos);

        // Call method: Throwable.printStackTrace(PrintStream)
        t.printStackTrace(pw);
        pw.close();

        String s = baos.toString();
        return s;
    }
}
Output:
java.lang.ArithmeticException: / by zero
    at org.o7planning.printstream.ex.GetStackTraceEx.main(GetStackTraceEx.java:11)

5. checkError()

Phương thức checkError() trả về trạng thái lỗi của PrintStream này, ngoài ra phương thức flush() cũng được gọi nếu PrintStream này chưa bị đóng.
public boolean checkError()
Chú ý: Tất cả các phương thức của PrintStream không ném ra IOException, nhưng một khi IOException xẩy ra trong nội bộ các phương thức thì trạng thái của nó là lỗi.
Trạng thái lỗi của PrintStream này chỉ bị xoá bỏ nếu gọi phương thức clearError() nhưng đây là một phương thức protected. Bạn có thể viết một lớp mở rộng từ PrintStream và ghi đè (override) phương thức này nếu muốn sử dụng nó (Xem ví dụ bên dưới).
MyPrintStream.java
package org.o7planning.printstream.ex;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class MyPrintStream extends PrintStream {

    public MyPrintStream(File file) throws FileNotFoundException {
        super(file);
    }
    
    @Override
    public void clearError()  {
        super.clearError();    // Call protected method.
    }
}
Ví dụ: Sử dụng phương thức checkError() để kiểm tra trạng thái lỗi của PrintStream:
PrintStream_checkError_ex1.java
package org.o7planning.printstream.ex;

import java.io.File;

public class PrintStream_checkError_ex1 {

    // Windows: C:/SomeFolder/logFile.txt
    private static final String logFilePath = "/Volumes/Data/test/logFile.txt";

    public static void main(String[] args) throws Exception {
        File logFile = new File(logFilePath);

        MyPrintStream mps = new MyPrintStream(logFile);
        int errorCount = 0;
        while (true) {
            // Write log..
            mps.println("Some Log..");
            Thread.sleep(1000);

            // Check if IOException happened.
            if (mps.checkError()) {
                errorCount++;
                mps.clearError();
                if (errorCount > 10) {
                    sendAlertEmail();
                    break;
                }
            }
        }
        mps.close();
    }

    private static void sendAlertEmail() {
        System.out.println("There is a problem in the Log system.");
    }
}

6. print(..) *

Phương thức print(..) được sử dụng để in một giá trị nguyên thuỷ.
public void print(boolean b)  
public void print(char c)  
public void print(int i)  
public void print(long l)  
public void print(float f)  
public void print(double d)
public void print(char[] s)  
public void print(String s)
Ví dụ:
PrintStream_print_primitive_ex1.java
// System.out is an instance of PrintStream.
PrintStream ps = System.out;

ps.print(true);
ps.println();
ps.print(new char[] { 'a', 'b', 'c' });
ps.println();
ps.print("Text");
Output:
true
abc
Text

7. print(Object)

Chuyển một đối tượng thành một String bằng phương thức String.valueOf(Object), và in ra kết quả.
public void print(Object obj) {
   this.write(String.valueOf(obj));
}
Ví dụ:
PrintStream_print_object_ex1.java
// System.out is an instance of PrintStream.
PrintStream ps = System.out;

Object obj1 = null;
ps.print(obj1);
ps.println();

Object obj2 = new Socket();
ps.print(obj2);
ps.println();

Object obj3 = Arrays.asList("One", "Two", "Three");
ps.print(obj3);
Output:
null
Socket[unconnected]
[One, Two, Three]

8. println()

In ra ký tự xuống dòng. Phương thức flush() cũng được gọi nếu PrintStream này có chế độ tự động xả (auto flush).
public void println() {
    print('\n');
    if(autoFlush) this.flush();
}

9. println(..) *

Phương thức println(..) được sử dụng để in một giá trị nguyên thuỷ và một ký tự xuống dòng, phương thức flush() cũng được gọi nếu PrintStream này có chế độ tự động xả (auto flush).
public void println(boolean x)  
public void println(char x)  
public void println(int x)  
public void println(long x)
public void println(float x)  
public void println(double x)
public void println(char[] x)  
public void println(String x)
Ví dụ:
PrintStream_println_primitive_ex1.java
// System.out is an instance of PrintStream.
PrintStream ps = System.out;

ps.println(true);

ps.println(new char[] { 'a', 'b', 'c' });

ps.println("Text");
Output:
true
abc
Text

10. println(Object)

Chuyển một đối tượng thành một String bằng phương thức String.valueOf(Object) sau đó in ra kết quả và in ra ký tự xuống dòng. Phương thức flush() cũng được gọi nếu PrintStream này có chế độ tự động xả (auto flush). Phương thức này hoạt động giống như việc gọi phương thức print(Object) và sau đó là println().
public void println(Object x) {
       this.write(String.valueOf(x));
       this.write("\n");
       if(this.autoFlush) this.flush();
}
Ví dụ:
PrintStream_println_object_ex1.java
// System.out is an instance of PrintStream.
PrintStream ps = System.out;

Object obj1 = null;
ps.println(obj1);

Object obj2 = new Socket();
ps.println(obj2);

Object obj3 = Arrays.asList("One", "Two", "Three");
ps.println(obj3);
Output:
null
Socket[unconnected]
[One, Two, Three]

11. printf(..) *

Một phương pháp tiện lợi để ghi một chuỗi được định dạng vào PrintStream này bằng cách sử dụng chuỗi định dạng và các đối số được chỉ định.
public PrintStream printf(String format, Object... args)  
public PrintStream printf(Locale locale, String format, Object... args)
Phương thức này hoạt động tương tự như đoạn code dưới đây:
String result = String.format(format, args);
printStream.print(result);

// Or:
String result = String.format(locale, format, args);
printStream.print(result);
Xem thêm:

12. format(..) *

Phương thức này hoạt động giống phương thức printf(..).
public PrintStream format(String format, Object... args)  
public PrintStream format(Locale locale, String format, Object... args)
Nó hoạt động giống như đoạn code dưới đây:
String result = String.format(format, args);
printStream.print(result);

// Or:
String result = String.format(locale, format, args);
printStream.print(result);
Xem thêm:

13. append(..) *

Các phương thức append(..) hoạt động giống như các phương thức print(..), điều khác biệt là nó trả về PrintStream này, vì vậy bạn có thể tiếp tục gọi một phương thức tiếp theo thay vì kết thúc bởi dấu chấm phẩy ( ; ).
public PrintStream append(CharSequence csq)  
public PrintStream append(CharSequence csq, int start, int end)  
public PrintStream append(char c)
Ví dụ:
PrintStream_append_ex1.java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);

ps.append("This").append(" is").append(' ').append('a').append(" Text");
ps.flush();

String text = baos.toString();
System.out.println(text);// This is a Text

Các hướng dẫn Java IO

Show More