IO流-字节流

概述

  • IO流:存储和读取数据的解决方案
  • I:input
  • O:output
  • 作用:用于读写文件中的数据(本地文件,或网络中的数据)

 

分类

按流的方向

  • 输入流(文件 -> 程序)
  • 输出流(程序 -> 文件)

按操作文件类型

  • 字节流 -> 所有类型文件
    • InputStream 字节输入流
      • FileInputStream 操作本地文件的字节输入流
    • OutputStream 字节输出流
      • FileOutputStream 操作本地文件的字节输出流
  • 字符流 -> 纯本文文件 .txt(用windows系统自带的记事本打开并且看得懂的文件,eg:txt文件,md文件,xml文件,lrc文件)
    • Reader 字符输入流
    • Writer 字符输出流

 

FileOutputStream

  • 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中,是字节流的基本流。
     
FileOutputStream书写步骤
  • 创建对象(文件存在,文件不存在,追加写入)
    • 细节1:参数是字符串表示的路径或者File对象都是可以的
    • 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
    • 细节3:如果文件已经存在,会清空文件
  • 写出数据(写出整数,写出字节数组,换行写)
    • 细节:write方法的参数是整数,但是实际上写到本地的是整数在ASCII上对应的字符
  • 释放资源:关闭通道
    • 细节:每次使用完流之后都要释放资源
public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //需求:写出一段文字到本地文件中(暂时不写中文)
        //1。创建对象
        FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/ppp.txt");

        //2。写出数据
        //a
        fos.write(97);

        //3.释放资源
        fos.close();
    }
}

 

FileOutputStream写数据的3种方式
方法名称说明
void write(int b)一次写一个字节流数据
void write(byte[] b)一次写一个字节流数组
void write(byte[] b, int off,int len)一次写一个字节流数组的部分数据
public class ByteStreamDemo3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/ppp.txt");

        /*
        //a
        fos.write(97);
        //b
        fos.write(98);*/

        /*
        byte[] bytes = {97, 98, 99, 100, 101};
        //abcde
        fos.write(bytes);*/

        byte[] bytes = {97, 98, 99, 100, 101};
        //bc
        fos.write(bytes, 1, 2);

        fos.close();
    }
}

 

FileOutputStream写数据的两个小问题
  • 换行写 --> 换行符
    • windows: \r\n
    • Linux: \n
    • Mac: \r
  • 续写–> 打开续写开关即可,开关在创建对象的第二个参数。
    • 默认false:表示关闭续写,此时创建对象会清空文件
    • 手动传递true:表示打开续写,此时创建对象不会情况文件
public class ByteStreamDemo4 {
    public static void main(String[] args) throws IOException {
        //续写
        FileOutputStream fos = new FileOutputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt", true);

        String str1 = "laoniangzuimei";
        byte[] bytes1 = str1.getBytes();
        fos.write(bytes1);

        //换行符
        String wrap = "\r";
        byte[] bytes = wrap.getBytes();
        fos.write(bytes);

        String str2 = "520";
        byte[] bytes2 = str2.getBytes();
        fos.write(bytes2);

        fos.close();
    }
}

 

FileInputStream

  • 操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
     
FileInputStream书写步骤
  • 创建字节流输入对象
    • 细节:如果文件不存在,就直接报错
  • 读数据
    • 细节1: :一次读一个字节,读出来的是数据在ASCII上对应的数组
    • 细节2:读到文件末尾了,read方法返回-1
  • 释放资源
    • 细节:每次使用完流之后都要释放资源
public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //1。创建字节流对象
        //ab
        FileInputStream fis = new FileInputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt");

        int b1 = fis.read();
        //97
        System.out.println(b1);

        int b2 = fis.read();
        //b
        System.out.println((char) b2);

        int b3 = fis.read();
        //-1
        System.out.println(b3);

        fis.close();
    }
}

思考: 为什么输出流中,文件不存在的时候会创建,而输入流中,文件不存在是报错?
因为输出流中创建新的文件,将数据写入到文件当中
而输入流创建出来的文件是没有数据的,没有任何意义。
所以Java就没有设计这种无意义的逻辑,文件不存在直接报错
程序中最重要的是:数据

 

FileInputStream循环读取
public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("/Users/jessy/Desktop/offer50/aaa/qqq.txt");

        //循环读取
        int b;
        while ((b = fis.read()) != -1) {
            System.out.print((char) b);

        }
        fis.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值