Java--字符流、打印流、转换流

一、字符编码

  ISO-8859-1:收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号

  UTF-8:针对Unicode的可变长度字符编码

  GB2312:简体中文

  GBK:简体中文、扩充

  BIG5:台湾,繁体中文

  注意:当编码方式和解码方式不一致时,会出现乱码。

二、字符流

  说一个问题

  字节流在读取文件的时候,如果文件中的内容是英文,则正常读取,如果是中文,则读出的数据会出现乱码。

  用UTF-8编码格式的文件,一个汉字占3个字节,因为字节流是一个字节一个字节往外读取的,所以会出现乱码,这个时候要用字符流。

  字符流的父类(抽象类)

    Reader:字符输入流

      public int read(){};读取单个字符

      public int read(char[] c){};读取多个字符

      public int read(char[] b,int off,int len){}

    Writer:字符输出流

      public int write(int n){};写一个字符

      public int write(String str){};写一个字符串

      public int write(char[] c){};写一个字符数组

三、文件字符流

  FileReader:

    public int read(char[] c){};//从流中读取多个字符,将读到的内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1;

  FileWriter:

    public void write(String str)//一次写多个字符,将b数组中所有字符,写入输出流

  案例:文件字符输入输出流案例 及 文件复制案例

  注意:使用FileReader和FileWriter实现文件复制功能(只能复制文本文件 不能复制图片或二进制文件)

     使用字节流来复制任意文件,所有的文件都是以二进制形式存储的,文本文件 有编码格式,图片或二级制文件没有编码格

------------------------------字符输入流------------------------------
package com.monv.chapter15_1;

import java.io.FileReader;

/**
 * 使用 FileReader读取文件
 * @author Monv
 *
 */
public class Demo2 {
    public static void main(String[] args) throws Exception{
        //1.创建文件字符输入流 FileReader
        FileReader fr = new FileReader("D:\\hello.txt");
        //2.读取
        //2.1读取单个字符
//        int data = 0;
//        while((data = fr.read())!=-1) {//读取一个字符
//            System.out.print((char)data);
//        }
        //2.2读取全部
        char[] buf = new char[1024];
        int count = 0 ;
        while ((count = fr.read(buf)) !=-1) {
            System.out.println(new String(buf, 0, count));
        }
        //3.关闭
        fr.close();
    }
}
--------------------------------字符输出流  -----------------------------
package com.monv.chapter15_1;

import java.io.FileWriter;

/**
 * 使用 FileWriter写入文件
 * @author Monv
 *
 */
public class Demo3 {
    public static void main(String[] args) throws Exception{
        //1.创建 FileWriter对象
        FileWriter fw = new FileWriter("D:\\Write.txt");
        //2.写入数据
        for(int i =0;i<10;i++) {
            fw.write(i+" Java 是世界上最好的语言!\r\n");
            fw.flush();    
        }
        //3.关闭
        fw.close();
        System.out.println("执行完毕");
    }
}
--------------------------------字符流复制------------------------------
package com.monv.chapter15_1;

import java.io.FileReader;
import java.io.FileWriter;

/**
 * 使用FileReader和FileWriter实现文件复制功能(只能复制文本文件 不能复制图片或二进制文件)
 * 使用字节流来复制任意文件,所有的文件都是以二进制形式存储的,文本文件 有编码格式,图片或二级制文件没有编码格式
 * @author Monv
 *
 */
public class Demo4 {
    public static void main(String[] args) throws Exception{
        //1.创建 FileReader 和 FileWriter
        FileReader fr = new FileReader("D:\\Write.txt");
        FileWriter fw = new FileWriter("D:\\Write2.txt");
        //2.读写
        int data = 0 ;
        while((data = fr.read())!= -1) {
            fw.write(data);
            fw.flush();
        }
        //3.关闭
        fr.close();
        fw.close();
        System.out.println("执行完毕");
    }
}

四、字符缓冲流

  缓冲流:BufferedReader/BufferedWriter

    高效读写;支持输入换行符;可以一次写一行、读一行。

  案例:缓冲流的使用

package com.monv.chapter15_1;

import java.io.BufferedReader;
import java.io.FileReader;

