Java IO流

概述

什么是IO流:存储和读取数据的解决方案

IO流作用:用于读写文件中的数据

写 :output 把程序保存到本地文件

读 :input 把文件加载到程序

IO流分类:

输入流 输出流(按流的方向)

字节流 字符流(按操作文件类型)

IO流的体系:

字节流:inputStream(字节输入流)、OutputSream(字节输出流)

字符流:Reader(字符输入流)、Writer(字符输出流)

import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt");
        //写数据
        fos.write(90);
        //释放资源
        fos.close();
    }
}

FileOutputStream

FileOutputStream书写细节:

1.创建字节输出流对象:

参数是字符串表示的路径或者File对象都是可以的。

如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。

如果文件已经存在,则会清空文件夹。

2.写数据:

write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符。

3.释放资源:

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

字节写出流写出数据的三种方式:

import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt");
        //1
        fos.write(97);
        fos.write(98);
        //2
        byte[]arr={97,98,99,100};
        fos.write(arr);
        //3
        fos.write(arr,0,2);

        fos.close();
    }
}

换行和续写:

import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt",true);//true打开续写
        String arr="dwon";
        byte[] bytes = arr.getBytes();
        fos.write(bytes);

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

        String s2="s";
        byte[]a=s2.getBytes();
        fos.write(a);
        System.out.println(Arrays.toString(bytes));
        fos.close();
    }
}

FileInputStream

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
        int read = f.read();
        System.out.println(read);

        int read1 = f.read();
        System.out.println(read1);

        int read2 = f.read();
        System.out.println(read2);

        int read3 = f.read();
        System.out.println(read3);
        
        f.close();

    }
}

FileInputStream书写细节:

1.创建字节输入流对象:

如果文件不存在,就直接报错。

2.读取数据:

一次读一个字节,读出来的是数据在ASCII上对应的数字。

读到文件末尾了,read方法返回-1。

3.释放资源:

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

字节输入流循环读取

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
        int b;
        while ((b=f.read())!=-1){
            System.out.println((char)b);
        }

        f.close();

    }
}

文件拷贝

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
        FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\c.txt");
        int b;
        while((b=f.read())!=-1){
            fos.write(b);
        }
        fos.close();
        f.close();
    }
}

FileInputStream一次写多个字节

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt");

        byte[]arr=new byte[2];
        //返回长度
        int read = fis.read(arr);//2
        System.out.println(read);
        String str=new String(arr);
        System.out.println(str);

        int read2 = fis.read(arr);//2
        System.out.println(read2);
        String str2=new String(arr);
        System.out.println(str2);

        fis.close();

    }
}

文件拷贝案例改写

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("...");
        FileOutputStream fos=new FileOutputStream("...");

        int len;
        byte[] bytes=new byte[1024*1024*5];
        while ((len=fis.read())!=-1){
            fos.write(bytes,0,len);
        }
        
        fos.close();
        fis.close();
    }
}

加上时间

import java.io.*;
import java.util.Arrays;

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

        long l = System.currentTimeMillis();//记录开始时长

        FileInputStream fis=new FileInputStream("...");
        FileOutputStream fos=new FileOutputStream("...");

        int len;
        byte[] bytes=new byte[1024*1024*5];
        while ((len=fis.read())!=-1){
            fos.write(bytes,0,len);
        }

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

        long l1 = System.currentTimeMillis();//结束时长
        System.out.println(l1-l);//显示时长
    }
}

try...catch异常处理

待补充

字符流

FileReader

空参read

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
         FileReader fr=new FileReader("C:\\Users\\86158\\Desktop\\c.txt");
         int ch;
         while ((ch= fr.read())!=-1){
             System.out.println((char) ch);
         }
         fr.close();
    }
}

有参read

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("C:\\Users\\86158\\Desktop\\c.txt");
        char []chars=new char[2];
        int len;
        while ((len=fr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        fr.close();
    }
}

缓冲流

缓冲流为什么能提高性能:

缓冲流自带长度为8192的缓冲区

可以显著提高字节流的读写性能

对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有方法readLine()、newLine()

字节缓冲流

import java.io.*;
import java.nio.Buffer;

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

        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt"));

        int b;
        while ((b=bis.read())!=-1){
            bos.write(b);
        }

        bos.close();
        bis.close();
    }
}
import java.io.*;
import java.nio.Buffer;

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

        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt"));

        byte[]bytes=new byte[1024];
        int len;
        while ((len=bis.read())!=-1){
            bos.write(bytes,0,len);
        }

        bos.close();
        bis.close();
    }
}

 字符缓冲流

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new FileReader("C:\\Users\\86158\\Desktop\\c.txt"));

        String line1= br.readLine();
        System.out.println(line1);

        String line2= br.readLine();
        System.out.println(line2);

        br.close();
    }
}//输出乱码了...??
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\86158\\Desktop\\c.txt"));

        bw.write("你好");
        bw.newLine();
        bw.write("z");
        bw.newLine();

        bw.close();
    }
}

转换流

是字符流和字节流之间的桥梁

序列化流

可以把Java中的对象写到本地文件中

打印流

字节打印流

字符打印流

压缩流

Commons-io

回头写

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值