IO字节流(2)

读取字节数据

读取数据的原理(硬盘-->内存)

java程序-->JVM-->OS-->OS读取数据的方法-->读取文件。

字节输入流的使用步骤(重点)

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源。
  2. 使用FileInputStream对象中的方法read,读取文件。
  3. 释放资源。

代码演示:

import java.io.FileInputStream;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //创建一个对象
        FileInputStream input = new FileInputStream("C:\\a\\b.txt");
        //使用read方法读取数据。
//        int s = input.read();
//        System.out.println(s);

        //使用循环读取文件全部内容。
        int len = 0;
        while ((len = input.read()) != -1){
            System.out.println(len);
        }
        //释放资源
        input.close();
    }
}

布尔表达式(len = input.read())!=-1

  1. input.read():读取一个字节。
  2. len = input.read():把读取到的字节赋值给变量len。
  3. (len = input.read())!=-1:判断变量len是否不等于-1。

字节流一次读取多个字节

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

​ int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。

明确两件事:

  1. 方法的参数byte[]的作用?
  2. 方法的返回值int是什么?

String类的构造方法

​ String(byte[] bytes):把字节数组转换为字符串。

​ String(byte[] bytes,int offset, int length):把字节数组的一部分转化为字符串offset:数组的开始索引 length:转换的字节个数。

代码演示:

package day6;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,构造方法中绑定要读取的数据源。
        FileInputStream fis = new FileInputStream("C:\\a\\b.txt");
        //使用FileInputStream对象中的方法read读取文件。
        //int read(byte[] b) 从输出流中读取一定数量的字节,并将其存储在缓冲区数组b中。
        byte[] bytes = new byte[2];
        int len = fis.read(bytes);
        System.out.println(len);
        System.out.println(Arrays.toString(bytes));
        System.out.println(new String(bytes));
        //释放资源
        fis.close();
    }
}

发现以上读取时有一个重复的过程,可以使用循环有话,不知道文件中有多少个字节,所以使用while循环,while循环结束的条件,读取到-1结束。

package day6;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream(new File("C:\\a\\b.txt"));
        byte[] bytes = new byte[1024];
        int len;
        while((len = fis.read(bytes))!=-1){
            System.out.println(new java.lang.String(bytes,0,len));
        }
    }
}

练习:文件复制

目的:把一个文件复制到另外一个地方。

原理:其实就是读取一个文件,然后将其写入到另外一个地方。

代码演示:

package day6;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class lianxi01 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fis = new FileOutputStream("C:\\a\\b\\e.txt");
        FileInputStream fis2 = new FileInputStream(new File("C:\\a\\b.txt"));
//        int len;
//        while((len = fis2.read())!=-1){
//            fis.write(len);
//        }

        //使用数组缓冲读取多个字节,写入多个字节。
        byte[] bytes = new byte[1024];
        int len;
        while((len = fis2.read())!=-1){
            fis.write(bytes,0,len);
        }
        
        fis.close();
        fis2.close();
    }
}
posted @ 2020-11-07 02:05  小明-o3rr0r  阅读(78)  评论(0编辑  收藏  举报