betacode

Руководство Java PrintWriter

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

1. PrintWriter

PrintWriter - это подкласс Writer, который используется для печати форматированных данных в OutputStream или другой Writer, которым он управляет.
Характеристики PrintWriter:
Все методы PrintWriter не выдают исключений I/O. Чтобы проверить, произошло ли исключение, можно вызвать метод checkError().
При необходимости PrintWriter может выполнять автоматическую очистку (flush), это означает, что метод flush() будет вызван сразу после вызова метода println(..) или при печати текста, содержащего символ '\n'.

2. PrintWriter Constructors

Конструкторы для создания объекта PrintWriter без автоматической очистки (flush):
public PrintWriter​(File file)    

public PrintWriter​(File file, String csn)    

public PrintWriter​(File file, Charset charset)    

public PrintWriter​(OutputStream out)  

public PrintWriter​(Writer out)  

public PrintWriter​(String fileName)    

public PrintWriter​(String fileName, String csn)    

public PrintWriter​(String fileName, Charset charset)
Конструкторы для создания объекта PrintWriter с опцией автоматической очистки (flush):
public PrintWriter​(OutputStream out, boolean autoFlush)    

public PrintWriter​(OutputStream out, boolean autoFlush, Charset charset)  

public PrintWriter​(Writer out, boolean autoFlush)
Существует довольно много constructor для инициализации объекта PrintWriter. Давайте посмотрим, что происходит при создании PrintWriter в некоторых конкретных ситуациях:
PrintWriter(Writer)
Создаем объект PrintWriter для печати форматированных данных в другой Writer.
PrintWriter(OutputStream):
Создаем объект PrintWriter для печати форматированных данных в OutputStream..
PrintWriter(File file) / PrintWriter(String fileName)
Создаем объект PrintWriter для печати форматированных данных в файл.
Если BufferedWriter участвует в структуре PrintWriter, данные будут временно записаны в buffer (BufferedWriter), который будет перемещен в целевой объект (Targert), когда buffer будет заполнен (см. иллюстрацию выше). Вы можете заранее отправить данные в целевой объект, вызвав PrintWriter.flush()
Если PrintWriter создается с включенной функцией autoFlush, данные передаются в целевой объект каждый раз, когда вызывается метод PrintWriter.println(..) или PrintWriter.format(..).

3. PrintWriter Methods

Методы PrintWriter:
Methods of PrintWriter
public PrintWriter append​(char c)  
public PrintWriter append​(CharSequence csq)  
public PrintWriter append​(CharSequence csq, int start, int end)  

public PrintWriter format​(String format, Object... args)  
public PrintWriter format​(Locale l, String format, Object... args)  

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

public boolean checkError()
protected void clearError()  
protected void setError()

public void print​(boolean b)  
public void print​(char c)  
public void print​(char[] s)
public void print​(double d)  
public void print​(float f)  
public void print​(int i)  
public void print​(long l)  
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​(char[] x)  
public void println​(double x)
public void println​(float x)  
public void println​(int x)  
public void println​(long x)
public void println​(String x)  

public void println​(Object x)
Other methods override the methods of the parent class and do not throw an exception:
public void write​(char[] buf)
public void write​(char[] buf, int off, int len)
public void write​(int c)  
public void write​(String s)
public void write​(String s, int off, int len)

public void close()  
public void flush()

4. Examples

Получите трассировку стека (stack trace) из Exception:
GetStackTraceEx.java
package org.o7planning.printwriter.ex;

import java.io.PrintWriter;
import java.io.StringWriter;

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)  {
        StringWriter stringWriter = new StringWriter();
         
        // Create PrintWriter via PrintWriter(Writer) constructor.
        PrintWriter pw = new PrintWriter(stringWriter);
         
        // Call method: Throwable.printStackTrace(PrintWriter)
        t.printStackTrace(pw);
        pw.close();
         
        String s = stringWriter.getBuffer().toString();
        return s;
    }
}
Output:
java.lang.ArithmeticException: / by zero
    at org.o7planning.printwriter.ex.GetStackTraceEx.main(GetStackTraceEx.java:10)
PrintWriterEx1.java
package org.o7planning.printwriter.ex;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Locale;

public class PrintWriterEx1 {

    // Windows: C:/SomeFolder/pw-out-test.txt
    private static final String filePath = "/Volumes/Data/test/pw-out-test.txt";

    public static void main(String[] args) throws IOException {
        
        // Create a PrintWriter to write a file.
        PrintWriter printWriter = new PrintWriter(filePath);
        
        LocalDateTime now = LocalDateTime.now();
        
        String empName = "Tran";
        LocalDate hireDate = LocalDate.of(2000, 4, 23);  
        int salary = 10000;
        
        printWriter.printf("# File generated on %1$tA, %1$tB %1$tY %tH:%tM:%tS %n", now, now, now);
 
        printWriter.println(); // New line
        printWriter.printf("Employee Name: %s%n", empName);
        printWriter.printf("Hire date: %1$td.%1$tm.%1$tY %n", hireDate);
        printWriter.printf(Locale.US, "Salary: $%,d %n", salary);

        printWriter.close();
    }
}
Output:
pw-out-test.txt
# File generated on Thursday, February 2021 01:31:22

