Java入门(三十九)

字节流读数据(一次一个)

  • 需求:把文件fos.txt中的内容读取出来在控制台输出
  • FileInputStream 从文件系统中的文件获取输入字节在这里插入图片描述
  • 构造方法
    在这里插入图片描述
  • FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统的路径名name命名。
  • 使用字节输入流读数据的步骤:
  1. 创建字节输入流对象
  2. 调用字节输入流对象的读数据方法
  3. 释放资源
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
        //调用字节输入流读数据方法
        //int read() ,从该输入流读取一个字节的数据
        int by = fis.read();
        System.out.println(by);
        //释放资源
        fis.close();
    }
}

在这里插入图片描述

  • 输出a
        System.out.println((char)by);
  • 第二次读取数据
        //第一次读取数据
        int by = fis.read();
        System.out.println(by);
        System.out.println((char)by);
        //第二次读取数据
        by = fis.read();
        System.out.println(by);
        System.out.println((char)by);

在这里插入图片描述

  • 两次读取数据的步骤都是一样的,能否用循环改进?如果文件到达末尾,他的返回值就是-1
        int by = fis.read();
        while( by != -1){
            System.out.println((char)by);
        }
  • 这次会输出一个死循环
    在这里插入图片描述
  • 因此我们得在循环体内再读一遍字节,才会往下一个字节去走
        int by = fis.read();
        while( by != -1){
            System.out.print((char)by);
            by = fis.read();
        }

在这里插入图片描述

  • 优化上面的程序
        int by;
        while ((by = fis.read()) != -1){       //fis.read() 读数据 ;by=fis.read() 把读取到的数据赋值给by ;用 by != -1 判断读取到的数据是否是-1
            System.out.print((char)by);
        }

复制文本文件

  • 复制”窗里窗外.txt” 文件。
  • 分析:复制文本文件,其实就是把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
  • 数据源 “基础语法/src/io/窗里窗外.txt” – 读数据–InputStream–但因为他是个抽象类所以最终选择FileInputStream。
  • 目的地"基础语法/src/io/窗里窗外1.txt" – 写数据–OutputStream–FileOutputStream
  • 思路:
  1. 根据数据源创建字节输入流对象
  2. 根据目的地创建字节输出流对象
  3. 读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
  4. 释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyTxtDemo {
    public static void main(String[] args) throws IOException{
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("基础语法/src/io/窗里窗外.txt");
        //根据目的地创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/窗里窗外1.txt");
        //读写数据,复制文本文件
        int by;
        while((by=fis.read())!=-1){
            fos.write(by);
        }
        fos.close();
        fis.close();
    }
}

字节流读数据(一次读一个字节数组数据)

  • 需求:把文件fos.txt中的内容读取出来输出
  • 使用字节输入流读数据的步骤:
  1. 创建字节输入流对象
  2. 调用字节输入流对象的读数据方法
  3. 释放资源
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws IOException{
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
        //调用字节输入流对象的读数据方法
        byte[] bys = new byte[5];
        //第一次读取数据
        int len = fis.read(bys);  //实际读取的字节数
        System.out.println(len);
        System.out.println(new String(bys));
        //第二次读取数据
        len = fis.read(bys);
        System.out.println(len);
        System.out.println(new String(bys,0,len));
        //释放资源
        fis.close();
    }
}

在这里插入图片描述

  • 当实际读取的数为-1的时候,说明他已经到达末尾了。
  • 使用循环改进
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo03 {
    public static void main(String[] args) throws IOException{
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("基础语法/src/io/fos.txt");
        byte[] bys = new byte[1024]; // 一般给1024及其整数倍
        int len;
        while((len=fis.read(bys))!=-1){
            System.out.println(new String(bys,0,len));
        }
        //释放资源
        fis.close();
    }
}

复制图片

  • 将1.jpg复制到2.jpg
  • 思路:
  1. 根据数据源创建字节输入流对象
  2. 根据目的地创建字节输出流对象
  3. 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
  4. 释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyJpgDemo {
    public static void main(String[] args) throws IOException{
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("基础语法/src/io/1.jpg");
        //根据目的地创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("基础语法/src/io/2.jpg");
        //读写数据,复制图片
        byte[] bys = new byte[1024];
        int len;
        while((len=fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值