回顾IO流

IO流

IO流简介

  • IO流:Java对数据的操作是通过流的方式,IO流就是处理设备之间的数据传输。
  • 输入流InputStream(读取数据) 输出流OutStream(写数据)
  • 字节流可以操作任何数据 字符流只能操作字符数据

FileInputStream

文件输入流FileInputStream用于读取文件的原始字节流。

构造方法:FileInputStream(File file) FileInputStream(String name)

方法:Int read() 读取一个字节

FileInputStreamDemo1.java*

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //创建文件输入流对象
        FileInputStream fis1 = new FileInputStream("a.txt");
        //读取a.txt文件数据(每读取一个字节返回一个int数值)
        int a=0;
        while((a=fis1.read())!=-1){
            System.out.println(a);
        }
        //创建文件对象
        File file = new File("b.txt");
        //创建文件输入流对象
        FileInputStream fis2 = new FileInputStream(file);
        //读取b.txt文件数据
        int b;
        while ((b=fis2.read())!=-1){
            System.out.println(b);
        }
        //关闭流
        fis1.close();
        fis2.close();
    }
}

FileOutputStream

文件输出流FileOutputStream用于向文件中写入数据

构造方法:FileOutputStream(File file) FileOutputStream(String name)

方法:write(int b) 每次向文件中写入一个字节 write(byte[] b) 每次向文件中写入多个字节

FileOutputStreamDemo1.java

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

public class FileOutputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("a.txt");
        FileOutputStream fos1 = new FileOutputStream(file);
        fos1.write(65);//向a.txt文件中写入'A'
        fos1.close();
        FileOutputStream fos2 = new FileOutputStream("b.txt");
        byte[] b={65,66,67,68,69,70};
        fos2.write(b);//向b.txt文件中写入"ABCDDEF"
        fos2.close();

    }
}

缓冲区思想

拷贝文件,利用文件输入流读取文件数据,再利用文件输出流向文件中写入数据。

  • CopeDemo1.java (该方法每读取一个字节写入一个字节,速度慢)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopeDemo1 {
    public static void main(String[] args) throws IOException {
       FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
       FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
        int a = 0;
        while ((a = fis.read()) != -1) {
            fos.write(a);
        }
        System.out.println("图片拷贝成功!");
        fis.close();
        fos.close();
    }
}
  • CopeDemo2.java (利用available()方法,返回文件大小,只适合小文件,若文件太大会造成内存溢出)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopeDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
        int size = fis.available();
        byte[] bytes = new byte[size];
        fis.read(bytes);
        FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/11(副本).jpg");
        fos.write(bytes);
        System.out.println("图片拷贝成功!");
        fis.close();
        fos.close();
    }
}
  • CopeDemo3.java (自定义缓存区大小,先读取一个缓存区大小数据,再进行写入,再继续读取写入,知道完后为止)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopeDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
        FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
        byte[] bytes = new byte[1024*8];//自定义缓存区大小
        int size=0;
        while((size=fis.read(bytes))!=-1){
            fos.write(bytes,0,size);
        }
        System.out.println("图片拷贝成功!");
        fis.close();
        fos.close();
    }
}

BufferedInputStream

  • BufferedInputStream内置了一个缓冲区(数组)

  • 当使用BufferedInputStream读取一个字节时,BufferedInputStream会一次性从文件中读取8192个(8Kb), 存在缓冲区中,直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组

  • 向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

CopeDemo4.java

import java.io.*;

public class CopeDemo4 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
        BufferedInputStream bis=new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int a=0;
        while((a=bis.read())!=-1){
            bos.write(a);
        }
        System.out.println("图片拷贝成功!");
        bis.close();
        bos.close();
    }
}

flush()方法

用来刷新缓冲区的,把内部buf[] 变量的数据写入文件,刷新后可以再次写入数所

close()方法

  • 用来关闭流释放资源的

  • 如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写入数据

原文地址:https://www.cnblogs.com/jascen/p/11315889.html