Java中的IO流

Java中的IO流

image-20221110153850629

image-20221110153902226

image-20221110153934293

image-20221110154606692

Java中的4大IO抽象类

image-20221110154710555

InputStream/OutputStream 为字节输入输出流

Reader/Writer 为字符输入输出流

InputStream

image-20221110154939666

OutputStream

image-20221110155134332

Reader

image-20221110155143360

Writer

image-20221110155255762

Java中流的概念细分

image-20221110155436935

image-20221110155503244

二进制文件(图片、影音)用字节流

文本信息用字符流

image-20221110155727756

image-20221110155747580

image-20221110155844830

IO流的体系

image-20221110160005253

image-20221110160358045

image-20221110160621062

练手案例

public class FirstDemo {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        InputStream fileInputStream = new FileInputStream("D:\\桌面\\新建文本文档.txt");
        int s1;
        while ((s1 = fileInputStream.read())!=-1){
            System.out.println(s1);
            System.out.println((char)s1);
        }
        fileInputStream.close();
    }
}

File类

image-20221110165608105

针对文件操作的方法

image-20221110165645626

image-20221112203454845

针对目录的方法

image-20221110165850740

常用流对象

文件字节流

实现文件拷贝
public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");
        int tem = 0;
        while((tem = stream.read()) != -1){
            System.out.println(tem);
            outputStream.write(tem);
        }
        outputStream.flush();
        stream.close();
        outputStream.close();
    }
}
通过缓冲区提高读写效率

方式一:

image-20221112213859286

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");
        int tem = 0;
        byte[] buffer = new byte[1024];
        while((tem = stream.read(buffer)) != -1){  // 数组装满返回长度,装不满返回-1
            outputStream.write(buffer,0,tem);// 将buffer中0到tem的数据写入
        }
        outputStream.flush();
        stream.close();
        outputStream.close();
    }
}

方式二:

image-20221112213922859

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.png");
        int tem = 0;
        byte[] buffer = new byte[stream.available()]; //  stream.available()是该文件的预估大小
        stream.read(buffer);
        outputStream.write(buffer);
        outputStream.flush(); // 将内存转入磁盘
        stream.close();
        outputStream.close();
    }
}
通过字节缓冲流提高效率

缓冲流为处理流

image-20221112215208687

缓冲区中,默认有一个数组,默认为8192

public class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\桌面\\a.png");
        FileOutputStream fos = new FileOutputStream("D:\\桌面\\aa.png");
        BufferedInputStream bis  = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int tem = 0;
        while ((tem = bis.read()) != -1){
            bos.write(tem);
        }
        bos.flush();
        bos.close();
        bis.close();
        fis.close();
        fos.close();
    }
}
定义文件拷贝工具类
public static void copyFile(String src,String des) throws IOException {
    FileInputStream fis = new FileInputStream(src);
    FileOutputStream fos = new FileOutputStream(des);
    BufferedInputStream bis = new BufferedInputStream(fis);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    int temp = 0;
    while ((temp = bis.read()) != -1){
        bos.write(temp);
    }
    bos.flush();
    bis.close();
    bos.close();
    fis.close();
    fos.close();
}

文件字符流

文件字节流可以处理所有的文件,但是处理文本文件时,我们也可以使用文件字符流,他以字符为单位进行操作。

实现文件拷贝
public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        int temp = 0;
        while ((temp = fileReader.read()) != -1){
            fileWriter.write(temp);
        }
        fileWriter.write("\r\n");// 回车换行
        fileWriter.write("hhhhhhhhhhhhhhhh");
        fileWriter.flush();
        FileWriter fileWriter2 = new FileWriter("D:\\桌面\\aa.txt",true); // 不加true默认覆盖,加了true为在尾部添加
        fileWriter2.write("houyiming");
        fileWriter2.flush();
        fileReader.close();
        fileWriter.close();
        fileWriter2.close();
    }
}
缓冲区提高效率
public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        int temp = 0;
        char[] buffer = new char[1024];
        while ((temp = fileReader.read(buffer)) != -1){
            fileWriter.write(buffer,0,1024);
        }
        fileWriter.flush();
        fileReader.close();
        fileWriter.close();
    }
}
字符缓冲流

image-20221113192247909

image-20221113192631565

实现文件拷贝:

public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        String temp = "";
        while ((temp = bufferedReader.readLine()) != null){
            bufferedWriter.write(temp);
            bufferedWriter.newLine();
        }
        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
        fileReader.close();
        fileWriter.close();
    }
}

转换流

image-20221115193320563

public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferedReader.readLine();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
        bufferedWriter.write(s);
        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
    }
}
字节流读取文件并添加行号
public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\桌面\\aa.txt")));
        String s = "";
        int i = 1;
        while ((s = bufferedReader.readLine()) != null){
            bufferedWriter.write(i+++": "+s);
            bufferedWriter.newLine();
        }
        bufferedWriter.flush();
        bufferedWriter.close();
        bufferedWriter.close();
    }
}

