JAVA 输入输出 读文件(二)

本文详细介绍了Java中的IO流,包括字节流和字符流的分类,以及输入输出流的基本概念。通过示例代码展示了如何使用FileReader进行文件读取,从1.0到4.0逐步优化读取过程,包括单个字符读取和使用字符数组批量读取。此外,还强调了异常处理和资源关闭的重要性。
摘要由CSDN通过智能技术生成

1、流的分类及注意事项

  • 乱码问题就是字节数据没有选择正确的编码方式来显示成字符。

  • 从本质上来讲,写数据(即输出)的时候,字节也好,字符也好,本质上都是没有标识符的,需要去指定编码方式。

  • 什么是字节流?

    字节流–传输过程中,传输数据的最基本单位是字节的流。

    什么是字符流?

    字符流–传输过程中,传输数据的最基本单位是字符的流。

字节:8 bit,图片等非文本一般都使用字节流方式

字符:(16bit)UTF-8方式编码的字符,一个英文字符需要一个字节,一个中文需要三个字节。

2、图表理解输入输出流

在这里插入图片描述

在这里插入图片描述

3、IO 流体系

在这里插入图片描述

4、读一个文件的代码

读写文件分4步
1、实例化File对象,指明要操作的文件
2、提供具体的流
3、数据读入
4、流的关闭

package test;

import org.junit.Test;

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

/**一、流的分类
 * 1、操作数据单位:字节流、字符流
 * 2、数据流向:输入流、输出流
 * 3、流的角色:节点流、处理流
 *二、体系结构
 *抽象类                        节点流(或文件流)               缓冲流(处理流的一种)
 * InputStream                  FileInputStream              BufferedInputStream
 * OutPutStream                 FileOutPutStream             BufferedOutPutStream
 * Reader                       FileReader                   BufferedReader
 * Writer                       FileWriter                   BufferedFileWriter
 */
public class TestReaderWriter {

    @Test
    /**
     * 将文件内容读入程序中,并输出到控制台1.0
     * 实现
     * 读文件分4步
     * 1、实例化File对象,指明要操作的文件
     * 2、提供具体的流
     * 3、数据读入
     * 4、流的关闭
     */
    public void test1() throws IOException {
        //相对于当前Module
        //1、实例化File对象,指明要操作的文件
        File  file = new File("hello.txt");
        //ystem.out.println(file.getPath());

        //2、提供具体的流
        FileReader fileReader = new FileReader(file);

        //3、数据读入
        System.out.println("1.0文件输出内容:");
        int data = fileReader.read();
        while (data != -1){
            System.out.print((char)data);
            data =fileReader.read();
        }

        //4、流的关闭
        fileReader.close();
    }
    @Test
    /**
     *将文件内容读入程序中,并输出到控制台2.0
     * 优化
     * 说明:
     * 1、read() 的理解:返回读入的一个字符。如果达到文件尾,返回-1
     * 2、异常处理:为保证流资源一定可以执行流关闭操作。需要try-catch-finally 处理
     * 3、读入的文件一定要存在,否则会报错
     */
    public void test2()  {
        System.out.println();
        System.out.println("============================");
        FileReader fileReader = null;
        try {
            //相对于当前Module
            //1、实例化File对象,指明要操作的文件
            File  file = new File("hello.txt");
            //ystem.out.println(file.getPath());

            //2、提供具体的流
            fileReader = new FileReader(file);

            //3、数据读入
            System.out.println("2.0文件输出内容:");
            int data = fileReader.read();
            while (data != -1){
                System.out.print((char)data);
                data =fileReader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                //4、流的关闭
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @Test
    /**
     * 将文件内容读入程序中,并输出到控制台3.0
     * 优化
     * 使用一个数组,一个可读多个字符
     * 使用了for循环
     */
    public void test3(){
        FileReader fileReader = null;
        try {
            //1、 File 类的实例化
            File file = new File("hello.txt");

            //2、FileReader 流的实例化
            fileReader = new FileReader(file);

            //3、读入的操作
            System.out.println("4.0文件输出内容:");
            char[] cbuf =new char[5];
            int len;
            while((len = fileReader.read(cbuf)) != -1){
                for (int i = 0; i < len; i++) {
                    System.out.print(cbuf[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                //4、流的关闭
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    @Test
    /**
     * 将文件内容读入程序中,并输出到控制台4.0
     * 优化
     * 使用一个数组,一个可读多个字符
     * 使用数组方式是
     */
    public void test4(){
        FileReader fileReader = null;
        try {
            //1、 File 类的实例化
            File file = new File("hello.txt");

            //2、FileReader 流的实例化
            fileReader = new FileReader(file);

            //3、读入的操作
            System.out.println("4.0文件输出内容:");
            char[] cbuf =new char[5];
            int len;
            while((len = fileReader.read(cbuf)) != -1){
                //使用数组方式
                String str = new String(cbuf,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                //4、流的关闭
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

1.0文件输出内容:
hello Master
love
============================

2.0文件输出内容:
hello Master
love
4.0文件输出内容:
hello Master
love
4.0文件输出内容:
hello Master
love

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值