IO(10)----打印流

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/82992782

一、打印流概述                                                                                                                 点击此处返回总目录

二、打印流的使用

三、打印流的自动刷新功能

四、应用:打印流实现文本文件复制

五、解释一个问题:打印字符数组不是打印地址而是遍历

一、打印流概述

打印流一共有两个:

PrintStream               //打印字节流

PrintWriter                 //打印字符流

扫描二维码关注公众号,回复: 3671155 查看本文章

打印流的特点:

1. 此流不负责数据源,只负责数据目的端。

2. 为其他流添加了功能,方便打印

3. 永远不会抛出IOException,但是可能抛出别的异常。

二、打印流的使用

两个打印流的方法完全一致。这两个流的区别在于构造方法。构造方法中写明了输出目的。PrintWriter比PrintStream多一个数据目的,因此用的多一些。

1) 构造方法

PrintStream的构造方法:

1. printStream(File file);

2. printStream(String filename);

3. printStream(OutputStream os);

printWriter的构造方法:

1. printWriter(File file);                                                  //【例1】

2. printWriter(String filename);                                      //【例2】

3. printWriter(OutputStream os);                                   //【例3】

4. printWriter(OutputStream os, boolean autoFlush)    //可以开启自动刷新功能。

5. printWriter(Writer w);                                                 //【例4】

6. printWriter(Writer w, boolean autoFlush);                  //可以开启自动刷新功能。

2)常用的方法

1. print()                                       //原样输出。

2. println()                                    //原样输出。

例1:

package cn.itcast.demo05;

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

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("e:\\aaa.txt");
        PrintWriter pw = new PrintWriter(file);
        
        pw.println(100);                                                   //原样输出,打出来的是100,不是d。不走码表。
        pw.flush();
        
        pw.println(true);                                                   //原样输出。
        pw.close();       
    }
}

运行结果,打开aaa.txt,可以看到:

100
true

例2:

package cn.itcast.demo07;

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

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        PrintWriter pw = new PrintWriter("e:\\bbb.txt");
        pw.print("hello");
        pw.flush();
        pw.print(222);
        pw.close();
    }
}

例3:

package cn.itcast.demo08;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        FileOutputStream fos = new FileOutputStream("e:\\c.txt");
        PrintWriter pw = new PrintWriter(fos);
        
        pw.println("hello");
        pw.flush();
        pw.print("lijing");
        pw.close();
        
    }
}

例4:

package cn.itcast.demo08;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("e:\\d.txt");
        PrintWriter pw = new PrintWriter(fw);
        
        pw.println("hello");
        pw.flush();
        pw.print("lijing");
        pw.close();
        
    }
}

三、打印流的自动刷新功能

打印流可以开启自动刷新功能,但是必须要满足两个条件:

1. 输出的数据目的必须是流对象。也就是只能是OutputStream或Writer。

2. 必须调用println、printf、format三个方法中的一个。

通过一下这两个构造方法来实现自动刷新:

printWriter(OutputStream os, boolean autoFlush)    //可以开启自动刷新功能。

printWriter(Writer w, boolean autoFlush);                  //可以开启自动刷新功能。

例:

package cn.itcast.demo09;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        FileOutputStream fos = new FileOutputStream("e:\\fff.txt");
        PrintWriter pw = new PrintWriter(fos,true);
        
        pw.println("aaa");
        pw.println("bbb");
        pw.close();                                   //可以看到,当不写这一句时,fff.txt中也有相应的内容。
        
    }
}

四、应用:打印流实现文本文件复制

读取文件:使用BufferedReader,每次读取一行

写文件:使用PrintWriter,而且自动刷新。

package cn.itcast.demo10;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new FileReader("e:\\d.txt"));
        PrintWriter pw = new PrintWriter(new FileWriter("e:\\gg.txt"),true);
        
        String line = null;
        while((line = br.readLine())!=null){
            pw.println(line);
        }
        
        pw.close();
        br.close();
    }
}

五、解释一个问题:打印字符数组不是打印地址而是遍历

package cn.itcast.demo06;

public class Test {
    public static void main(String[] args) {
        int[] in = {1,3,4};
        System.out.println(in);     //[I@104c575。输出数组地址
    
        byte[] by = {12,34};
        System.out.println(by);     //[B@3fa5ac。输出数组地址。
        
        char[] ch = {'a','b','c'};
        System.out.println(ch);     //abc。输出的不是地址,而是abc。
    
    }
}

其他的打印都是数组地址,唯独字符数组打印的是字符。为什么呢?

查看printStream类或者printWriter类的API文档,可以看到只有一个打印数组的函数:

void println(char[] ch) 

但是没有打印其他数组的函数,比如void println(int[] in)、void println(byte[] b)等等都是没有的。

因此在上面的例子中println(ch)调用的是println(char[] ch)这个方法,这个方法会遍历数组。

而println(in)、println(by)调用的是void println(Object x)这个方法,这个方法打印的是地址。

为什么只有char数组做遍历,而其他数组没有遍历呢?

因为String s = "abc"的本质就是字符数组。打印s,就是打印的字符数组。如果打印字符数组这里不是遍历的话,打印字符串也将看到的是地址。所以这个地方的遍历是为了字符串准备的。

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/82992782