IO流的总结

简介


字节输入流的抽象基类是InputStream,常用子类是FileInputStream和BufferedInputStream。
字符输入流抽象基类是Reader,常用的子类是BufferReader,InputStreamReader,FileReader。

二 普通输入流和带缓存的字节输入流区别

字节流

1.FileInputStream

一切文件在系统中都是以字节形式保存的,需要用FileInputStream从磁盘中读取字节序列。
对应的方法有:

  • read():从输入流中读取单个字节数据;如果已经到达文件末尾,则返回-1;
  • read(byte[] byte):从输入流中将最多byte.length个字节的数据读入到一个byte数组,以整数形式返回存入数组中的实际字节个数;如果已经到达文件末尾,则返回-1;
  • read(byte[] byte,int begin,int end)
  • FileOutputStream.flush():刷新字节输出流并强制写出缓存内所有字节数据。

2.BufferedInputStream

带缓冲的字节输入流:文件字节输入流的读取时,是直接同字节流中读取的。由于字节流是硬件(存储介质)进行读取的,所以速度比较慢。cpu需要使用read()…读取数据时就要受到硬件IO的慢速度限制。
cpu与内存的读写速度比IO快,所以,在内存中建立缓存区,先把存储介质的字节读取到缓存区中。cpu需要数据时直接从缓存中读取,缓存区要足够大,在读完后又触发fill()函数自动从存储介质的文件字节内容中读取字节存储到缓存区数组。
BufferedInputStream内部有一个缓存区,默认是8M。

字符流

1 FileReader

int readLine():
int read():
int read(char[] buf):
itn read(char[] buf,int off,int len):
void close():

2 BufferedReader

转换流

inputStreamReader

BufferedReader,BufferedWrite

以上是输入流,输出流类似。下边是实例代码分享:

实例代码

package com.souche;

import java.io.*;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args ) {
        File file = new File("/Users/hh/Desktop/1234hh");
        File fileout = new File("/Users/hh/Desktop/1234hh");
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            fileOutputStream = new FileOutputStream(fileout);

            //1.FileInputStream
            //read()
            /*
            int read;
            while (-1 != (read = fileInputStream.read())){
                fileOutputStream.write(read);
            }
            */

            //read(byte[])
            /*
            byte[] bytes = new byte[2];
            int read;
            while(-1 !=(read = fileInputStream.read(bytes))){
                fileOutputStream.write(bytes);
            }
            fileOutputStream.flush();
            */

            //read(byte[], int begin , int len)


            //2.BufferInputStream
            /*
            bufferedInputStream = new BufferedInputStream(fileInputStream);//默认是8M
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            byte[] bytes = new byte[2];
            int read;
            while (-1 != (read = bufferedInputStream.read(bytes))){
                bufferedOutputStream.write(bytes);
            }
            bufferedOutputStream.flush();
            */

            //3.InputStreamReader,来进行转码
            String line = null;
            //字节流不存在乱码,所以可以确保读入流的文件是什么编码,转换的时候用什么编码,否则默认是平台编码
            //输出流的编码是根据写入流的编码
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8"));
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("/Users/hh/Desktop/1234hh));
            while(null != (line = bufferedReader.readLine())){
                bufferedWriter.write(line);
                bufferedWriter.newLine();
            }
            bufferedWriter.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
                try {
                    if(null != fileInputStream){
                        fileInputStream.close();
                    }
                    if(null != fileOutputStream){
                        fileOutputStream.close();
                    }
                    if(null !=  bufferedInputStream){
                        bufferedInputStream.close();
                    }
                    if(null != bufferedOutputStream){
                        bufferedOutputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

        }
    }
}

猜你喜欢

转载自blog.csdn.net/xi15232131135/article/details/85221098