JavaSE-I/O流

字符流和字节流的区别

在这里插入图片描述

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。

字节流与字符流对比

  1. 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  2. 字节流默认不使用缓冲区;字符流使用缓冲区。
  3. 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。

FileReader

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;


public class FileReader_test {

    public static void main(String[] args) {
        File file = new File("hello.txt"); //D:\JavaSE基础学习\IO流\hello.txt
        System.out.println(file.getAbsolutePath());
        File file1 = new File("day09\\hello.txt"); //D:\JavaSE基础学习\IO流\day09\hello.txt
        System.out.println(file1.getAbsolutePath());
    }


    //将hello.txt文件读入程序中,并输出
    @Test
    public void FileReader_test1() {
        FileReader fr = null;
        try {
            //1.实例化File类的对象,指明要操作的文件
            File file = new File("./src/hello.txt");
            //2.提供具体的流
            fr = new java.io.FileReader(file);
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //对read()操作升级:使用read的重载方法
    @Test
    public void FileReader_test2() {
        java.io.FileReader fr = null;
        try {
            //1.File类的实例化
            File file = new File("./src/hello.txt");

            //2.FileReader流的实例化
            fr = new java.io.FileReader(file);

            //3.读入的操作
            //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
            char[] cbuf = new char[5];
            int len;
            while ((len = fr.read(cbuf)) != -1) {
                //方式一:
                //错误的写法
//                for(int i = 0;i < cbuf.length;i++){
//                    System.out.print(cbuf[i]);
//                }
                //正确的写法
//                for(int i = 0;i < len;i++){
//                    System.out.print(cbuf[i]);
//                }
                //方式二:
                //错误的写法,对应着方式一的错误的写法
//                String str = new String(cbuf);
//                System.out.print(str);
                //正确的写法
                String str = new String(cbuf, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                //4.资源的关闭
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }
}






标题FileWriter

import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/*

    从内存中写出数据到硬盘的文件里。

    说明:
    1. 输出操作,对应的File可以不存在的。并不会报异常
    2.
         File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
         File对应的硬盘中的文件如果存在:
                如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖
                如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容


 */
public class FileWriter_test {
    public static void main(String[] args) {
        return;
    }

    @Test
    public void FileWriter_test1() {
        FileWriter fw = null;

        //1.提供File类的对象,指明写出到的文件
        File file = new File("./src/hello1.txt");
        //2.提供FileWriter的对象,用于数据的写出
        try {
            fw = new FileWriter(file, true);
            //3.写出的操作
            fw.write("I have a dream!\n");
            fw.write("you need to have a dream!");
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            //4.流资源的关闭
            if (fw != null) {

                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

标题FileInputStream和FileOutputStream

实现图片的复制

import org.junit.Test;

import java.io.*;

public class FileInputOutputStream_test {

    //实现对图片的复制操作
    @Test
    public void FileInputOutputStream_test() {
        FileInputStream ins = null;
        FileOutputStream outs = null;

        File f1 = new File("./src/1.jpg");
        File f2 = new File("./src/2.jpg");

        try {
            ins = new FileInputStream(f1);
            outs = new FileOutputStream(f2);

            byte buffer[] = new byte[10];
            int len;
            while ((len = ins.read(buffer)) != -1) {
                outs.write(buffer, 0, len);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ins != null) {
                try {
                    ins.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outs != null) {
                try {
                    outs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


}


  1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  2. 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理
  3. 使用字节流FileInputStream处理文本文件,可能出现乱码。

缓冲流

  • BufferedInputStream
  • BufferedOutputStream
  • BufferedReader
  • BufferedWriter
import org.junit.Test;

import java.io.*;

public class FileInputOutputStream_test {

    //BufferedInputStream
    //BufferedOutputStream
    //实现对图片的复制操作
    @Test
    public void FileInputOutputStream_test() {
        FileInputStream ins = null;
        FileOutputStream outs = null;

        File f1 = new File("./src/1.jpg");
        File f2 = new File("./src/2.jpg");

        try {
            ins = new FileInputStream(f1);
            outs = new FileOutputStream(f2);

            byte buffer[] = new byte[10];
            int len;
            while ((len = ins.read(buffer)) != -1) {
                outs.write(buffer, 0, len);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ins != null) {
                try {
                    ins.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outs != null) {
                try {
                    outs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    
    //BufferedReader
    //BufferedWriter
    @Test
    public void testFileInputStream() {
        FileInputStream fis = null;
        try {
            //1. 造文件
            File file = new File("./src/hello.txt");

            //2.造流
            fis = new FileInputStream(file);

            //3.读数据
            byte[] buffer = new byte[5];
            int len;//记录每次读取的字节的个数
            while((len = fis.read(buffer)) != -1){

                String str = new String(buffer,0,len);
                System.out.print(str);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fis != null){
                //4.关闭资源
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }
}


转换流

InputStreamReader:将一个字节的输入流转换为字符的输入流
OutputStreamWriter:将一个字符的输出流转换为字节的输出流

/*
 * 处理流之二:转换流的使用
 * 1.转换流:属于字符流
 *   InputStreamReader:将一个字节的输入流转换为字符的输入流
 *   OutputStreamWriter:将一个字符的输出流转换为字节的输出流
 *
 * 2.作用:提供字节流与字符流之间的转换
 *
 * 3. 解码:字节、字节数组  --->字符数组、字符串
 *    编码:字符数组、字符串 ---> 字节、字节数组

 */

import org.junit.Test;

import java.io.*;

public class InputStreamReader_test {

    /*
    此时处理异常的话,仍然应该使用try-catch-finally
    InputStreamReader的使用,实现字节的输入流到字符的输入流的转换
     */
    @Test
    public void test1() throws IOException {

        FileInputStream fis = new FileInputStream("./src/hello.txt");
        //InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集
        //参数2指明了字符集,具体使用哪个字符集,取决于文件helllo.txt保存时使用的字符集
        InputStreamReader isr = new InputStreamReader(fis,"gbk");//使用系统默认的字符集

        char[] cbuf = new char[20];
        int len;
        while((len = isr.read(cbuf)) != -1){
            String str = new String(cbuf,0,len);
            System.out.print(str);
        }

        isr.close();

    }

    /*
    此时处理异常的话,仍然应该使用try-catch-finally

    综合使用InputStreamReader和OutputStreamWriter
     */
    @Test
    public void test2() throws Exception {
        //1.造文件、造流
        File file1 = new File("./src/hello.txt");
        File file2 = new File("./src/hello4.txt");

        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);

        InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");

        //2.读写过程
        char[] cbuf = new char[20];
        int len;
        while((len = isr.read(cbuf)) != -1){
            osw.write(cbuf,0,len);
        }

        //3.关闭资源
        isr.close();
        osw.close();


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值