09_3_IO字节输入流

IO字节输入流

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
小贴士:
    close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.5 FileInputStream类
java.io.FileInputStream 类是文件输入流,从文件中读取字节。
构造方法
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系
统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件
系统中的路径名 name命名。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。
构造举例,代码如下:

public class FileInputStreamConstructor throws IOException{
    public static void main(String[] args) {
     // 使用File对象创建流对象    
        File file = new File("a.txt");
        FileInputStream fos = new FileInputStream(file);
     
        // 使用文件名称创建流对象
        FileInputStream fos = new FileInputStream("b.txt");
    }
}

FileOutputStream读取一个字节

package com.itheima.demo02.InputStream;

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

/*
    java.io.InputStream 抽象类是表示字节输入流的所有类的超类
    定义了所有子类共性的方法:
        public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
        public abstract int read() : 从输入流读取数据的下一个字节。
        public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
        long skip(long n) 跳过并从输入流中丢弃 n字节的数据。  
    java.io.FileInputStream extends InputStream
    FileInputStream:文件字节输入流
    作用:把硬盘文件中的数据读取到内存中使用

    构造方法:
        FileInputStream(File?file) :
        FileInputStream(String?name) :
        参数:
            String name:文件的路径
            File file:文件
         构造方法的作用:
            1.会创建一个FIleInputStream对象
            2.会把FileInputStream对象指定构造方法中要读取的文件
    读取数据的原理(硬盘-->内存):
        java程序-->JVM-->OS-->OS读取数据的方法-->读取文件
    字节输入流的使用步骤(重点):
        1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        2.使用FileInputStream对象中的方法read,读取文件
        3.释放资源


 */
public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        /*
            从文件”file.dat”文件中读出第 10 个字节到变量 c 中
        */
        FileInputStream in=new FileInputStream("file.dat");
        in.skip(9);
        int c=in.read();


        //1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt");
        //2.使用FileInputStream对象中的方法read,读取文件
        //int read()读取文件中的一个字节并返回,读取到文件末尾返回-1
        int len = 0;//记录读取到的字节
        /*
            布尔表达式(len=fis.read())!=-1
                1.fis.read():读取到一个字节
                2.len = fis.read():把字节赋值给变量len
                3.(len=fis.read())!=-1:判断len是否不等于-1

         */
        while ((len = fis.read()) != -1) {
            System.out.println((char) len);
        }
        /*
            指针不对
         */
        while (fis.read() != -1) {
            System.out.println(fis.read());
        }
        //3.释放资源
        fis.close();
    }
}

FileOutputStream读取多个字节

package com.itheima.demo02.InputStream;

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

/*
    字节输入流一次读取多个字节的方法:
        public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
    明确两件事:
        1.方法的参数byte[]的作用
            起到缓冲作用,存储每次读取到的多个字节
            数组的长度定义为1024(1kb)或者1024的倍数
        2.方法的返回值int是什么
            每次读取的有效字节个数
    String类的构造方法
        String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
        String(byte[] bytes, int offset, int length) 构造一个新的String由指定用指定的字节的数组解码charset 。


 */
public class Demo02InputStream {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("09_IOAndProperties\\b.txt");
        //使用FileInputStream对象中的方法read读取文件
        //int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
/*

        错误数据 4 ,是由于最后一次读取时,只读取一个字节 5 ,数组中,上次读取的数据没有被完全替换,所以要通过 len ,获取有效的字节,代码使用演示:
        byte[]bytes = new byte[2];

        int len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));//49 50
        System.out.println(new String(bytes));//12
        len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));//51 52
        System.out.println(new String(bytes));//34
        len = fis.read(bytes);
        System.out.println(len);//1
        System.out.println(Arrays.toString(bytes));//53 52
        System.out.println(new String(bytes));//54
        len = fis.read(bytes);
        System.out.println(len);//-1
        System.out.println(Arrays.toString(bytes));//49 50
        System.out.println(new String(bytes));//54
*/
        /*
            代码重复,循环优化

         */
        byte[] bytes = new byte[1024];
        int len = 0;
        //通过 len ,获取有效的字节
        while ((len = fis.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));
        }
        //释放资源
        fis.close();
    }
}

字节流练习:图片复制

 

package com.itheima.com.itheima.demo03.CopyFile;

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

/*
    文件复制练习:一读一写
    明确:
        数据源:c:\\1.jpg
        目的地:d:\\1.jpg
    文件复制的步骤:
        1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
        2.创建一个字节输出流对象,构造方法中绑定要写入得目的
        3.使用字节输入流对象中的方法read读取文件
        4.使用字节输出流中的方法write,把读到的字节写入到目的地的文件中
        5.释放资源
 */
public class Demo01CopyFile {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        //1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("C:\\Users\\Ao\\Desktop\\day08【File类、递归】-笔记.pdf");
        //2.创建一个字节输出流对象,构造方法中绑定要写入得目的
        FileOutputStream fos = new FileOutputStream("D:\\day08【File类、递归】-笔记.pdf");
        byte[] b = new byte[1024];
        int len = 0;
        //3.使用字节输入流对象中的方法read读取文件
        while ((len = fis.read(b)) != -1) {
            //4.使用字节输出流中的方法write,把读到的字节写入到目的地的文件中
            fos.write(b, 0, len);
        }
        //5.释放资源(先关写的,后关读的,如果写完了,肯定读取完毕了
        fos.close();
        fis.close();
        long end = System.currentTimeMillis();
        System.out.println(end - start);//16
    }

}

 字节流中读取中文问题(使用字符流读取包含中文数据)

package com.itheima.com.itheima.Demo04.Reader;

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

/*
    使用字节流读取中文文件
    1个中文:
        GBK:占用两个字节
        UTF-8:占用3个字节
 */
public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt");//你好
        int len = 0;
        while ((len = fis.read()) != -1) {
            System.out.println(len);
//            196
//            227
//            186
//            195
        }
        fis.close();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值