Java基础IO流 ,文件读取,由易至难 最基础的读取文件 从文件读取到另一个文件 IO流的工具类,抽离出读取、写入、关闭 使用字节数组流读取数据 使用字节数组流读取数据-升级版 字节缓冲流 字符缓冲流 转换流 commons-io

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

public class FileIOTest {
public static void main(String[] args) {
File file = new File("E:/abc.txt");
FileInputStream is = null;
try {
is = new FileInputStream(file);
byte[] bytes = new byte[3]; //缓冲容器
int len = -1; //接收长度
while ((len = is.read(bytes)) != -1) {
//字符数组-->字符串,解码
String s = new String(bytes, 0, len);
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
          if(is != null){
            is.clise();
          }

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

从文件读取到另一个文件

package com.svs;

import java.io.*;

public class IOTest {
    public static void main(String[] args) {
        File file = new File("E:/abc.txt");
        FileInputStream is = null;
        FileOutputStream os = null;
        try {
            is = new FileInputStream(file);
            os = new FileOutputStream("F:/abc.txt");
            byte[] bytes = new byte[3];
            int len = -1;
            while ((len=is.read(bytes)) != -1){
                os.write(bytes,0,len);
                os.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {//先打开的后关闭
         if(os != null){
                     os.close();
         }
         if(is != null){
                  is.close();
         }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

IO流的工具类,抽离出读取、写入、关闭

import java.io.*;


public class FileUtil {
    public static void main(String[] args) {
            copy("D:/123441.jpg", "E:/123441.jpg");
    }

    /**
     * 流的读取与写入
     *
     * @param srcPath
     * @param destPath
     */
    public static void copy(String srcPath, String destPath) {
        File src = new File(srcPath);
        File dest = new File(destPath);
        try (InputStream is = new FileInputStream(src);
             OutputStream os = new FileOutputStream(dest)) {
            byte[] flush = new byte[1024 * 2]; //缓冲容器
            int len = -1; //接收长度
            while ((len = is.read(flush)) != -1) {
                os.write(flush, 0, len);
                os.flush(); //刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

使用字节数组流读取数据

补充:流的来源或目的地并不一定是文件,也可以是内存中的一块空间,例如一个字节数组。就需使用字节数组流处理,且字节数组流不用关闭。

package com.svs;

import java.io.*;

public class ByteArrayStreamFileUtil {
    public static void main(String[] args) {
        //使用字节数组流读取,写入数据,字节数组流是不用关闭的
        try {
            //从硬盘中读取文件,存储到内存中
            InputStream is = new FileInputStream("E:/aa.jpg");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            copy(is, baos);
            //从内存中读取数据,存储到硬盘中
            InputStream bais = new ByteArrayInputStream(baos.toByteArray());
            OutputStream os = new FileOutputStream("F:/aa.jpg");
            copy(bais, os);
            closeIO(is, os);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 流的读取与写入
     *
     * @param is
     * @param os
     */
    public static void copy(InputStream is, OutputStream os) {
        try {
            byte[] flush = new byte[1024 * 2]; //缓冲容器
            int len = -1; //接收长度
            while ((len = is.read(flush)) != -1) {
                os.write(flush, 0, len);
                os.flush(); //刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭流
     *
     * @param is
     * @param os
     */
    public static void closeIO(InputStream is, OutputStream os) {
        try { //先打开的先关闭
            if (os != null) {
                os.close();
            }
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结:ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收,所以不需要关流。也就是说,指向内存的流可以不用关闭,指向存储卡/硬盘的流一定要关闭。 

使用字节数组流读取数据-升级版

JDK1.7之后引入

try(    ){
}catch(){
}

方法,省去finally,进行自动关闭。(这是使用 try-with-resources 资源自动释放特性)

package com.svs;

import java.io.*;

public class ByteArrayStreamFileUtil2 {
    public static void main(String[] args) {
        //JDK1.7之后,引入try(){}方法进行关闭
        try (InputStream is = new FileInputStream("E:/aa.jpg");
             OutputStream os = new FileOutputStream("F:/aa.jpg");) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            copy(is, baos);
            InputStream bais = new ByteArrayInputStream(baos.toByteArray());
            copy(bais, os);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 流的读取与写入
     *
     * @param is
     * @param os
     */
    public static void copy(InputStream is, OutputStream os) {
        try {
            byte[] flush = new byte[1024 * 2]; //缓冲容器
            int len = -1; //接收长度
            while ((len = is.read(flush)) != -1) {
                os.write(flush, 0, len);
                os.flush(); //刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

字节缓冲流

BufferedInputStream,BufferedOutputStream。字节缓冲流是对读取【性能】的提升,使用字节流时建议加上字节缓冲流。

import java.io.*;

/**
 * @Description: 字节缓冲流 BufferedInputStream BufferedOutputStream
 * @Description: 字节缓冲流是对读取【性能】的提升,使用字节流时建议加上字节缓冲流
 */

public class BufferedStream {
    public static void main(String[] args) {
//        long l1= System.currentTimeMillis();
        copy("D:/123441.jpg", "E:/123441.jpg");
//        long l2= System.currentTimeMillis();
//        System.out.println(l2-l1);
    }

    /**
     * 流的读取与写入
     *
     * @param srcPath
     * @param destPath
     */
    public static void copy(String srcPath, String destPath) {
        File src = new File(srcPath);
        File dest = new File(destPath);
        try (InputStream is = new BufferedInputStream(new FileInputStream(src));
             OutputStream os = new BufferedOutputStream(new FileOutputStream(dest))) {
            byte[] flush = new byte[1024 * 2]; //缓冲容器
            int len = -1; //接收长度
            while ((len = is.read(flush)) != -1) {
                os.write(flush, 0, len);
                os.flush(); //刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符缓冲流

import java.io.*;

/**
 * @Description: 字符缓冲流 BufferedInputStream BufferedOutputStream
 * @Description: 字符缓冲流是对读取【性能】的提升,使用字符流时建议加上字符缓冲流
 */

public class BufferedRWStream {
    public static void main(String[] args) {
        copy("D:/123441.txt", "E:/123441.txt");
    }

    /**
     * 流的读取与写入
     *
     * @param srcPath
     * @param destPath
     */
    public static void copy(String srcPath, String destPath) {
        File src = new File(srcPath);
        File dest = new File(destPath);
        try (BufferedReader br = new BufferedReader(new FileReader(src));
             BufferedWriter bw = new BufferedWriter(new FileWriter(dest))) {
            String line = null;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
                bw.flush(); //刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

转换流

InputStreamReader OutputSttreamWriter。
1、以字符流的形式操作字节流(纯文本);2、指定字符集(API手册查看)
import java.io.*;

/**
 * @Description: 转换流 InputStreamReader OutputSttreamWriter
 * @Description: 1、以字符流的形式操作字节流(纯文本)
 * @Description: 2、指定字符集(API手册查看)
 */

public class ConvertTest {
    public static void main(String[] args) {
        //操作System.in和System.out,均是字节流
        try(BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out))){
            //循环获取键盘的输入(exit退出),输出此内容
            String msg="";
            while (!"exit".equals(msg)){
                msg=reader.readLine(); //循环读取
                writer.write(msg); //循环写出
                writer.newLine();
                writer.flush(); //强制刷新
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

commons-io

Apache下的commonsIO,其中有封装好的FileUtil工具类,实际开发中无需写原生代码,拿来即用即可。

下载链接:http://commons.apache.org/proper/commons-io/download_io.cgi