详解 打印流

Posted codderyouzg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解 打印流相关的知识,希望对你有一定的参考价值。

(请观看本人博文——《详解 I/O流》)



打印流

概述

打印流分为:字节流打印流字符打印流
通过这两个流,我们可以向所关联的文件 或 或控制台 打印数据
打印流只有输出流没有输入流

特点

  • 打印流只能操作目的地,不能操作数据源
    (不能进行读取数据)
  • 可以操作任意数据类型的数据,调用print() 方法可以写任意数据类型

那么,现在,本人来介绍下 字节流打印流(PrintStream 类):

PrintStream 类:

概述

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
异常情况仅设置可通过 checkError 方法测试的内部标志。
另外,为了自动刷新,可以创建一个 PrintStream;
这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 (‘ ‘)。
PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。
在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。

现在,本人来展示下这个类的构造方法

构造方法

  • PrintStream(File file)
    创建具有指定文件的新打印流
  • PrintStream(File file, String csn)
    创建具有指定文件名称字符集的新打印流
  • PrintStream(OutputStream out)
    创建新的打印流
  • PrintStream(OutputStream out, boolean autoFlush)
    创建新的打印流
  • PrintStream(OutputStream out, boolean autoFlush, String encoding)
    创建新的打印流
  • PrintStream(String fileName)
    创建具有指定文件名称的新打印流
  • PrintStream(String fileName, String csn)
    创建具有指定文件名称字符集的新打印流

那么,现在,本人来展示下这个类的API
常用API

  • void close()
    关闭此流,并自动清空缓冲区的内容
  • PrintStream append(char c)
    将指定字符添加到此输出流
  • PrintStream append(CharSequence csq)
    将指定字符序列添加到此输出流
  • PrintStream append(CharSequence csq, int start, int end)
    将指定字符序列的子序列添加到此输出流
  • boolean checkError()
    刷新流并检查其错误状态
  • protected void clearError()
    清除此流的内部错误状态
  • void close()
    关闭流
  • void flush()
    刷新该流的缓冲
  • PrintStream format(Locale l, String format, Object... args)
    使用指定格式字符串和参数将格式化字符串写入此输出流中
  • PrintStream format(String format, Object... args)
    使用指定格式字符串和参数将格式化字符串写入此输出流中
  • void print(boolean b)
    打印 boolean 值
  • void print(char c)
    打印字符
  • void print(char[] s)
    打印字符数组
  • void print(double d)
    打印双精度浮点数
  • void print(float f)
    打印浮点数
  • void print(int i)
    打印整数
  • void print(long l)
    打印 long 整数
  • void print(Object obj)
    打印对象
  • void print(String s)
    打印字符串
  • PrintStream printf(Locale l, String format, Object... args)
    使用指定格式字符串和参数将格式化的字符串写入此输出流的便捷方法
  • PrintStream printf(String format, Object... args)
    使用指定格式字符串和参数将格式化的字符串写入此输出流的便捷方法
  • void println()
    通过写入行分隔符字符串终止当前行
  • void println(boolean x)
    打印 boolean 值,然后终止行
  • void println(char x)
    打印字符,然后终止该行
  • void println(char[] x)
    打印字符数组,然后终止该行
  • void println(double x)
    打印 double,然后终止该行
  • void println(float x)
    打印 float,然后终止该行
  • void println(int x)
    打印整数,然后终止该行
  • void println(long x)
    打印 long,然后终止该行
  • void println(Object x)
    打印 Object,然后终止该行
  • void println(String x)
    打印 String,然后终止该行
  • protected void setError()
    将该流的错误状态设置为 true
  • void write(byte[] buf, int off, int len)
    将 len 字节从指定的初始偏移量为 off 的 byte 数组写入此流
  • void write(int b)
    将指定的字节写入此流

那么,在之前的博文中,本人展示的都是向文件中录入数据,相信同学们都知道了那些操作的套路了,那么,现在,本人展示下向控制台输出数据:

package edu.youzg.about_io.about_file.core.Test;

import java.io.*;

public class Test {

    public static void main(String[] args) throws IOException {
        PrintStream out = System.out;
        out.write("右转哥".getBytes());
        out.println(666);
        out.print("我要单推右转哥");
        out.close();
    }

}

那么,现在,我们来看一下运行结果:
技术图片


那么,现在,本人来讲解下 字符打印流(PrintWriter 类):

PrintWriter 类:

概述

向文本输出流打印对象的格式化表示形式。
此类实现在 PrintStream 中的所有 print 方法。
不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream 类不同,如果启用了自动刷新,
则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,
而不是每当正好输出换行符时才完成。
这些方法使用平台自有的行分隔符概念,而不是换行符。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。
客户端可能会查询调用 checkError() 是否出现错误

现在,本人来介绍下这个类的构造方法

