1、FileReader读入数据的基本操作

1.1、读取文件【四个步骤】

建立一个流对象,将已存在的一个文件加载进流。

  1. FileReaderfr= new FileReader(new File(“Test.txt”));

创建一个临时存放数据的数组。

  1. char[] ch= new char[1024];

调用流对象的读取方法将流中的数据读入到数组中

  1. fr.read(ch);

关闭资源

  1. fr.close();
  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. /**
  6. * 一、流的分类:
  7. * 1.操作数据单位:字节流、字符流
  8. * 2.数据的流向:输入流、输出流
  9. * 3.流的角色:节点流、处理流
  10. *
  11. * 二、流的体系结构
  12. * 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
  13. * InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
  14. * OutputStream FileOutputStream (write(byte[] buffer,0,len) BufferedOutputStream (write(byte[] buffer,0,len) / flush()
  15. * Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine())
  16. * Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush()
  17. */
  18. public class FileReaderWriterTest {
  19. public static void main(String[] args) {
  20. File file = new File("hello.txt");//相较于当前工程
  21. System.out.println(file.getAbsolutePath());
  22. File file1 = new File("day09\\hello.txt");
  23. System.out.println(file1.getAbsolutePath());
  24. }
  25. /**
  26. * 将day09下的hello.txt文件内容读入程序中,并输出到控制台
  27. *
  28. * 说明点:
  29. * 1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
  30. * 2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
  31. * 3. 读入的文件一定要存在,否则就会报FileNotFoundException。
  32. *
  33. */
  34. @Test
  35. public void test(){
  36. FileReader fr = null;
  37. try {
  38. //实例化File对象,指明要操作的文件
  39. File file = new File("hello.txt");//相较于当前的Module
  40. //2.提供具体的流
  41. fr = new FileReader(file);
  42. //3.数据的读入过程
  43. //read():返回读入的一个字符。如果达到文件末尾,返回-1.
  44. //方式一:
  45. // int data = fr.read();
  46. // while(data != -1){
  47. // System.out.print((char) data);
  48. // data = fr.read();
  49. // }
  50. //方式二:语法上针对于方式一的修改
  51. int data;
  52. while((data = fr.read()) != -1){
  53. System.out.print((char) data);
  54. }
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }finally {
  58. //4.流的关闭操作
  59. // try {
  60. // if(fr != null)
  61. // fr.close();
  62. // } catch (IOException e) {
  63. // e.printStackTrace();
  64. // }
  65. //或
  66. if(fr != null){
  67. try {
  68. fr.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. }
  75. }

2、FileReader中使用read(char[] cbuf)读入数据

  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. public class FileReaderWriterTest {
  6. //对read()操作升级:使用read的重载方法
  7. @Test
  8. public void test2(){
  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. fr.read(cbuf);
  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. }
  51. }

3、FileWriter写出数据的操作

1、写入文件
创建流对象,建立数据存放文件

  1. FileWriterfw= new FileWriter(new File(“Test.txt”));

调用流对象的写入方法,将数据写入流

  1. fw.write(“atguigu-songhongkang”);

关闭流资源,并将流中的数据清空到文件中

  1. fw.close();
  1. import org.junit.Test;
  2. import java.io.*;
  3. public class FileReaderWriterTest {
  4. /**
  5. * 从内存中写出数据到硬盘的文件里。
  6. *
  7. * 说明:
  8. * 1.输出操作,对应的File可以不存在的。并不会报异常
  9. * 2.
  10. * File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
  11. * File对应的硬盘中的文件如果存在:
  12. * 如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖
  13. * 如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容
  14. */
  15. @Test
  16. public void test3(){
  17. FileWriter fw = null;
  18. try {
  19. //1.提供File类的对象,指明写出到的文件
  20. File file = new File("hello1.txt");
  21. //2.提供FileWriter的对象,用于数据的写出
  22. fw = new FileWriter(file,false);
  23. //3.写出的操作
  24. fw.write("I have a dream!\n");
  25. fw.write("you need to have a dream!");
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. } finally {
  29. //4.流资源的关闭
  30. if(fw != null){
  31. try {
  32. fw.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. }

4、使用FileReader和FileWriter实现文本文件的复制

  1. import org.junit.Test;
  2. import java.io.*;
  3. public class FileReaderWriterTest {
  4. @Test
  5. public void test4() {
  6. FileReader fr = null;
  7. FileWriter fw = null;
  8. try {
  9. //1.创建File类的对象,指明读入和写出的文件
  10. File srcFile = new File("hello1.txt");
  11. File srcFile2 = new File("hello2..txt");
  12. //不能使用字符流来处理图片等字节数据
  13. // File srcFile = new File("爱情与友情.jpg");
  14. // File srcFile2 = new File("爱情与友情1.jpg");
  15. //2.创建输入流和输出流的对象
  16. fr = new FileReader(srcFile);
  17. fw = new FileWriter(srcFile2);
  18. //3.数据的读入和写出操作
  19. char[] cbuf = new char[5];
  20. int len;//记录每次读入到cbuf数组中的字符的个数
  21. while((len = fr.read(cbuf)) != -1){
  22. //每次写出len个字符
  23. fw.write(cbuf,0,len);
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. } finally {
  28. //4.关闭流资源
  29. //方式一:
  30. // try {
  31. // if(fw != null)
  32. // fw.close();
  33. // } catch (IOException e) {
  34. // e.printStackTrace();
  35. // }finally{
  36. // try {
  37. // if(fr != null)
  38. // fr.close();
  39. // } catch (IOException e) {
  40. // e.printStackTrace();
  41. // }
  42. // }
  43. //方式二:
  44. try {
  45. if(fw != null)
  46. fw.close();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. try {
  51. if(fr != null)
  52. fr.close();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }

5、使用FileInputStream不能读取文本文件的测试

  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. /**
  6. * 测试FileInputStream和FileOutputStream的使用
  7. *
  8. * 结论:
  9. * 1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  10. * 2. 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理
  11. */
  12. public class FileIOPutTest {
  13. //使用字节流FileInputStream处理文本文件,可能出现乱码。
  14. @Test
  15. public void testFileInputStream(){
  16. FileInputStream fis = null;
  17. try {
  18. //1.造文件
  19. File file = new File("hello.txt");
  20. //2.造流
  21. fis = new FileInputStream(file);
  22. //3.读数据
  23. byte[] buffer = new byte[5];
  24. int len;//记录每次读取的字节的个数
  25. while((len = fis.read(buffer)) != -1){
  26. String str = new String(buffer,0,len);
  27. System.out.print(str);
  28. }
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }finally {
  32. if(fis != null) {
  33. //4.关闭资源
  34. try {
  35. fis.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }
  42. }

6、使用FileInputStream和FileOutputStream读写非文本文件

  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. public class FileIOPutTest {
  7. /**
  8. * 实现对图片的复制操作
  9. */
  10. @Test
  11. public void testFileInputOutputStream() {
  12. FileInputStream fis = null;
  13. FileOutputStream fos = null;
  14. try {
  15. //1.造文件
  16. File srcFile = new File("爱情与友情.jpg");
  17. File destFile = new File("爱情与友情2.jpg");
  18. //2.造流
  19. fis = new FileInputStream(srcFile);
  20. fos = new FileOutputStream(destFile);
  21. //3.复制的过程
  22. byte[] buffer = new byte[5];
  23. int len;
  24. //4.读数据
  25. while((len = fis.read(buffer)) != -1){
  26. fos.write(buffer,0,len);
  27. }
  28. System.out.println("复制成功");
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. } finally {
  32. if(fos != null){
  33. //5.关闭资源
  34. try {
  35. fos.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. if(fis != null){
  41. try {
  42. fis.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }
  49. }

7、使用FileInputStream和FileOutputStream复制文件的方法测试

  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. public class FileIOPutTest {
  7. //指定路径下文件的复制
  8. public void copyFile(String srcPath,String destPath){
  9. FileInputStream fis = null;
  10. FileOutputStream fos = null;
  11. try {
  12. //
  13. File srcFile = new File(srcPath);
  14. File destFile = new File(destPath);
  15. //
  16. fis = new FileInputStream(srcFile);
  17. fos = new FileOutputStream(destFile);
  18. //复制的过程
  19. byte[] buffer = new byte[1024];
  20. int len;
  21. while((len = fis.read(buffer)) != -1){
  22. fos.write(buffer,0,len);
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. } finally {
  27. if(fos != null){
  28. //
  29. try {
  30. fos.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. if(fis != null){
  36. try {
  37. fis.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44. @Test
  45. public void testCopyFile(){
  46. long start = System.currentTimeMillis();
  47. // String srcPath = "C:\\Users\\29433\\Desktop\\164.jpg";
  48. // String destPath = "C:\\Users\\29433\\Desktop\\164.jpg";
  49. String srcPath = "hello.txt";
  50. String destPath = "hello3.txt";
  51. copyFile(srcPath,destPath);
  52. long end = System.currentTimeMillis();
  53. System.out.println("复制操作花费的时间为:" + (end - start));//1
  54. }
  55. }