java中IO操作之文件IO操作

一、什么是IO

1.IO概念
  • I:input,即输入
  • O:output,即输出

所谓IO就是数据流的从一个媒介到另外一个媒介的流动过程

文件IO的过程

  • 应用程序将设备1中的内容读取出来存入到内存中
  • 再将内存中的数据输出到设备2中
2.IO的分类

IO知识体系

二、JAVA中的文件处理

文件操作主要以以下几个类:

  • 文件本身:文件名等操作
    • File
  • 文件内容:文件内容的读写
    • 字节流:对二进制文件
      • InputStream
      • OutputStream
    • 字符流:普通字符类文件
      • Reader
      • Writer

IO操作的主要类

1、文件操作的基本步骤
  • (1)打开文件,通过File类的实例化方法
  • (2)使用输入流读取文件内容或输出流输出数据到文件
  • (3)关闭输入或输出流
  1. /**
  2. * 第一步:打开文件
  3. */
  4. File file = new File("resource/static/test.txt");
  5. /**
  6. * 第二步:通过输入流InputStream读取内容
  7. */
  8. FileInputStream fileInputStream = null;
  9. try {
  10. fileInputStream = new FileInputStream(file);
  11. } catch (FileNotFoundException e) {
  12. e.printStackTrace();
  13. }
  14. byte[] content = new byte[100];
  15. StringBuffer bf = new StringBuffer();
  16. int len = 0;
  17. while (true) {
  18. try {
  19. if (!((len = fileInputStream.read(content)) > 0)) break;
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. bf.append(new String(content));
  24. }
  25. /**
  26. * 第三步:关闭流
  27. */
  28. try {
  29. fileInputStream.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. System.out.println(bf);
2.文件本身的操作
(1)获取文件对象:实例化File

主要方法

  • new File(String filename) : 通过文件名来实例化(包括路径和文件名)
  • new File(String filename, int prefixLength) : 指定文件前缀的长度
  • new File(String parent, String child):批定文件的上级目录和文件名
  • new File(URI uri):通过一个uri来实例化一个文件对象(而且是文件协议的即:file//)
  1. File file = new File("resource/static/test.txt");
  2. File f2 = new File("resource/static/", "test.txt");
  • 文件相对路径是相对于当前项目的地址而言的,如当前项目路径如下为/data/program/javaapp/java-demo,那么相对目录就是以项目目录为基准的
    • src : 项目源码目录
    • resource : 资源目录
(2)获取文件本身的属性
  • getName : 获取文件名称(不带路径)
  • getPath : 获取文件路径(相对路径)
  • getAbsolutePath:获取文件绝对路径
  • length : 文件大小
  • lastModified : 文件更改时间
  • setLastModified : 设置文件上次更改时间
  • isFile : 是否是文件
  • isHidden : 是否为隐藏文件
  1. File file = new File("resource/static/test.txt");
  2. System.out.println(file.getName()); //test.txt
  3. System.out.println(file.getPath()); //resource/static/test.txt 输入时的相对路径
  4. System.out.println(file.getAbsolutePath()); //绝对路径:/data/program/javaapp/java-demo/resource/static/test.txt
  5. System.out.println(file.length()); //164
  6. System.out.println(file.lastModified()); //1547374534000
  7. System.out.println(file.isFile()); //true
  8. System.out.println(file.isHidden()); //false
  9. file.setLastModified(System.currentTimeMillis());
  10. System.out.println(file.lastModified()); //1547375526000
(3)文件本身操作
  • getName : 获取文件名,包括后缀
  • getParent : 获取目录名称
  • createNewFile : 创建新文件
  • File.createTempFile : 创建临时文件
  • exists : 判断文件是否存在
  • renameTo : 重命名
  • delete : 删除文件
  1. File f1 = new File("resource/static/test.txt");
  2. System.out.println(f1.getParent()); //获取文件目录
  3. System.out.println(f1.getName()); //获取文件名,包括后缀
  4. File f2 = new File("resource/static/poem.txt");
  5. if (!f2.exists()) { //判断文件是否存在
  6. try {
  7. f2.createNewFile(); //不存在,则创建一个新文件
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. File f3 = new File("resource/static/p.txt");
  13. f2.renameTo(f3); //重命名,类似于剪切功能
  14. f2.delete(); //删除文件
  15. File tmp = new File("resource/static/");
  16. try {
  17. File.createTempFile("temp", "t", tmp); //temp7621465932314322067t
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
(4)文件读写权限获取和设置
  • canRead : 是否可读
  • canWrite: 是否可写
  • canExecute : 是否可执行
  • setReadOnly : 设置只读
  • setReadAble: 设置可读
  • setWritable : 设置可写
  • setExecutable : 设置可执行
  1. File f1 = new File("resource/static/test.txt");
  2. System.out.println(f1.canRead()); //true
  3. System.out.println(f1.canWrite()); //true
  4. System.out.println(f1.canExecute()); //false
  5. f1.setReadOnly();
  6. f1.setReadable(true);
  7. f1.setWritable(true);
  8. f1.setExecutable(true);
(5)目录操作
  • isDirectory : 是否是目录
  • list : 列出目录下所有的文件(只显示下一级)
  • listFiles : 列出目录下所有的文件对象
  • listRoots : 列出根目录下所有的文件
  • mkdir : 创建目录
  • mkdirs : 递归创建目录
  1. File file = new File("resource/temp");
  2. System.out.println(file.isDirectory());
  3. file.mkdir();
  4. File fd = new File("resource/log/nginx"); //log和log/nginx都不存在
  5. fd.mkdirs();
  6. File dir = new File("resource/");
  7. String[] files = dir.list();
  8. for (int i = 0; i< files.length; i++) {
  9. System.out.println("文件:"+files[i]);
  10. }
  11. File[] fileList = dir.listFiles();
  12. for (int i = 0; i< fileList.length; i++) {
  13. System.out.println("文件对象:"+fileList[i].getName());
  14. }
  15. File[] rootFiles = File.listRoots();
  16. for (int i = 0; i< rootFiles.length; i++) {
  17. System.out.println("根目录:"+rootFiles[i].getName());
  18. }
(6)获取空间信息
  • getTotalSpace : 总空间
  • getFreeSpace : 空闲空间
  • getUsableSpace : 可使用的空间
  1. File file = new File("resource");
  2. System.out.println(file.getTotalSpace()); //205349208064
  3. System.out.println(file.getFreeSpace()); //145362571264
  4. System.out.println(file.getUsableSpace()); //134860034048
3.文件内容的操作
(1)字节流
  • InputStream:输入流
    • read方法
  • OutputStream:输出流
    • write方法
(2)字符流
  • Reader:读入流
    • read : 读方法
  • Writer : 写出流
    • write : 写方法
(3)实现文件复制
  1. /**
  2. * 文件复制
  3. * @param sourceFileName 源文件
  4. * @param destFileName 复制后的文件
  5. * @return
  6. */
  7. public static boolean copy(String sourceFileName, String destFileName) {
  8. /**
  9. * 1.构造输入输出文件对象
  10. */
  11. File inputFile = new File(sourceFileName);
  12. File outputFile = new File(destFileName);
  13. /**
  14. * 2.判断复制后的文件目录是否存在,不存在就创建
  15. */
  16. File parent = outputFile.getParentFile();
  17. if (!parent.exists()) {
  18. parent.mkdirs();
  19. }
  20. /**
  21. * 3.判断复制后的文件是否存在,不存在就创建文件
  22. */
  23. if (!outputFile.exists()) {
  24. try {
  25. outputFile.createNewFile();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. /**
  31. * 4.定义用来存储文件内容的buffer
  32. */
  33. byte[] buffer = new byte[1024];
  34. int len = 0;
  35. FileInputStream inputStream = null;
  36. /**
  37. * 5.构建文件输入流对象
  38. */
  39. try {
  40. inputStream = new FileInputStream(inputFile);
  41. } catch (FileNotFoundException e) {
  42. e.printStackTrace();
  43. }
  44. /**
  45. * 6.构建文件输出流对象
  46. */
  47. FileOutputStream outputStream = null;
  48. try {
  49. outputStream = new FileOutputStream(outputFile);
  50. } catch (FileNotFoundException e) {
  51. e.printStackTrace();
  52. }
  53. /**
  54. * 7.读文件,并写入到目录文件
  55. */
  56. while (true) {
  57. try {
  58. if (!((len = inputStream.read(buffer)) > 0)) break;
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. try {
  63. /**
  64. * 判断读出的长度,是否为buffer的长度,如果没达到,说明buffer后面的内容为空格
  65. */
  66. if (len < buffer.length) {
  67. byte[] tmp = new byte[len];
  68. for (int i = 0; i < len; i++) {
  69. tmp[i] = buffer[i];
  70. }
  71. /**
  72. * 调用数组复制的方法
  73. */
  74. System.arraycopy(buffer, 0, tmp, 0, len);
  75. buffer = tmp;
  76. }
  77. outputStream.write(buffer);
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. /**
  83. * 8.关闭文件流
  84. */
  85. try {
  86. outputStream.close();
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. }
  90. try {
  91. inputStream.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. return true;
  96. }