Java学习与复习笔记--字节输入流&字符输入流

字节输入流_InputStream类和FileInputStream:

/*
* java.io.InputStream:字节输入流
* 这个抽象类是表示输入字节流的所有类的超类。
* 定义了所有子类共性的方法:
* int read() :从输入流读取数据的下一个字节。
* int read(byte[] b) :从输入流读取一些字节数,并将它们存储到缓冲区 b 。
* void close() :关闭此输入流并释放与流相关联的任何系统资源
* java.io.FileInputStream extends InputStream
* FileInputStream:文件字节输入流
* 作用:把硬盘文件中的数据读取到内存中使用
* 构造方法:
* FileInputStream(String name)
* FileInputStream(File file)
* 参数:读取文件的数据源
* String name:文件的路径
* File file:文件
* 构造方法的作用:
* 1.会创建一个FileInputStream对象
* 2.会把FileInputStream对象指定构造方法中要读取的文件
*
* 读取数据的原理(硬盘-》内存):
*   java程序--》JVM--》OS--》OS读取数据的方法--》读取文件
* 字节输入流的使用步骤(重点):
*   1.创建FileInputStream对象,构造方法中绑定要读取的数据源
*   2.使用FileInputStream对象中的read,读取文件
*   3.流使用完释放资源。
*
 */
public class Demo04InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("FileAndIO\\a.txt");
        //读取文件中的一个字节并返回,读取到文件末尾会返回-1
        /*int len = fis.read();
        System.out.println(len);//97 a
        len = fis.read();
        System.out.println(len);//98 b
        len = fis.read();
        System.out.println(len);//99 c
        len = fis.read();
        System.out.println(len);//-1,末尾了*/
        /*
        * 以上读取文件是一个重复的过程,所以可以使用循环优化
        * 不知道文件中有多少字节,使用while循环
        * while循环结束条件,读取到-1的时候结束
        * 布尔表达式(len=fis.read())!=-1
        * 1.fis.read():读取一个字节
        * 2.len=fis.read():把读取到的字节赋值给变量len
        * 3.(len=fis.read())!=-1:判断变量len是否不等于-1
        * */
        int len=0;
        while((len=fis.read())!=-1){
            System.out.print((char)len);//abc
        }
        fis.close();
    }
}

字节输入流一次读取多个字节的方法:

/*
* 字节流一次读取多个字节的方法:
* int read(byte[] b) :从输入流读取一些字节数,并将它们存储到缓冲区 b 。
* String类的构造方法:
* String(byte[] bytes):把字节数组转换为字符串
* String(byte[] bytes, int offset, int length):把字节数组的一部分转换为字符串,offset:数组开始的索引,length:转换的字节个数
* 数组:缓冲作用,存储每次读取到的多个字节,数组的长度一般定义为1024(1kb)或者1024的整数倍
* 方法返回值:int:每次读取的有效字节个数
* new byte[5]:一次读取五个字节
 * */
public class Demo05InputStream {
    public static void main(String[] args) throws IOException {
        //1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis=new FileInputStream("FileAndIO\\b.txt");
        /*byte[] bytes=new byte[2];
        int len = fis.read(bytes);//len:读取的有效字节个数
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));//[65, 66]
        System.out.println(new String(bytes));//AB
        len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));//[67, 68]
        System.out.println(new String(bytes));//CD
        len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));
        System.out.println(new String(bytes));//EB*/
        //以上读取时一个重复的过程,可以使用循环优化
        //不知道文件中有多少字节,所以使用while循环
        //while循环结束的条件,读取到-1结束
        byte[] bytes=new byte[1024];//存储读取到的多个字节
        int len=0;
        while((len=fis.read(bytes))!=-1){
            //String(byte[] bytes, int offset, int length):把字节数组的一部分转换为字符串,offset:数组开始的索引,length:转换的字节个数
            System.out.println(new String(bytes,0,13));
        }
        fis.close();
    }
}

练习_文件复制:

/*
* 文件复制练习:一读一写
* 明确:我们要复制的数据源
*       数据的目的地
* 文件复制的步骤:
* 1.创建字节输入流对象,构造方法中绑定要读取的数据源
* 2.创建一个字节输出流对象,构造方法中绑定要写入的目的地
* 3.使用字节输入流对象中的方法read读取文件
* 4.使用字节输出流中的方法write,把读取到的文件写入到目的地文件夹中
* 5.释放资源
* */
public class Demo06FileCopy {
    public static void main(String[] args) throws IOException {
        long s=System.currentTimeMillis();
        FileInputStream fis=new FileInputStream("FileAndIO\\b.txt");
        FileOutputStream fos=new FileOutputStream("d:\\c.txt");
        /*//一次读取一个字节写入一个字节的方式
        int len=0;
        while((len=fis.read())!=-1){
            fos.write(len);
        }*/
        //使用数组缓冲读取多个字节写入多个字节的方式
        byte[] bytes=new byte[1024];
        int len=0;//每次读取的有效字节个数
        while((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //释放资源,先关闭写的,后关闭读的;如果写完了,肯定读完了
        fos.close();
        fis.close();
        long e=System.currentTimeMillis();
        System.out.println("复制文件共耗时:"+(e-s)+"毫秒");
    }
}

使用字节流读取中文的问题:

/*
* 使用字节流读取中文文件
* 1个中文:
*   GBK:占用2个字节
*   UTF-8:占用3个字节
*   */

字符输入流_Reader类&FileRead:

/*
* java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类
* 共性的成员方法:
* int read() 读取单个字符并返回。
* int read(char[] cbuf) :一次读取多个字符,将字符读入数组
* void close() :释放资源
* java.io.FileReader extends InputStreamReader extends Reader
* FileReader:文件字符输入流
* 作用:把硬盘文件中的数据以字符的方式读取到内存中
* 构造方法:
* FileReader(String fileName)
* FileReader(File file)
* 参数:读取文件的数据源
* String name:文件的路径
* File file:文件
* FileReader构造方法的作用:
* 1.创建FileReader对象
* 2.会把FileReader对象指向所要读取的对象
* 字符输入流的使用步骤(重点):
* 1.创建FileReader对象,构造方法中绑定要读取的数据源
* 2.使用FileReader对象中的方法read读取文件
* 3.释放资源*/
public class Demo01Reader {
    public static void main(String[] args) throws IOException {
        //1.创建FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr=new FileReader("FileAndIO\\c.txt");
        //2.使用FileReader对象中的方法read读取文件
        /*int len=0;
        while((len=fr.read())!=-1){
            System.out.print((char)len);//你好abc123***&&&
            }*/
        //int read(char[] cbuf) :一次读取多个字符,将字符读入数组
        char[] cs=new char[1024];//存储读取到的多个字符
        int len=0;//记录的是每次读取的有效字符个数
        while((len=fr.read(cs))!=-1){
            /*
            * String类的构造方法:
            * String(char[] value):把字符数组转换为字符串
            * String(char[] value, int offset, int count):把字符数组的一部分转换为字符串 offset数组的开始索引,count转换的个数
             * */
            System.out.println(new String(cs,0,len));
        }
        fr.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值