1. FileReader/FileWriter的使用

1.1 FileReader的使用

  1. /*
  2. 将hello.txt文件内容读入程序中,并输出到控制台
  3. 说明点:
  4. 1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
  5. 2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
  6. 3. 读入的文件一定要存在,否则就会报FileNotFoundException。
  7. */
  8. @Test
  9. public void testFileReader1() {
  10. FileReader fr = null;
  11. try {
  12. //1.File类的实例化
  13. File file = new File("hello.txt");
  14. //2.FileReader流的实例化
  15. fr = new FileReader(file);
  16. //3.读入的操作
  17. //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
  18. char[] cbuf = new char[5];
  19. int len;
  20. while((len = fr.read(cbuf)) != -1){
  21. //方式一:
  22. //错误的写法
  23. // for(int i = 0;i < cbuf.length;i++){
  24. // System.out.print(cbuf[i]);
  25. // }
  26. //正确的写法
  27. // for(int i = 0;i < len;i++){
  28. // System.out.print(cbuf[i]);
  29. // }
  30. //方式二:
  31. //错误的写法,对应着方式一的错误的写法
  32. // String str = new String(cbuf);
  33. // System.out.print(str);
  34. //正确的写法
  35. String str = new String(cbuf,0,len);
  36. System.out.print(str);
  37. }
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. } finally {
  41. if(fr != null){
  42. //4.资源的关闭
  43. try {
  44. fr.close();
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50. }

1.2 FileWriter的使用

/*
从内存中写出数据到硬盘的文件里。

说明:
1. 输出操作,对应的File可以不存在的。并不会报异常
2.
     File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
     File对应的硬盘中的文件如果存在:
           如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
           如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容

 */
@Test
public void testFileWriter() {
    FileWriter fw = null;
    try {
        //1.提供File类的对象,指明写出到的文件
        File file = new File("hello1.txt");

        //2.提供FileWriter的对象,用于数据的写出
        fw = new FileWriter(file,false);

        //3.写出的操作
        fw.write("I have a dream!\n");
        fw.write("you need to have a dream!");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //4.流资源的关闭
        if(fw != null){

            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

1.3 文本文件的复制

    @Test
    public void testFileReaderFileWriter() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.创建File类的对象,指明读入和写出的文件
            File srcFile = new File("hello.txt");
            File destFile = new File("hello2.txt");

            //不能使用字符流来处理图片等字节数据
//            File srcFile = new File("爱情与友情.jpg");
//            File destFile = new File("爱情与友情1.jpg");


            //2.创建输入流和输出流的对象
             fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);


            //3.数据的读入和写出操作
            char[] cbuf = new char[5];
            int len;//记录每次读入到cbuf数组中的字符的个数
            while((len = fr.read(cbuf)) != -1){
                //每次写出len个字符
                fw.write(cbuf,0,len);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源
            //方式一:
//            try {
//                if(fw != null)
//                    fw.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }finally{
//                try {
//                    if(fr != null)
//                        fr.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
            //方式二:
            try {
                if(fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if(fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

2. FileInputStream / FileOutputStream的使用

  1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  2. 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理 ```java / 实现对图片的复制操作 / @Test public void testFileInputOutputStream() { FileInputStream fis = null; FileOutputStream fos = null; try {

     //1.造文件
     File srcFile = new File("爱情与友情.jpg");
     File destFile = new File("爱情与友情2.jpg");
    
     //2.造流
     fis = new FileInputStream(srcFile);
     fos = new FileOutputStream(destFile);
    
     //3.复制的过程
     byte[] buffer = new byte[5];
     int len;
     while((len = fis.read(buffer)) != -1){
         fos.write(buffer,0,len);
     }
    

    } catch (IOException e) {

     e.printStackTrace();
    

    } finally {

     if(fos != null){
         //4.关闭流
         try {
             fos.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     if(fis != null){
         try {
             fis.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
    
     }
    

    }

} ```

【注意】 相对路径在IDEA和Eclipse中使用的区别?

IDEA: 如果使用单元测试方法,相对路径基于当前的Module的。 如果使用main()测试,相对路径基于当前Project的。

Eclipse: 单元测试方法还是main(),相对路径都是基于当前Project的。