构造方法

  • PrintWriter(File file)
    使用指定文件创建不具有自动行刷新的新 PrintWriter
  • PrintWriter(File file, String csn)
    创建具有指定文件和字符集不带自动刷行新的新 PrintWriter
  • PrintWriter(OutputStream out)
    根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter
  • PrintWriter(OutputStream out, boolean autoFlush)
    通过现有的 OutputStream 创建带自动行刷新的新的 PrintWriter
  • PrintWriter(String fileName)
    创建具有指定文件名称不带自动行刷新的新 PrintWriter
  • PrintWriter(String fileName, String csn)
    创建具有指定文件名称和字符集不带自动行刷新的新 PrintWriter
  • PrintWriter(Writer out)
    创建不带自动行刷新的新 PrintWriter
  • PrintWriter(Writer out, boolean autoFlush)
    创建带自动行刷新的新 PrintWriter

本人再来展示下这个类的常用API:

常用API:

  • PrintWriter append(char c)
    将指定字符添加到此 writer。
  • PrintWriter append(CharSequence csq)
    将指定的字符序列添加到此 writer。
  • PrintWriter append(CharSequence csq, int start, int end)
    将指定字符序列的子序列添加到此 writer。
  • boolean checkError()
    如果流没有关闭,则刷新流且检查其错误状态。
  • protected void clearError()
    清除此流的错误状态。
  • void close()
    关闭该流并释放与之关联的所有系统资源。
  • void flush()
    刷新该流的缓冲。
  • PrintWriter format(Locale l, String format, Object... args)
    使用指定格式字符串和参数将一个格式化字符串写入此 writer 中。
  • PrintWriter format(String format, Object... args)
    使用指定格式字符串和参数将一个格式化字符串写入此 writer 中。
  • void print(boolean b)
    打印 boolean 值。
  • void print(char c)
    打印字符。
  • void print(char[] s)
    打印字符数组。
  • void print(double d)
    打印 double 精度浮点数。
  • void print(float f)
    打印一个浮点数。
  • void print(int i)
    打印整数。
  • void print(long l)
    打印 long 整数。
  • void print(Object obj)
    打印对象。
  • void print(String s)
    打印字符串。
  • PrintWriter printf(Locale l, String format, Object... args)
    使用指定格式字符串和参数将格式化的字符串写入此 writer 的便捷方法。
  • PrintWriter printf(String format, Object... args)
    使用指定格式字符串和参数将格式化的字符串写入此 writer 的便捷方法。
  • void println()
    通过写入行分隔符字符串终止当前行。
  • void println(boolean x)
    打印 boolean 值,然后终止该行。
  • void println(char x)
    打印字符,然后终止该行。
  • void println(char[] x)
    打印字符数组,然后终止该行。
  • void println(double x)
    打印双精度浮点数,然后终止该行。
  • void println(float x)
    打印浮点数,然后终止该行。
  • void println(int x)
    打印整数,然后终止该行。
  • void println(long x)
    打印 long 整数,然后终止该行。
  • void println(Object x)
    打印 Object,然后终止该行。
  • void println(String x)
    打印 String,然后终止该行。
  • protected void setError()
    指示已发生错误。
  • void write(char[] buf)
    写入字符数组。
  • void write(char[] buf, int off, int len)
    写入字符数组的某一部分。
  • void write(int c)
    写入单个字符。
  • void write(String s)
    写入字符串。
  • void write(String s, int off, int len)
    写入字符串的某一部分

那么,现在,本人来展示下这个类的使用:

package edu.youzg.about_io.about_file.core.Test;

import java.io.*;

public class Test {

    public static void main(String[] args) throws IOException{
        //如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
        PrintWriter writer = new PrintWriter(new FileOutputStream("test.txt"),true);
        writer.println("图画里");
        writer.write("龙不吟");
        writer.println();
        writer.print("虎不啸");
        writer.print("
");
        writer.println("小小书童");
        writer.println("可笑可笑");
        writer.close();
    }

}

现在,本人来展示下运行后生成的文件的内容:
技术图片

本人在上面说过,此流只有输出流,没有输入流。
但是,这并不意味着,此流不能用于文件的复制操作
那么,现在,本人就来展示下利用字符打印流来完成文件的复制:

package edu.youzg.about_io.about_file.core.Test;

import java.io.*;

public class Test {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new FileReader("test.txt"));

        PrintWriter printWriter = new PrintWriter(new FileOutputStream("copyFile.txt"),true);
        String line = null;
        while ((line=reader.readLine())!=null){
            printWriter.println(line);
        }

        //释放资源
        reader.close();
        printWriter.close();
    }

}

那么,本人来展示下生成的复制文件的内容:
技术图片

(本人 I/O流总集篇 博文链接:https:////www.cnblogs.com/codderYouzg/p/12418404.html

以上是关于详解 打印流的主要内容,如果未能解决你的问题,请参考以下文章

Java8 Stream流

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

TS Stream 详解

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流