IO(10)----打印流

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

二、打印流的使用

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

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

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

 

 

一、打印流概述

打印流一共有两个:

PrintStream               //打印字节流

PrintWriter                 //打印字符流

 

打印流的特点:

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,就是打印的字符数组。如果打印字符数组这里不是遍历的话,打印字符串也将看到的是地址。所以这个地方的遍历是为了字符串准备的。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值