字符输出流

节点流。

image-20221115201524367

加行号:

public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));
        PrintWriter printWriter = new PrintWriter("D:\\桌面\\aa.txt");
        String s = "";
        int i = 1;
        while ((s = bufferedReader.readLine()) != null){
            printWriter.println(i+++": "+s);
        }
        printWriter.close();
        bufferedReader.close();
    }
}

字节数组流

image-20221115203535081

public static void main(String[] args) throws IOException {
    byte[] bytes = "abcdefg".getBytes();
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
    StringBuilder stringBuilder = new StringBuilder();
    //stringBuilder可以使用append的方法不断地添加元素创建字符串
    int temp = 0;
    while ((temp = byteArrayInputStream.read()) != -1){
        stringBuilder.append((char)temp);
    }
    System.out.println(stringBuilder.toString());
}

image-20221115204702047

public static void main(String[] args) throws IOException {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byteArrayOutputStream.write('a');
    byteArrayOutputStream.write('b');
    byteArrayOutputStream.write('c');
    byte[] arr = byteArrayOutputStream.toByteArray();
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}

数据流

image-20221115210439566

image-20221115210446615

public static void main(String[] args) throws IOException {
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));
    dos.writeInt(1);
    dos.writeChar('a');
    dos.writeDouble(9.99);
    dos.writeUTF("houyiming");
    dos.flush();
    dos.close();
    DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));
    // 注意:读取的顺序要与写入的顺序一致。
    System.out.println(dis.readInt());
    System.out.println(dis.readChar());
    System.out.println(dis.readDouble());
    System.out.println(dis.readUTF());
}

对象流

image-20221116185152801

对象的序列化和反序列化

image-20221116185241793

序列化:将java对象转化为字节序列

反序列化:将字节序列还原为java对象

image-20221116185556346

image-20221116185705305

操作基本数据类型

之前学的数据流只能对基本数据类型进行操作,但是对象流不仅可以操作基本数据类型,还可以操作Java对象。

public static void main(String[] args) throws IOException {
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));
    objectOutputStream.writeInt(1);
    objectOutputStream.writeBoolean(true);
    objectOutputStream.writeChar('a');
    objectOutputStream.writeUTF("aaaaaaaaaaa");
    objectOutputStream.flush();
    ObjectInputStream objectInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));
    // 读出的顺序要与写入的顺序一致
    System.out.println(objectInputStream.readInt());
    System.out.println(objectInputStream.readBoolean());
    System.out.println(objectInputStream.readChar());
    System.out.println(objectInputStream.readUTF());
    objectInputStream.close();
    objectOutputStream.close();
}
操作对象
public static void main(String[] args) throws IOException, ClassNotFoundException {
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\桌面\\a2.txt"));
    Users users = new Users(1,"hym","22");
    objectOutputStream.writeObject(users); // 序列化到外部
    objectOutputStream.flush();
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\a2.txt"));
    // 反序列化
    Users users1 = (Users) objectInputStream.readObject();
    System.out.println(users1.toString());
    objectInputStream.close();
    objectOutputStream.close(); 
}

随机访问流

image-20221116201017668

3个核心的方法:

image-20221116202221096

public static void main(String[] args) throws IOException, ClassNotFoundException {
    RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\桌面\\aa.txt","rw");
    // 将数据写入文件
    int[] ints = new int[]{1,2,3,4,5,6,7,8,9,10};
    for (int i = 0; i < ints.length; i++) {
        randomAccessFile.writeInt(ints[i]);
    }
    randomAccessFile.seek(4);//整数占4个字节,将指针移动到4,为2的第一个字节。
    System.out.println(randomAccessFile.readInt());
    // 在第八个字节位置替换
    randomAccessFile.seek(8);
    randomAccessFile.writeInt(33);
    randomAccessFile.close();
}

ApacheIO包

下载与添加commons-IO包

下载地址:Commons IO – Download Apache Commons IO

image-20221116204813754

选择commons-io-2.11.0.jar加入即可

这个地方显示即为成功

image-20221116205148136

FileUtils的使用

image-20221116205336679

image-20221116205403537

image-20221116205519925

读取txt文件并以字符串形式输出:

public static void main(String[] args) throws IOException {
    String s = FileUtils.readFileToString(new File("D:\\桌面\\a.txt"),"utf-8");
    System.out.println(s);
}

IOUtils的使用

image-20221116211000999

image-20221116211043442

image-20221116211135493toString方法的使用:

public static void main(String[] args) throws IOException {
    String s = IOUtils.toString(new FileInputStream("d:\\桌面\\a.txt"),"utf-8");
    System.out.println(s);
}

总结

image-20221116211621290

image-20221116211640282

image-20221116211654354

image-20221116211749378

image-20221116211847790

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值