IO2:FileInputStream/FileOutputStream--java28(02/23/2016)

InputStream 和 Reader 是所有输入流的基类。
InputStream(典型实现:FileInputStream)

int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
Reader(典型实现:FileReader)
int read()
int read(char [] c)
int read(char [] c, int off, int len)
程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。

package com.atguigu.java;

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

import org.junit.Test;
/*
 * 1.流的分类
 * 按照数据流向的不同:输入流、输出流
 * 按照处理数据的单位的不同:字节流 字符流(处理的文本文件)
 * 按照角色的不同:字节流(直接作用于文件) 处理流
 * 2.IO的体系      
 * 抽象基类     节点流(文件流)          缓冲流
 * InputStream      FileInputStream            BufferedInputStream
 * OutputStream FileOutputStream         BufferedOutputStream
 * Reader           FileReader                    BufferedReader
 * Writer           FileWriter                      BufferedWriter
 */
public class TestFileInputOutputStream {
    //调用下面的复制方法,并计算复制时间
    @Test
    public void testCopyFile(){
        long start = System.currentTimeMillis();//毫秒
        String src = "C:\\Users\\xiaotinh\\Desktop\\03.jpg";
        String dest = "C:\\Users\\xiaotinh\\Desktop\\04.jpg";
        copyFile(src, dest);
        long end = System.currentTimeMillis();
        System.out.println("花费时间为:"+ (end - start));
    }
    
    //实现文件复制的方法,加了参数的方法具有通用性
    public void copyFile(String src,String dest){
        //1.提供读入、写出的文件
        File file1 = new File(src);
        File file2 = new File(dest);
        //2.提供相应的流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream(file1);
            fos = new FileOutputStream(file2);
            //3.实现文件的复制
            byte[] b = new byte[20];
            int len;
            while((len = fis.read(b)) != -1){
                //fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
                fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(fos!= null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }   
        }
        
    }
    
    
    //从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制)
    @Test
    public void testFileInputOutputStream(){
        //1.提供读入、写出的文件
        File file1 = new File("hello.txt");
        File file2 = new File("hello3.txt");
        //2.提供相应的流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try{
            fis = new FileInputStream(file1);
            fos = new FileOutputStream(file2);
            //3.实现文件的复制
            byte[] b = new byte[20];
            int len;
            while((len = fis.read(b)) != -1){
                //fos.write(b);错误写法 fos.write(b,0,b.length)是一样的
                fos.write(b, 0, len);//写b里面的东西;从0开始;len是长度
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(fos!= null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!= null){//fis和fos的关闭可以并列进行,因为都处于finally中,最后都会执行
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }   
        }
            
    }
    
    
    //FileOutputStream
    @Test
    public void testFileOutputStream(){
        //1.创建一个File对象,标明要写入的文件位置
        //输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建。若存在,会将原有的文件覆盖。
        File file = new File("hello2.txt");
        //2.创建一个FileOutputStream的对象,将file的对象作为形参传递给FileOutputStream的构造器中
        FileOutputStream fos = null;
        try{
            fos = new FileOutputStream(file);
            //3.写入操作
            fos.write(new String("I love China I love the World!").getBytes());
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //4.关闭输出流
            if(fos != null){
                try{
                    fos.close();
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    @Test
    public void testFileInputOutputStream3(){
        FileInputStream fis = null;
        try {
            File file = new File("hello.txt");
            fis = new FileInputStream(file);
            byte[] b = new byte[5];//读取到的数据要写入的数组
            int len;//每次读到byte中的字节的长度
            while((len = fis.read(b)) != -1){
//              for (int i = 0; i < len; i++) {//不可以写成b.length,否则输出abcdefgcde
//                  System.out.print((char)b[i]);
//              }
                
                String str = new String(b, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(fis!= null){//可以判断fis不为空时,才执行.close()
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
                
            }
    }
    
    
    //使用try-catch的方式处理如下的异常更合理!
    //因为throw是遇到问题就抛出,下面的程序便不再执行,所以无法释放打开的珍贵的流资源
    //而try-catch则会在抓到异常以后,继续执行,而将.close放到finally中,则必然会被关闭
    @Test
    public void testFileInputOutputStream2(){
        //2.创建一个FileInputStream类的对象
        FileInputStream fis= null;
        try {
            //1.创建一个File类的对象
            File file = new File("hello.txt");
            fis = new FileInputStream(file);
            //3.调用FileInputStream的方法,实现file问价的读取
            int b;
            while((b = fis.read()) != -1){
                System.out.print((char)b);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
        //4.关闭相应的流
        try {
            fis.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
        }
}

    //从硬盘存在的文件中,读取其内容到程序中。使用FileInputStream
    //要读取的文件一定要存在,否则抛FileNotFoundException
    @Test
    public void testFileInputOutputStream1() throws Exception{
        //1.创建一个File类的对象
        File file = new File("hello.txt");
        //2.创建一个FileInputStream类的对象
        FileInputStream fis = new FileInputStream(file);
        //3.调用FileInputStream的方法,实现file问价的读取
        /*
         * read():读取文件的一个字节。 当执行到文件结尾时,返回-1.abcdefg
         */
//      int b = fis.read();
//      while(b != -1){
//          System.out.print((char)b);
//          b = fis.read();
//      }或者
        int b;
        while((b = fis.read()) != -1){
            System.out.print((char)b);
        }
        //4.关闭相应的流
        fis.close();//因为流的资源并不是java虚拟机的资源,不会自动回收,需要显示关闭
    }
}

你可能感兴趣的:(IO2:FileInputStream/FileOutputStream--java28(02/23/2016))