73. PrintStream(打印流)

PrintStream(打印流)   打印流可以打印任意类型的数据,而且打印前都会把数据转换成字符串再进行打印(就是把数据存入硬盘中)

编码与解码图例:

下面我们来看看一个简单的字节输出流

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write(97);     fileOutputStream.close();
    }
}

最后我们查看记事本会发现我们存储的是字符串a,但是我们存入的数字97。原来记事本把这个数字当成了码值,因为记事本本身带有解码的功能,当我们存储int类型的数据的时候(FileOutputStream并没有对这个进行编码,它也把这个当成了码值),记事本会自动把数字转换成对应的字符,存储到记事本上面

如果我们想要存储97,只能先把这个变成一个String类型的数据存储,因为write接受一个字节类型数据,所以我们要使用String类的getBytes()方法把字符97转换成对应的码值(编码)后再存储到记事本上面,然后记事本再进行解码,这个我们就可以看到97这个数字了,例如下面

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write("97".getBytes());     fileOutputStream.close();
    }
}

我们再来看看一个简单的字符输出流

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write(97);
        fileWriter.close();
    }
}

我们可以发现记事本上面显示的是a,这个可以证明FileWriter 对于存储int类型的数据并没有进行编码,最后才会导致记事本自动解码显示为a(a编码后就是97)

但是当我们给write方法传入一个字符且不进行编码的时候,我们会发现记事本上面记录的是97,这个说明FileWriter内部对字符进行了编码,最后才导致记事本解码为97

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        FileWriter fileWriter = new FileWriter(file);
        fileWriter.write("97");
        fileWriter.close();
    }
}

总结上面的一些实例,我们可以发现无论是字节输出流,还是字符输出流,都需要把我们需要传入的数据转换成字符类型进行传输,如果我们要传入int类型的数据感觉很麻烦,因为字节也就是码值这个也是int类型

PrintStream(打印流)   打印流可以打印任意类型的数据,而且打印前都会把数据转换成字符串再进行打印(就是把数据存入硬盘中)

使用PrintStream打印流可以让我们放心的传入任何类型的数据(包括对象和数组),不需我们手动转换成字符类型,它内部就可以帮我们把数据转换成字符串,并把字符串编码,很方便

注意:PrintStream内部维护了一个字节数组,当我们使用write的时候是把数据存储到了字节数组中,并不是打印到文件中
当我们使用flush,close方法或者数组满了的时候,才会打印到文件中

  

PrintStream的构造方法:

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)
          创建具有指定文件名称和字符集且不带自动行刷新的新打印流。

PrintStream的一些方法:

print(boolean b)
          打印 boolean 值。(这个方法有很多重载,这个是为什么我们可以传入很多数据的原因)
println(boolean x)
          打印 boolean 值,然后换行。(这个方法有很多重载,这个是为什么我们可以传入很多数据的原因)
flush()
          刷新该流的缓冲,就是把内部数组中的数据打印到文本中
close()
          关闭流。

下面是一些实例:

传入int类型的97

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        PrintStream printStream = new PrintStream(file);
        printStream.print(97);
        printStream.close();
    }
}

传入一个对象

class People{
    String name;
    char sex;

    public People(String name,char sex) {
        this.name = name;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "姓名:"+this.name+"  性别:"+this.sex+"";
    }
}

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        PrintStream printStream = new PrintStream(file);
        printStream.print(new People("张三",‘男‘));
        printStream.close();
    }
}

注意:如果我们要在原有的数据上面追加数据,那么我们就要使用另一个构造方法PrintStream(OutputStream out)例如:

这一次我使用了println方法,换行

public class Demo1 {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 2; i++) {
            File file = new File("D:\\新建文件夹\\a.txt");
            PrintStream printStream = new PrintStream(new FileOutputStream(file,true));
            printStream.println(new People("张三",‘男‘));
            printStream.close();
        }
    }
}

我们一直在使用System.out.println()往控制台输出信息,那么我们如何在指定的地方输出我们的信息而不在控制台输出么?

我们要知道在java中默认的输出流就是向控制台输出的,如果我们要向其他地方输出信息,那么我们要指定输出的目标文件

我们可以找到在System类中有一个public static final PrintStream out字段

在System类中有一个方法setOut(PrintStream out)----重新分配“标准”输出流。我们可以知道它默认是向控制台输出的,如果我们要指定输出的目标文件,那么我们要传入一个PrintStream对象给它

实例如下:

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\新建文件夹\\a.txt");
        PrintStream printStream = new PrintStream(file);
        System.setOut(printStream);
        System.out.println("嘿嘿,你找到我了吗?");
    }
}

