javajavase

文件字符流

文件的输入

从文件中读取到内存(程序)中
步骤

  1. 建立一个流对象,将已存在的一个文件加载进流 FileReader fr = new FileReader(new File(“Test. txt”));
  2. 创建一个临时存放数据的数组 char[] ch = new char[1024];
  3. 调用流对象的读取方法将流中的数据读入到数组中 fr.read(ch);
  4. 关闭资源 fr.close(); ```java @Test public void testFileReader(){ FileReader fr = null; try {

    1. // 1.实例化File类的对象,指明要操作的文件
    2. File file = new File("hello.txt"); // 相较于当前Module
    3. // 2.提供具体的流
    4. fr = new FileReader(file);
    5. // 3.数据的读入
    6. // read():返回读入的一个字符。如果达到文件末尾,返回-1
    7. // 原始
    8. // int data = fr.read();
    9. // while(data != -1) {
    10. // System.out.print((char)data);
    11. // data = fr.read();
    12. // }
    13. // 改进
    14. int data;
    15. while((data = fr.read()) != -1) {
    16. System.out.print((char)data);
    17. }

    } catch (IOException e) {

    1. e.printStackTrace();

    } finally {

    1. // 4.流的关闭操作
    2. // try {
    3. // if(fr != null)
    4. // fr.close();
    5. // } catch (IOException e) {
    6. // e.printStackTrace();
    7. // }
    8. //或
    9. if(fr != null) {
    10. try {
    11. fr.close();
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. }
    15. }

    } }

public static void main(String[] args) { File file = new File(“hello.txt”); // 相较于当前Project System.out.println(file.getAbsolutePath());

  1. File file1 = new File("day09\\hello.txt");
  2. System.out.println(file1.getAbsolutePath());

}

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

文件的输出

从内存(程序)到硬盘文件中
步骤

  1. 创建流对象,建立数据存放文件 FileWriter fw = new FileWriter(new File(“Test.txt”))
  2. 调用流对象的写入方法,将数据写入流 fw.write(“HelloWord”)
  3. 关闭流资源,并将流中的数据清空到文件中 fw.close();

说明

  • 输出操作,对应的File可以不存在的,不会报异常
  • File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件
  • File对应的硬盘中的文件如果存在

    • 如果流使用的构造器是**FileWriter(file, false)** / **FileWriter(file)** 对原有文件的覆盖
    • 如果流使用的构造器是**FileWriter(file, true)** 对原有文件基础上追加内容

      1. @Test
      2. public void testFileWriter() {
      3. FileWriter fw = null;
      4. try {
      5. File file = new File("hello1.txt");
      6. fw = new FileWriter(file, false);
      7. fw.write("I have a dream!\n");
      8. fw.write("you need to have a dream!");
      9. } catch (IOException e) {
      10. e.printStackTrace();
      11. } finally {
      12. if(fw != null){
      13. try {
      14. fw.close();
      15. } catch (IOException e) {
      16. e.printStackTrace();
      17. }
      18. }
      19. }
      20. }
  • 练习

    1. @Test
    2. public void testFileReaderFileWriter() {
    3. FileReader fr = null;
    4. FileWriter fw = null;
    5. try {
    6. File srcFile = new File("hello.txt");
    7. File destFile = new File("hello2.txt");
    8. // File srcFile = new File("爱情与友情.jpg");
    9. // File destFile = new File("爱情与友情1.jpg");
    10. fr = new FileReader(srcFile);
    11. fw = new FileWriter(destFile);
    12. char[] cbuf = new char[5];
    13. int len;
    14. while((len = fr.read(cbuf)) != -1) {
    15. fw.write(cbuf, 0, len);
    16. }
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. } finally {
    20. try {
    21. if(fw != null)
    22. fw.close();
    23. } catch (IOException e) {
    24. e.printStackTrace();
    25. }
    26. try {
    27. if(fr != null)
    28. fr.close();
    29. } catch (IOException e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. }

    文件字节流

    文件字节流操作与字符流操作类似,只是实例化对象操作和数据类型不同

    1. // 使用字节流FileInputStream处理文本文件,可能出现乱码
    2. @Test
    3. public void testFileInputStream() {
    4. FileInputStream fis = null;
    5. try {
    6. // 1. 造文件
    7. File file = new File("hello.txt");
    8. // 2.造流
    9. fis = new FileInputStream(file);
    10. // 3.读数据
    11. byte[] buffer = new byte[5];
    12. int len;
    13. while((len = fis.read(buffer)) != -1) {
    14. String str = new String(buffer, 0, len);
    15. System.out.print(str);
    16. }
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. } finally {
    20. if(fis != null){
    21. // 4.关闭资源
    22. try {
    23. fis.close();
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }
    28. }
    29. }
  • 练习

    1. // 实现对图片的复制操作
    2. @Test
    3. public void testFileInputOutputStream() {
    4. FileInputStream fis = null;
    5. FileOutputStream fos = null;
    6. try {
    7. File srcFile = new File("爱情与友情.jpg");
    8. File destFile = new File("爱情与友情2.jpg");
    9. fis = new FileInputStream(srcFile);
    10. fos = new FileOutputStream(destFile);
    11. // 复制的过程
    12. byte[] buffer = new byte[5];
    13. int len;
    14. while((len = fis.read(buffer)) != -1){
    15. fos.write(buffer,0,len);
    16. }
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. } finally {
    20. if(fos != null){
    21. try {
    22. fos.close();
    23. } catch (IOException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. if(fis != null){
    28. try {
    29. fis.close();
    30. } catch (IOException e) {
    31. e.printStackTrace();
    32. }
    33. }
    34. }
    35. }
  • 通用操作 ```java // 指定路径下文件的复制 public void copyFile(String srcPath, String destPath) { FileInputStream fis = null; FileOutputStream fos = null; try {

    1. File srcFile = new File(srcPath);
    2. File destFile = new File(destPath);
    3. fis = new FileInputStream(srcFile);
    4. fos = new FileOutputStream(destFile);
    5. byte[] buffer = new byte[1024];
    6. int len;
    7. while((len = fis.read(buffer)) != -1){
    8. fos.write(buffer,0,len);
    9. }

    } catch (IOException e) {

    1. e.printStackTrace();

    } finally {

    1. if(fos != null){
    2. try {
    3. fos.close();
    4. } catch (IOException e) {
    5. e.printStackTrace();
    6. }
    7. }
    8. if(fis != null){
    9. try {
    10. fis.close();
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }
    14. }

    } }

@Test public void testCopyFile(){ long start = System.currentTimeMillis(); String srcPath = “C:\Users\Administrator\Desktop\01-视频.avi”; String destPath = “C:\Users\Administrator\Desktop\02-视频.avi”; // String srcPath = “hello.txt”; // String destPath = “hello3.txt”; // 只是复制不会乱码

  1. copyFile(srcPath, destPath);
  2. long end = System.currentTimeMillis();
  3. System.out.println("复制操作花费的时间为:" + (end - start)); // 618

} ``` 注意点

  • 定义路径时,可以用“/”或“\”。
  • 输出操作,对应的File可以不存在的,并不会报异常
  • File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件
  • File对应的硬盘中的文件如果存在
    • 如果流使用的构造器是:FileWriter(file,false) / FileWriter(file)对原有文件的覆盖
    • 如果流使用的构造器是:FileWriter(file,true)不会对原有文件覆盖,而是在原有文件基础上追加内容
  • 读取文件时,必须保证文件存在,否则会报异常
  • 对于文本文件(.txt, .java, .c, .cpp),使用字符流处理
  • 对于非文本文件(.jpg, .mp3, .mp4, .avi, .doc, .ppt, …),使用字节流处理