关于文件流的使用

前言:
    

IO流体系:






FileInputStream和FileOutputStream的代码示例如下:
package com.atguigu.java;

import java.io.File;
import java.io.FileInputStream;
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\\shkstart\\Desktop\\1.avi";
        //	 String dest = "C:\\Users\\shkstart\\Desktop\\2.avi";
        String src = "dbcp.txt";
        String dest = "dbcp2.txt";
        copyFile(src,dest);
        long end = System.currentTimeMillis();
        System.out.println("花费的时间为:" + (end - start));//3198
    }

// 实现文件复制的方法
    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[1024];
            int len;
            while ((len = fis.read(b)) != -1) {
            // fos.write(b);//错误的写法两种: fos.write(b,0,b.length);
            fos.write(b, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                e.printStackTrace();
                }
            }
        }
    }

// 从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制)
    @Test
    public void testFileInputOutputStream() {
        // 1.提供读入、写出的文件
        File file1 = new File("C:\\Users\\shkstart\\Desktop\\1.jpg");
        File file2 = new File("C:\\Users\\shkstart\\Desktop\\2.jpg");
        // 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);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                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!").getBytes());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
            // 4.关闭输出流
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
        }
    }

@Test
    public void testFileInputStream3() { // abcdefgcde
        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++) {
                    // System.out.print((char) b[i]);
                // }
                String str = new String(b, 0, len);
                System.out.print(str);
            }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}


// 使用try-catch的方式处理如下的异常更合理:保证流的关闭操作一定可以执行
@Test
    public void testFileInputStream2() {
        // 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 (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.关闭相应的流
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

// 从硬盘存在的一个文件中,读取其内容到程序中。使用FileInputStream
// 要读取的文件一定要存在。否则抛FileNotFoundException
    @Test
    public void testFileInputStream1() throws Exception {
        // 1.创建一个File类的对象。
        File file = new File("hello.txt");
        // 2.创建一个FileInputStream类的对象
        FileInputStream fis = new FileInputStream(file);
        // 3.调用FileInputStream的方法,实现file文件的读取。
        /*
        * read():读取文件的一个字节。当执行到文件结尾时,返回-1
        */
        // 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();
    }
}



FileReader和FileWriter的代码示例如下:
package com.atguigu.java;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Test;

/*
 * 使用FileReader、FileWriter 可以实现文本文件的复制。
 * 对于非文本文件(视频文件、音频文件、图片),只能使用字节流!
 */
public class TestFileReaderWriter {
    @Test
    public void testFileReaderWriter(){
        //1.输入流对应的文件src一定要存在,否则抛异常。输出流对应的文件dest可以不存在,执行过程中会自动创建
        FileReader fr = null;
        FileWriter fw = null;
        try{
            //不能实现非文本文件的复制
            //	 File src = new File("C:\\Users\\shkstart\\Desktop\\1.jpg");
            //	 File dest = new File("C:\\Users\\shkstart\\Desktop\\3.jpg");
            File src = new File("dbcp.txt");
            File dest = new File("dbcp1.txt");
            //2.
            fr = new FileReader(src);
            fw = new FileWriter(dest);
            //3.
            char[] c = new char[24];
            int len;
            while((len = fr.read(c)) != -1){
                fw.write(c, 0, len);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        if(fr != null){
            try {
                fr.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

@Test
    public void testFileReader(){
        FileReader fr = null;
        try {
            File file = new File("dbcp.txt");
            fr = new FileReader(file);
            char[] c = new char[24];
            int len;
            while((len = fr.read(c)) != -1){
                String str = new String(c, 0, len);
                System.out.print(str);
            }
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值