07 字符流

07 字符流

传统字节流读取

 //1.创建FileInputStream并指定文件路径
        FileInputStream fis = new FileInputStream("E:\\1.txt");


        //上述进行优化
         int data = 0;
        while ((data = fis.read()) != -1){
            System.out.print((char)data);
        }

        //3.关闭
        fis.close();

读取中文会产生乱码

7.1、字符流的父类(抽象类)

FileReader(字符输入流)是用于读取字符流

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

FileWriter(字符输出流)是用于写入字符流

  • public void write(int n){}
  • public void write(String str){}
  • public void write(char[] c){}
package com.itheima;

import java.io.FileReader;
/**
 *使用FileReader 读取文件
/
public class TestFileReader {

    public static void main(String[] args) throws Exception{

        //1.创建缓冲流
        FileReader fileReader = new FileReader("E:\\4.txt");

        //2.读取
        //1.第一种方式
        char[] buff = new char[1024];
        int count = 0;
        while ((count = fileReader.read(buff)) != -1){
            System.out.println(new String(buff,0,count));
        }

        //3.关闭
        fileReader.close();

    }
}
package com.itheima;

import java.io.FileWriter;

/**
 * 使用FileWriter 写入文件
 */
public class TestFileWriter {

    public static void main(String[] args) throws Exception{

        //1.创建FileWriter对象
        FileWriter fileWriter = new FileWriter("E:\\write.txt");
        //2.写入
        for (int i = 0; i < 10; i++) {
            fileWriter.write("中国共产党万岁!\r\n");
            fileWriter.flush();
        }
        //3.关闭
        fileWriter.close();
        System.out.println("执行完毕");
    }
}

7.2、使用上述内容进行文本文件复制(案例)

字符流不能复制图片或者二进制文件,使用字节流可以复制任意文件

package com.itheima;

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

/**
 * 使用FileReader和FileWriter复制文本文件,不能复制图片或者其他二进制文件
 * 字节流可以复制所有文件
 */
public class Copy {

    public static void main(String[] args) throws Exception{

        //1.创建
        FileReader fileReader = new FileReader("E:\\write.txt");
        FileWriter fileWriter = new FileWriter("E:\\write2.txt");

        //2.读写
        int data  = 0;
        while ((data = fileReader.read()) != 0){
            fileWriter.write(data);
            fileWriter.flush();
        }

        //3.关闭
        fileWriter.close();
        fileReader.close();
        System.out.println("复制完毕");
    }
}

7.3、字符缓冲流

BufferedReader

从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。

BufferedWriter

将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。

提供了一个newLine()方法,调用此方法来终止每个输出行,因此优选直接写入换行符。

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

package com.itheima;

import java.io.BufferedReader;
import java.io.FileReader;
/**
 * 使用bufferedReader读取数据
 */
public class TestBufferedReader {

    public static void main(String[] args) throws Exception{

        //1.创建缓冲流
        FileReader fileReader = new FileReader("E:\\write.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        //2.读取
        //2.1 第一种方法
        /*char[] buff = new char[1024];
        int count = 0;
        while ((count = bufferedReader.read(buff)) != -1){
            System.out.println(new String(buff,0,count));
        }*/

        //2.第二种方法:一行一行的读
        String line = null;
        while ((line = bufferedReader.readLine()) != null){
            System.out.println(line);
        }
        bufferedReader.close();
    }
}
package com.itheima;

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

/**
 * 使用BufferedWriter写入文本文件
 * bufferedWriter.newLine();//写入一个换行符
 */
public class TestBufferedWriter {

    public static void main(String[] args) throws Exception{

        //1.创建BufferedWriter文件
        FileWriter fileWriter = new FileWriter("E:\\5.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        //2.写入
        for (int i = 0; i < 10; i++) {
            bufferedWriter.write("发生了什么事了!");
            bufferedWriter.newLine();//写入一个换行符
            bufferedWriter.flush();
        }
        //3.关闭
        bufferedWriter.close();
    }
}

7.4、PrintWriter

将对象的格式表示打印到文本输出流。

PrintStream在输出字符,将字符转换为字节时采用的是系统默认的编码格式,这样当数据传输另一个平台,而另一个平台使用另外一个编码格式解码时就会出现问题,存在不可控因素。而PrintWriter可以在传入Writer时可由程序员指定字符转换为字节时的编码格式,这样兼容性和可控性会更好。

package com.itheima;

import java.io.PrintWriter;

/**
 * 使用TestPrintWriter来把打印内容写入磁盘
 */
public class TestPrintWriter {

    public static void main(String[] args) throws Exception{

        //1.创建打印流
        PrintWriter printWriter = new PrintWriter("E:\\6.txt");

        //2.打印
        printWriter.println(12);
        printWriter.println(true);
        printWriter.println(3.14);
        printWriter.println('a');

        //3.关闭
        printWriter.close();
    }
}

7.5、转换流

InputStreamReader / OutputStreamWriter

InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

为了最大的效率,请考虑在BufferedReader中包装一个InputStreamReader。

例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

为了最大的效率,请考虑在BufferedWriter中包装一个OutputStreamWriter,以避免频繁的转换器调用。 例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

package com.itheima;

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

/**
 * 使用InputStreamReader读取文件,指定使用的编码
 */
public class TestInputStreamReader {

    public static void main(String[] args) throws Exception{

        //1.创建InputStreamReader类
        FileInputStream fileInputStream = new FileInputStream("E:\\write.txt");
        InputStreamReader isr = new InputStreamReader(fileInputStream,"utf-8");

        //2.读取文件
        int data = 0;
        while ((data = isr.read()) != -1){
            System.out.print((char)data);
        }
        //3.关闭
        isr.close();
    }
}
package com.itheima;

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

/**
 * 使用OutputStreamWriter 写入文件,指定使用的编码
 */
public class TestOutputStreamWriter {

    public static void main(String[] args) throws Exception{

        //1.创建OutputStreamWriter对象
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\info.txt");
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");

        //2.写入
        for (int i = 0; i < 10; i++) {
            outputStreamWriter.write("可恶的假面骑士\r\n");
            outputStreamWriter.flush();
        }
        //3。关闭
        outputStreamWriter.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值