IO流基础知识(基本字节流,字符流和缓冲流)

一.第一个IO流程序

import java.io.FileInputStream;

public class Test1 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("src/main/java/IO流补充/a.txt");
        int s1 = fileInputStream.read();
        int s2 = fileInputStream.read();
        int s3 = fileInputStream.read();
        int s4 = fileInputStream.read();
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        fileInputStream.close();
    }
}

这种格式是不规范的,在开发过程中我们一般不这么写,只适用于测试。

 流对象使用完,必须关闭!不然,总占用系统资源,最终会造成系统崩溃!
   1. 我们读取的文件内容是已知的,因此可以使用固定次数的int s= fis.read();”语句读取内容,但是在 实际开发中通常我们根本不知道文件的内容,因此我们在读取的时候需要配合while循环使用。
2. 为了保证出现异常后流的正常关闭,通常要将流的关闭语句要放到finally语句块中,并且要判断流是不是null

二.使用IO流的经典读取方法

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

public class Test2 {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        try{
            fileInputStream = new FileInputStream("src/main/java/IO流补充/a.txt");
            int temp = 0;
            StringBuilder stringBuilder = new StringBuilder();
            while((temp = fileInputStream.read()) != -1){
                System.out.println(temp);
                stringBuilder.append((char) temp);
            }
            System.out.println(stringBuilder);
        }catch (Exception e){

        }finally {
            if (fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

三.IO流新语法经典写法

我们往往使用try-with-resource简化代码来实现IO流的读写操作,这会大大的减少代码量。
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test3 {
    public static void main(String[] args) {
        try(FileInputStream fileInputStream = new FileInputStream("src/main/java/IO流补充/a.txt")){
            StringBuilder stringBuilder = new StringBuilder();
            int temp = 0;
            //返回的是该字节的ASCLL码值
            while((temp = fileInputStream.read())!=-1){
                stringBuilder.append((char)temp);
            }
            System.out.println(stringBuilder);
        }catch (Exception e){
            e.printStackTrace();
        }

        try(FileOutputStream fileOutputStream = new FileOutputStream("src/main/java/IO流补充/a.txt",false)){
            //true(内容会追加到文件中)
            //false(默认覆盖原来内容)
            String temp = "cjy";
            fileOutputStream.write(temp.getBytes());
            //刷新数据将数据从内存中写入磁盘中
            fileOutputStream.flush();
        }catch (Exception ee){
            ee.printStackTrace();
        }


    }
}

必须是实现了java.lang.AutoCloseable接口的对象才可以关闭资源

try(创建输入流对象){

}catch(Exception e){

}finally{

}
//该格式会自动关闭资源

以上让宝贝们先了解一下关于流的知识。之后我们正式开始讲解呀!!

四.Java中流的概念细分

1.按流的方向分类:

输入流:数据流向是数据源到程序(以InputStreamReader结尾的流)。
输出流:数据流向是程序到目的地(以OutPutStreamWriter结尾的流)。

2.按处理的数据单元分类:

字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream
FileOutputStream
字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如
FileReaderFileWriter

3.按处理对象不同分类:

节点流:可以直接从数据源或目的地读写数据,如FileInputStreamFileReader
DataInputStream等。
处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能,
BufferedInputStreamBufferedReader等。处理流也叫包装流。
节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流 可以对节点流进行包装,提高性能或提高程序的灵活性。

五.JavaIO流类的体系

    这里我们只列举出来常用的流。InputStream,OutputStream,Reader和Writer是我们IO流的四大抽象父类。需要我们牢牢掌握。

字节缓冲流复制文件(字节输入流和输出流的应用)

import java.io.FileInputStream;
import java.io.FileOutputStream;
//字节缓冲流
public class TestFileByteBuffer {
    public static void main(String[] args) {
        long time1 = System.currentTimeMillis();
        copyFile("src/main/java/IO流补充/a.txt","src/main/java/IO流补充/b.txt");
        long time2 = System.currentTimeMillis();
        System.out.println(time2 - time1);
    }
    /*
    src:源文件
    desc:目标文件
     */
    public static void copyFile(String src,String desc){
        try(FileInputStream fileInputStream = new FileInputStream(src);
            FileOutputStream fileOutputStream = new FileOutputStream(desc)){
            int temp = 0;
            //创建字节缓冲区,大大提高了速率----------------------------
            byte[] bytes = new byte[1024];
            while((temp = fileInputStream.read(bytes))!= -1){
                //返回的是实际读取的字节数
                System.out.println(temp);
                fileOutputStream.write(bytes,0,temp);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

缓冲字节流

Java缓冲流本身并不具有IO流的读取与写入功能,只是在别的流(节点流或其他处理流)上加缓冲功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流(包装流BufferedInputStream和BufferedOutputStream这两个流是缓冲 字节流,通过内部缓存数组来提高操作流的效率。

使用缓冲流实现文件的高效率复制

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
//缓冲字节流
public class TestFileBufferStream {
    public static void main(String[] args) {
        copyFile("src/main/java/IO流补充/a.txt","src/main/java/IO流补充/b.txt");
    }
    public static void copyFile(String source,String destination){
        try(FileInputStream fileInputStream = new FileInputStream(source);
            FileOutputStream fileOutputStream = new FileOutputStream(destination);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream)){
            int temp = 0;
            while((temp = bufferedInputStream.read())!=-1){
                System.out.print((char)temp);
                bufferedOutputStream.write(temp);
            }
            bufferedOutputStream.flush();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

文件字符输入流

     前面介绍的文件字节流可以处理所有的文件,如果我们处理的是文本文件,也可以使用文件字符流,它以字符为单位进行操作。
import java.io.FileReader;

public class TestFileReader {
    public static void main(String[] args) {
        try(FileReader fileReader = new FileReader("src/main/java/IO流补充/a.txt")){
            StringBuilder stringBuilder = new StringBuilder();
            int temp = 0;
            //字符流返回的也还是整数,也需要转换成字符流
            while ((temp = fileReader.read())!= -1){
                System.out.println(temp);
                stringBuilder.append((char)temp);
            }
            System.out.println(stringBuilder);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

文件字符输出流

import java.io.FileWriter;

public class TestFileWriter {
    public static void main(String[] args) {
        try(FileWriter fileWriter = new FileWriter("src/main/java/IO流补充/a.txt",true)){
            //\r\n表示的是回车换行
            fileWriter.write("你好,");
            fileWriter.write("喜欢!\r\n");
            fileWriter.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制,大大提高了读写文本文件的效率。
readLine()方法是BufferedReader的方法,可以对文本文件进行更加方便的读取操作。
newLine()方法BufferedWriter的方法,可以使用newLine()方法换行。
复制文件中的内容到另一个文件并且添加行号
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

//为文件里面的内容添加行号
public class TestLineNumber {
    public static void main(String[] args) {
        try(BufferedReader br = new BufferedReader(new FileReader("src/main/java/IO流补充/a.txt"));
            //创建字符输出缓冲流与文件字符输出流
            BufferedWriter bw = new BufferedWriter(new FileWriter("src/main/java/IO流补充/b.txt"))) {
            String str = "";
            int i = 1;
            while ((str = br.readLine())!=null){
                bw.write(i+"."+str);
                bw.newLine();
                i++;
            }
            //刷新
            bw.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
import java.io.BufferedReader;
import java.io.FileReader;

public class TestBufferedReader {
    public static void main(String[] args) {
        //创建字符缓冲处理流。缓冲区默认大小为8192个字符。
        try(FileReader fileReader = new FileReader("src/main/java/IO流补充/a.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader)){
            //操作流
            String str = "";
            while ((str = bufferedReader.readLine())!=null){
                System.out.println(str);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
import java.io.BufferedWriter;
import java.io.FileWriter;

public class TestBufferedWriter {
    public static void main(String[] args) {
        try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("src/main/java/IO流补充/a.txt",true))){
            //创建字符输出缓冲流对象
            //操作字符输入缓冲流
            bufferedWriter.newLine();
            bufferedWriter.write("我喜欢");
            bufferedWriter.newLine();
            bufferedWriter.write("你知道我喜欢你吗?");
            bufferedWriter.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

六.小结

      目前,我们讲解了IO流的基本概念以及字节流,字符流和缓冲流和一些代码还有一些相关的例子,希望宝贝们可以熟练掌握,在我们之后学习的网络编程中还有以后的开发中占的比例非常大。喜欢的宝子们点个赞呀!
  • 48
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无缘过去@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值