File类

  1. File类的一个对象代表一个文件或一个文件目录
    2. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
    3. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”位置”

简单文件操作

IO流基本概念 - 图1

  • 文件的特性是:不存在文件则创建,存在则覆盖。
  • 如果需要续写操作,可以在第二个参数里面传入true



IO流

IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中

流的分类

  1. 操作数据单位:字节流(8bits)、字符流(16bits)
  • 字节流指传送的数据,其分解为字节进行转发传送,当字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字(所以如果要操作文字数据,优先考虑字符流)
  • 字符流 = 字节流+编码表


    2.数据的流向:输入流、输出流

  • 输入输出流指硬盘与内存之间的写入与读取操作

3.流的角色:节点流、处理流

  • 节点流:可以直接从数据源或目的地读写数据的流
  • 处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装的流。目的主要是简化操作和提高性能。

IO流常用基类

image.png

注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

  • Inputstream的子类 Filelnputstrean.
  • Reader的子类 FileReader

字节流、字符流的输入输出

实现步骤:
①创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
②创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③具体的读入过程:创建相应的byte[ ] (字节流)或 char[ ](字符流)
具体的写出过程:write(char[ ] / byte[ ] buffer, 0, len)
④关闭流资源

代码实现:

  1. @Test
  2. public void test01() throws IOException {
  3. // 1.File 类的实例化
  4. File file = new File("E:\\CodeBase\\代码demo篇\\javaSE\\src\\宋红康_Java复习\\IOStrean\\hello.txt");
  5. // 2.FileReader流的实例化
  6. FileReader fileReader = new FileReader(file);
  7. // 3.读入的操作
  8. char[] cbuff = new char[1024];
  9. int len = 0;
  10. // read方法每读取几个字符,就会将个数返回,当达到文件末尾时,就会返回-1
  11. while((len = fileReader.read(cbuff)) != -1){
  12. for (int i = 0; i < len; i++) {
  13. System.out.print(cbuff[i]);
  14. }
  15. }
  16. // 4.资源的关闭
  17. fileReader.close();
  18. }

利用IO流复制:

IO流基本概念 - 图3

  • 使用数组进行读取操作,可以提高读取速率,比起一个字符一个字符的读快上不少

缓冲流的读写

作用:提高流的读取、写入的速度
提高读写速度的原因:内部提供了一个缓冲区。默认情况下是8kb(减少了写入操作的次数)

读取非文本文件时:

  1. @Test
  2. public void test02(String srcPath,String destPath) throws IOException{
  3. //实现文件复制的方法
  4. BufferedInputStream bis = null;
  5. BufferedOutputStream bos = null;
  6. try {
  7. //1.造文件
  8. File srcFile = new File(srcPath);
  9. File destFile = new File(destPath);
  10. //2.造流
  11. //2.1 造节点流
  12. FileInputStream fis = new FileInputStream((srcFile));
  13. FileOutputStream fos = new FileOutputStream(destFile);
  14. //2.2 造缓冲流(包装)
  15. bis = new BufferedInputStream(fis);
  16. bos = new BufferedOutputStream(fos);
  17. //3.复制的细节:读取、写入(跟字符流类似)
  18. byte[] buffer = new byte[1024];
  19. int len;
  20. while((len = bis.read(buffer)) != -1){
  21. bos.write(buffer,0,len);
  22. }
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. } finally {
  26. //4.资源关闭
  27. //要求:先关闭外层的流,再关闭内层的流
  28. if(bos != null){
  29. bos.close();
  30. }
  31. if(bis != null){
  32. bis.close();
  33. }
  34. }
  35. }
  • 关闭外层流的同时,内层流也会自动的进行关闭。 因此关于内层流的关闭,我们可以省略

读取文本文件时(可以采用一次读一行的操作):
image.png