Employee Name: Tran
Hire date: 23.04.2000
Salary: $10,000
Методы PrintStream.printf(..) и PrintWriter.printf(..) одинаковы в использовании, вы можете обратиться к его использованию в статье ниже:

5. checkError()

Метод checkError() возвращает состояние ошибки этого PrintWriter, и метод flush() также вызывается, если PrintWriter не было закрыто.
public boolean checkError()
Примечание: Все методы PrintWriter не вызывают исключение IOException, но как только в методах возникает исключение IOException, его состояние считается ошибкой.
Состояние ошибки этого PrintWriter очищается только при вызове функции clearError(), но это метод protected. Вы можете написать класс, расширяющий PrintWriter, и переопределить (override) этот метод, если хотите его использовать (см. пример ниже).
MyPrintWriter.java
package org.o7planning.printwriter.ex;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class MyPrintWriter extends PrintWriter {

    public MyPrintWriter(File file) throws FileNotFoundException {
        super(file);
    }
    
    @Override
    public void clearError()  {
        super.clearError();    // Call protected method.
    }
}
Например: Используйте метод checkError() для проверки состояния ошибки of PrintWriter:
PrintWriter_checkError_ex1.java
package org.o7planning.printwriter.ex;

import java.io.File;

public class PrintWriter_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);

        MyPrintWriter mps = new MyPrintWriter(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(..) *

Метод print(..) используется для печати примитивного значения в этом PrintWriter
public void print​(boolean b)  
public void print​(char c)  
public void print​(char[] s)
public void print​(double d)  
public void print​(float f)  
public void print​(int i)  
public void print​(long l)  
public void print​(String s)
Наример:
PrintWriter_print_primitive_ex1.java
Writer swriter = new StringWriter();
PrintWriter ps = new PrintWriter(swriter);

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

System.out.println(swriter.toString());
Output:
true
abc
Text

7. print(Object)

Преобразуйте объект в String с помощью метода String.valueOf(Object) и распечатайте результат для этого PrintWriter.
public void print(Object obj) {
   this.write(String.valueOf(obj));
}
Например:
PrintWriter_print_object_ex1.java
Writer writer = new StringWriter();
PrintWriter ps = new PrintWriter(writer);

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);

String content = writer.toString();
System.out.println(content);
Output:
null
Socket[unconnected]
[One, Two, Three]

8. println()

Выведите символ новой строки для этого PrintWriter. Метод flush() также вызывается, если у этого PrintWriter есть режим автоматической очистки (auto flush).
public void println() {
    print('\n');
    if(autoFlush) this.flush();
}

9. println(..) *

Метод println(..) используется для печати примитивного значения и символа новой строки в этом PrintWriter. Метод flush() также вызывается, если у этого PrintWriter есть режим автоматической очистки (auto flush).
public void println​(boolean x)  
public void println​(char x)  
public void println​(char[] x)  
public void println​(double x)
public void println​(float x)  
public void println​(int x)  
public void println​(long x)
public void println​(String x)
Например:
PrintWriter_println_primitive_ex1.java
OutputStream baos = new ByteArrayOutputStream();
PrintWriter ps = new PrintWriter(baos);

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

String content = baos.toString();
System.out.println(content);
Output:
true
abc
Text

10. println(Object)

Преобразуйте объект в String с помощью метода String.valueOf(Object), а затем распечатайте результат и символ новой строки в этом PrintWriter. Метод flush() также вызывается, если у этого PrintWriter есть режим автоматической очистки (auto flush). Этот метод работает так же, как при вызове метода print(Object), а затем println().
public void println(Object x) {
       this.write(String.valueOf(x));
       this.write("\n");
       if(this.autoFlush) this.flush();
}
Например:
PrintWriter_println_object_ex1.java
Writer swriter = new StringWriter();
PrintWriter ps = new PrintWriter(swriter);

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

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

Object obj3 = Arrays.asList("One", "Two", "Three");
ps.println(obj3);

String content = swriter.toString();
System.out.println(content);
Output:
null
Socket[unconnected]
[One, Two, Three]

11. printf(..) *

Удобный метод записи отформатированной строки в этот PrintWriter с использованием строки формата и указанных аргументов.
public PrintWriter printf​(String format, Object... args)  
public PrintWriter printf​(Locale l, String format, Object... args)
Этот метод работает аналогично приведенному ниже коду:
String result = String.format(format, args);
printStream.print(result);
 
// Or:
String result = String.format(locale, format, args);
printStream.print(result);
Смотрите также:

12. format(..) *

Этот метод работает так же, как метод printf(..).
public PrintWriter format​(String format, Object... args)  
public PrintWriter format​(Locale l, String format, Object... args)
Это работает так, как показано в приведенном ниже коде:
String result = String.format(format, args);
printStream.print(result);
 
// Or:
String result = String.format(locale, format, args);
printStream.print(result);
Смотрите также:

13. append(..) *

Методы append(..) работают так же, как методы print(..), с той лишь разницей, что он возвращает этот PrintWriter. Таким образом, вы можете продолжить вызов следующего метода вместо того, чтобы заканчиваться точкой с запятой ( ; ).
public PrintWriter append​(char c)  
public PrintWriter append​(CharSequence csq)  
public PrintWriter append​(CharSequence csq, int start, int end)
Например:
PrintWriter_append_ex1.java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter ps = new PrintWriter(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

Руководства Java IO

Show More