Java—— IO流 第一期

什么是IO流

存储和读取数据的解决方案
I:input
O:output
流:像水流一样传输数据

IO流的作用

用于读写数据(本地文件,网络)

IO流的分类

按照流向分类

输出流:程序 --> 文件
输入流:文件 --> 程序

按照操作文件的类型分类
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件(用windows系统自带的记事本打开并且能读懂的文件,例如txt文件,md文件,xml文件,lrc文件等)

IO流的继承体系

 

字节流的实现类

操作本地文件的字节输出流FileOutputStream

可以把程序中的数据写到本地文件中

 书写步骤及细节

1.创建字节输出流对象

        参数是字符串表示的路径或者File对象都是可以的
        如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
        如果文件已经存在,则会清空文件重新写
2.写数据

        使用write方法,参数为整数,但实际上写到本地文件中的是整数在ASCII上对应的字符
3.释放资源 

        每次使用完流之后都要释放资源 

代码演示

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

public class Test1 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("day04\\a.txt");
        fos.write(97);
        fos.close();

    }
}

如何一次写入多个数据
方法名称说明
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据

代码演示

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

public class Test2 {
    public static void main(String[] args) throws IOException {

        //一次写一个字节数组数据
        //有两种定义数据的形式
        //直接定义byte数组,将想写入的数据的ASCII码存入数组
        FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");
        byte[] b1 = {97,98,99,100};
        fos1.write(b1);
        fos1.close();

        //以字符串的形式定义想写入的数据,再将字符串转换为byte数组
        FileOutputStream fos2 = new FileOutputStream("day04\\a.txt");
        String str = "asdfg";
        byte[] b2 = str.getBytes();
        fos2.write(b2);
        fos2.close();

        //一次写一个字节数组的部分数据
        //第二个参数是字节数组的起始索引
        //第三个参数是要写入数据的个数
        FileOutputStream fos3 = new FileOutputStream("day04\\a.txt");
        byte[] b3 = {97,98,99,100,101,102};
        fos3.write(b3,1,3);
        fos3.close();
    }
}

如何换行写

换行写:使用换行符
windows:\r\n
Linux:\n
Mac:\r
细节:
在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,也可以实现换行,java在底层会补全
建议:不要省略,还是写全了

代码演示

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

public class Test3 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("day04\\a.txt");

        String str1 = "abcd";
        byte[] b1 = str1.getBytes();
        fos.write(b1);

        String wrap = "\r\n";
        byte[] b2 = wrap.getBytes();
        fos.write(b2);

        String str3 = "efgh";
        byte[] b3 = str3.getBytes();
        fos.write(b3);

        fos.close();
        
    }
}

如何续写

如果想要续写,打开续写开关即可
开关位置:创建字节输出流对象的第二个参数
不写默认false:表示关闭续写,此时创建字节输出流对象会清空文件
手动传递true:表示打开续写,此时创建字节输出流对象不会清空文件

代码演示

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

public class Test4 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");
        String str1 = "abcd";
        byte[] b1 = str1.getBytes();
        fos1.write(b1);
        fos1.close();

        FileOutputStream fos2 = new FileOutputStream("day04\\a.txt",true);
        String str2 = "efgh";
        byte[] b2 = str2.getBytes();
        fos2.write(b2);
        fos2.close();

    }
}

操作本地文件的字节输入流FilelnputStream

可以把本地文件中的数据读取到程序中来

书写步骤及细节

1.创建字节输入流对象

        如果文件不存在,就直接报错
2.读数据

        利用read方法读数据,读出来的是数据在ASCII上对应的数字
        读到文件末尾读不到数据时,read方法返回-1
3.释放资源

        每次使用完流必须要释放资源。

代码演示

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

public class Test5 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("day04\\a.txt");
        int b;
        //空参read一次只能读取一个数据,利用循环进行读取
        //直到读到末尾读不到数据时返回-1,结束循环
        while ((b = fis.read()) != -1) {
            //读到的数据是ASCII字符对应的整数
            //通过char转化为字符类型
            System.out.print((char) b);
        }//abcdefg
        fis.close();
        
    }
}
如何一次读取多个数据
方法名称说明
public int read()一次读一个字节数据
public int read(byte[] buffer)

一次读一个字节数组数据

每次读取会尽可能把数组装满

返回读取到的数据个数,读不到返回-1

读取的数据字符在byte数组中

代码演示

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

public class Test6 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("day04\\a.txt");

        //定义字节数组接收数据
        byte[] b = new byte[3];

        int len;
        //返回读取到的数据个数,读不到返回-1,用len记录
        while ((len = fis.read(b)) != -1) {
            //读取的数据会存放在byte数组中
            //新一轮读取的数据会覆盖在byte数组中的旧数据
            //最后一次读取时,会出现数据读不满byte数组的情况
            //此时,byte数组中后面的部分数据不会被覆盖
            //所以需要len(读取到的数据个数),读取几个输出几个
            String str = new String(b, 0, len);
            System.out.println(str);
        }
        //abc
        //def
        //g

        fis.close();
    }
}

练习

将本模块下的a.txt文件的数据拷贝到本模块下的b.txt文件中 

因为文件较小,所以可以一个字节一个字节拷贝

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

public class Test7 {
    public static void main(String[] args) throws IOException {


        FileOutputStream fos = new FileOutputStream("day04\\b.txt");
        FileInputStream fis = new FileInputStream("day04\\a.txt");

        int b;
        while((b = fis.read())!=-1){
            fos.write(b);
        }

        //先开的后关闭
        fis.close();
        fos.close();

    }
}

 

 将D盘下a.wmv文件中的数据拷贝到本模块下的c.wmv文件中 

因为拷贝的是视频文件,内容较大,可以通过一次拷贝多个数据节省时间

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

public class Test8 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("day04\\c.wmv");
        FileInputStream fis = new FileInputStream("D:\\a.wmv");

        //一次拷贝10MB大小的内容
        byte[] b = new byte[1024 * 1024 * 10];
        int len;
        while ((len = fis.read()) != -1) {
            fos.write(b, 0, len);
        }

        fis.close();
        fos.close();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值