大家可能发现,这个有什么用,我用sysout输出不就是想在控制台看的么,不在控制台输出这不是很麻烦

其实我们一般把这个用来收集异常的日志信息,例如:

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //一般我们把收集异常的文件名以当前的时间命名,后缀名以log结尾
        File logfile = new File("D:\\新建文件夹\\2018年3月10日.log");
        //使用这个构造方法,是因为日志信息不可能只有一条,为了防止数据丢失我们要用追加
        PrintStream printStream = new PrintStream(new FileOutputStream(logfile,true));
        try {
            int c = 4/0;
            System.out.println(c);
        } catch (Exception e) {
            //原来我们一般是写e.printStackTrace(),这样会把错误信息默认打印在控制台,
            //其实这个方法还有一个重载的方法public void printStackTrace(PrintStream s)接受一个PrintStream对象
            //用这个我们就可以把错误信息打印到指定的目标文件中了
            e.printStackTrace(printStream);
        }
    }
}

原文地址:https://www.cnblogs.com/zjdbk/p/9097778.html

时间: 2024-10-08 23:42:35

73. PrintStream(打印流)的相关文章

PrintStream打印流

1 package file; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.PrintStream; 7 8 /* 9 打印流:(printStream)将任意数据转换成字符串在打印. 10 也能打印对象,和收集日志信息 11 12 13 */ 14 15 public class Demo13 { 16 public stat

打印流(printStream)

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; /* 打印流(printStream) 打印流可以打印任意类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印. */ class Animal{ String name; String color; public Animal(String name,String c

java _io_打印流,PrintStream和PrintWriter

*PrintStream和PrintWriter,效果相似 PrintStream ps=new PrintStream(字节流,true/false),为真则自动刷新内容,默认为假 System.out默认为PrintStream 打印流 写入文件(通过.println): PrintStream ps=new printStream(new BufferedStream(FileOutputStream("vv.txt")),true) ps.println("ad&qu

JAVA笔记12__字节、字符缓冲流/打印流/对象流/

/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * BufferedInputStream:字节缓冲流(有一个内部缓冲区数组,用于缓冲数据) */ public class Main { public static void main(String[] args) { input(); output(); } /** * 使用字节缓冲流进行读取操作

JavaSE——数据类型流、内存流、打印流

班级编号:VIP17 学员名字:小吴 课程名称:JAVASE 数据类型流 DataOutputStream是数据类型输出流,它能把基本数据类型直接写入到文件里:DataInputStream是数据类型输入输流,它能把基本数据类型直接读到程序上来,前面写出去的是什么顺序,读进来时就按写的顺序读,顺序读反了会出乱码或数据不正确,所有的流都是按先进先出原则. 先写到文件里: 再从文件里读进来: 内存流 在内存中,数组就是一块存放数据的区域,所以数组也叫数据缓存区,那么字节数组也是缓存区.ByteArr

打印流: PrintStream 和 PrintWriter

/* * 1.打印流: PrintStream 和 PrintWriter 两个. * * 1) PrintStream 字节的打印流, PrintWriter 字符的打印流. * * 2) 功能: 打印流均属于输出流.因此,用来以模拟打印机的方式来输出数据. * * 3) 它的常用方法: print() 和 println(); * * 4) 打印流具有自动刷新功能.即:自动调用 flush()方法. * * 5) 打印流还具有自动实现字符与字节的转换功能. * * 6) 以打印流方式实现数据

打印流-使用PrintStream输出数据,输出文本

在java.io包中提供有两个打印流的处理类:PrintStream(字节打印流).PrintWriter(字符打印流). 首先来观察PrintStream类的继承结构与构造方法:.public class PrintStream extends FilterOutputStream implements Appendable, Closeable.public PrintStream(OutputStream out),需要通过外部设置输出位置 1 package cn.demo; 2 3 i

(JAVA)从零开始之--打印流PrintStream记录日志文件

这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. 1 File file = new File("F:\\a.txt"); 2 FileOutputStream outputStream = new FileOutputStream(file,true);//第二个参数为追加文本 3 outputStream.write(97); 上面的代码执行完之后,a.txt中的内容存的

打印流-PrintStream和PrintWriter

IO包中的其他功能流对象功能流对象特点:解决问题的特有方法. 打印流--必须是输出流(两个都是)PrintStream(字节流) PrintWriter(字符流)特点:打印.不抛异常打印的目的:File对象,字符串路径,字节输出流. 解决的问题:方便的打印各种数据的表示形式. 它的打印方法可以保证数值的表现形式不变.写的是什么样子,目的地就是什么样子 PrintWriter:一样具备打印功能. 目的:File对象,字符串路径,字节输出流,字符输出流. PrintStream实例: import