/**
 * 使用字符缓冲流来读取文件
 * BufferedReader
 * @author Monv
 *
 */
public class Demo5 {
    public static void main(String[] args) throws Exception {
            //1.创建缓冲流
            FileReader fr = new FileReader("D:\\Write.txt");
            BufferedReader br = new BufferedReader(fr);
            //2.读取
            //2.1第一种方式 
//            char[] buf = new char[1024];
//            int count = 0 ;
//            while((count = br.read(buf))!=-1) {
//                System.out.println(new String(buf, 0, count));
//            } 
            //2.2一行一行的读取
            String line = null;
            while((line =br.readLine() ) != null) {//readLine()一次可以读取一行数据
                System.out.println(line);
            }
        
            //3.关闭
            br.close();
    }
}
------------------------------------------------------
package com.monv.chapter15_1;

import java.io.BufferedWriter;
import java.io.FileWriter;

/**
 * 使用字符缓冲流来写入文件
 * BufferedWriter
 * @author Monv
 *
 */
public class Demo6 {
    public static void main(String[] args) throws Exception{
        //1.创建
        FileWriter fw = new FileWriter("D:\\buffer.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        //2.写入文件
        for(int i =0;i<10;i++) {
            bw.write("好好学习,天天向上");
            bw.newLine();//写入一个换行符
            bw.flush();//刷新存入
        }
        //3.关闭
        bw.close();
        System.out.println("执行完毕");
    }
}

 

五、打印流

  PrintWriter:封装了print()/println()方法,支持写入后换行

        支持数据原样打印

  案例:printWriter的使用

package com.monv.chapter15_1;

import java.io.PrintWriter;

/**
 * 演示 PrintWriter打印流的使用
* 数据原样打印 *
@author Monv * */ public class Demo7 { public static void main(String[] args) throws Exception{ //1.创建打印流 PrintWriter pt = new PrintWriter("D:\\print.txt"); //2.打印 pt.println(97); pt.println(true); pt.println(3.14); pt.println('a'); pt.println("好"); //3.关闭 pt.close(); System.out.println("执行完毕"); } }

六、转换流(内存中的字符和硬盘上的字节之间的转换)

  桥转换流:InputStreamReader(InputStream是字节流的抽象类,Reader是字符流的抽象类.字节流通往字符流的桥梁)

       OutputStreamWriter (OutputStream是字节流的抽象类,Writer是字符流的抽象类.字符流通往字节流的桥梁)

    可将字节流转换为字符流

    可设置字符的编码方式

  注意:文件的编码格式和读取的时候使用的编码格式要一致,否则会有乱码

  案例:转换流的使用

package com.monv.chapter15_1;

import java.io.FileInputStream;
import java.io.InputStreamReader;

/**
 *使用 InputStreamReader读取文件,指定使用编码
 *注意:文件的编码格式 和 读取的时候使用的编码格式要一致  否则会有乱码
 * @author Monv
 *
 */
public class Demo8 {
    public static void main(String[] args) throws Exception{
        //1.创建 InputStreamReader 对象 
        FileInputStream fis = new FileInputStream("D:\\hello.txt");
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//这个转流可以指定编码格式
        //2.读取
        int data = 0;
        while ((data = isr.read())!=-1) {
            System.out.print((char)data);
        }
        //3.关闭
        isr.close();
        
    }
}
--------------------------------------------------
package com.monv.chapter15_1;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

/**
 * 使用 OutputStreamWriter 写入文件,使用指定的编码
 * gbk编码对应的文件格式 ANSI  UTF-8编码对应的文件格式UTF-8
 * @author Monv
 *
 */
public class Demo9 {
    public static void main(String[] args) throws Exception {
        //1.创建 OutputStreamWriter 对象
        FileOutputStream fos = new FileOutputStream("D:\\info.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
        //2.写入
        for(int i =0;i<10;i++) {
            osw.write("河北加油,石家庄加油!!\r\n");
            osw.flush();
        }
        //3.关闭
        osw.close();
        System.out.println("执行完毕");
    }
}

 

posted @ 2021-01-23 21:48  改Bug的小魔女  阅读(180)  评论(0编辑  收藏  举报