• IO应知应会


    目录

    硬件体系:处理器CPU,存储器(内存),输入设备,输出设备

    各个硬件读写速度的比较

    文件路径:从文件系统这个树上,找到唯一确定得位置,这个节点可以不存在。

    绝对路径:从文件树得根节点出发,找到某一个文件得节点位置,就为绝对路径

    相对路径:从当前文件节点出发,另一个节点相对于当前节点得位置

    File类:

    构造方法

     普通方法:

    删除文件delete()

     文件的读写

    文件的读数据:FileInputStream

     写OutputStream:

    文件的复制

    文件夹的复制

    模拟OJ测试文档的编写


    硬件体系:处理器CPU,存储器(内存),输入设备,输出设备

    硬盘——存储:

    各个硬件读写速度的比较

    文件路径:从文件系统这个树上,找到唯一确定得位置,这个节点可以不存在。

    绝对路径:从文件树得根节点出发,找到某一个文件得节点位置,就为绝对路径

    相对路径:从当前文件节点出发,另一个节点相对于当前节点得位置

    . . :表示回到上一级目录

    . :表示当前目录

    当前目录:进程得启动目录,

    路径得描述:

    绝对路径:\ : 路径分隔符

    window:D:\ files \ a.txt  根盘符 : \ 文件名 \ 文件.后缀名

    linux:/ mac: D: / 文件夹 / 文件名

    相对路径:进程启动时的目录

    1. public class 相对路径 {
    2. public static void main(String[] args) throws IOException {
    3. File file = new File("./a.txt");
    4. System.out.println(file.getCanonicalPath());
    5. }
    6. }

    当前在file文件夹 : 描述a.txt 就为 : file\a.txt

    代码中得路径: windows中 \ 表示转义 ,所以 windows中得代码: D:\\file\\a.txt

    java是一个跨平台得语言,所以代码中可以不区分正反斜杠

    File类:

    构造方法

     普通方法:

     

    删除文件delete()

    只能删除叶子节点或者空得文件夹;

    deleteOnExit() : 在程序退出时删除文件;

    删除非空得文件夹,只能先将文件夹删除为空,才能删除该文件夹

     文件得创建与判断

    windows上删除文件相当于剪切复制,将文件从当前节点复制回收站中,

    delete()方法是将文件系统中真正的删除掉,不进入回收站

    1. package com.yyk.io.IO操作文件;
    2. import java.io.File;
    3. import java.io.IOException;
    4. import java.util.ArrayDeque;
    5. import java.util.Arrays;
    6. import java.util.Date;
    7. import java.util.Deque;
    8. public class FileMetohd {
    9. public static void main(String[] args) throws IOException {
    10. File file = new File("D:\\IO\\.\\..\\..\\IO\\hello.txt");
    11. System.out.println("文件存在吗:"+file.exists());
    12. System.out.println("是文件夹吗:"+file.isDirectory());
    13. System.out.println("是文件吗" + file.isFile());
    14. System.out.println("***********在该路径下创建hello.txt*******");
    15. file.createNewFile();
    16. System.out.println("文件存在吗:"+file.exists());
    17. System.out.println("是文件夹吗:"+file.isDirectory());
    18. System.out.println("是文件吗" + file.isFile());
    19. System.out.println();
    20. System.out.println("********获取文件得路径**********");
    21. System.out.println("文件得绝对路径:" +file.getAbsoluteFile());//返回得是文件
    22. System.out.println("文件得绝对路径:" +file.getAbsolutePath());//返回得是字符串
    23. System.out.println("文件得权威绝对路径:" +file.getCanonicalFile());//返回得是文件,将中间的没有意义的点去掉
    24. System.out.println("文件得权威绝对路径:" +file.getCanonicalPath());//返回得是字符串,去掉中间的文件..和.
    25. System.out.println("文件名:" + file.getName());
    26. System.out.println("文件的父路径:" + file.getParent());
    27. System.out.println("文件的父路径的权威路径:" + file.getParentFile().getCanonicalPath());
    28. System.out.println("文件的大小:" + file.length());
    29. System.out.println("用绝对路径创建的文件吗:" +file.isAbsolute());
    30. System.out.println("文件被隐藏吗:" +file.isHidden());
    31. System.out.println("文件最后一次被修改的时间:" + new Date(file.lastModified()));
    32. System.out.println("该文件的父目录下的文件个数:" + Arrays.toString(file.getParentFile().listFiles()));
    33. System.out.println();
    34. System.out.println("********文件的深度优先遍历***********");
    35. DFSFilePath(file.getParentFile());
    36. System.out.println();
    37. System.out.println("********文件的广度优先遍历***********");
    38. NFSFilePath(file.getParentFile());
    39. System.out.println("文件系统的根目录" + file.listRoots());
    40. System.out.println();
    41. System.out.println("*****mkdir****创建文件夹*******mkdirs****");
    42. File file1 = new File("D:\\IO\\A\\BB\\CCC");
    43. file1.mkdirs();
    44. System.out.println("mkdirs创建不存在路径下的文件夹" + file1.getCanonicalPath());
    45. File file2 = new File("D:\\IO\\D");
    46. file2.mkdir();
    47. System.out.println("mkdir在已经存在的目录下创建文件夹:" + file2.getCanonicalPath());
    48. System.out.println("重命名文件:" );
    49. File dest = new File("D:\\IO\\你好.txt");
    50. System.out.print(file.getName()+" 被重命名为 ");
    51. file.renameTo(dest);
    52. dest.delete();//删除文件夹
    53. System.out.println(dest.getName());
    54. System.out.println("文件的重命名相当于文件的剪切复制");
    55. }
    56. /**
    57. * 文件的深度优先遍历
    58. * @param dir
    59. */
    60. public static void DFSFilePath(File dir) throws IOException {
    61. File[] files = dir.listFiles();
    62. if (dir == null){
    63. return;
    64. }
    65. for (File file: files) {
    66. if (file.isDirectory()){
    67. System.out.println(dir.getCanonicalPath()+"目录下的"+file.getName()+"文件夹");
    68. DFSFilePath(file);
    69. }else {
    70. System.out.println(dir.getCanonicalPath()+"目录下的"+file.getName()+"文件");
    71. }
    72. }
    73. }
    74. /**
    75. * 文件广度优先遍历
    76. * @param dir
    77. * @throws IOException
    78. */
    79. public static void NFSFilePath(File dir) throws IOException {
    80. Deque fileDeque = new ArrayDeque<>();
    81. fileDeque.offer(dir);
    82. while (!fileDeque.isEmpty()){
    83. File file = fileDeque.poll();
    84. if (file.isDirectory()){
    85. File[] files = file.listFiles();
    86. for (File f:files) {
    87. fileDeque.offer(f);
    88. }
    89. System.out.println("文件夹:" + file.getCanonicalPath());
    90. }else {
    91. System.out.println("文件:" + file.getCanonicalPath());
    92. }
    93. }
    94. }
    95. }

     文件的读写

    文件的读数据:FileInputStream

    1,以字节流形式进行文件的读操作

    概念模型:

     

    2,以字符流方式进行文件的读操作(文本方式的文件)

    无论是字节流还是字符流,都是用Scanner类来读取数据

    1. public class 读数据都用Scanner {
    2. public static void main(String[] args) throws Exception{
    3. try(InputStream is = new FileInputStream("./hello.txt")){
    4. try(Scanner scanner = new Scanner(is,"UTF-8")){
    5. while (scanner.hasNextLine()){
    6. String next = scanner.nextLine();
    7. System.out.println(next);
    8. }
    9. }
    10. }
    11. }
    12. }

     写OutputStream:

    写数据在关闭资源的时候,需要对缓冲区进行刷盘,避免缓冲区中还未写入的数据。

     

    文件的复制

    1. public class 文件复制 {
    2. public static void main(String[] args) throws Exception {
    3. InputStream is = new FileInputStream("D:\\IO\\12.jpg");
    4. byte[] buff = new byte[10240];//缓冲区,用来匹配内存和硬盘之间读写速度的差距
    5. OutputStream os = new FileOutputStream("D:\\IO\\34.jpg");
    6. while (true){
    7. int read = is.read(buff);
    8. if (read == -1){//如果是EOS,便是没有数据了,直接退出
    9. break;
    10. }
    11. os.write(buff);//将读到缓冲区的字节全部写入文件中
    12. os.flush();//最后冲刷缓冲区
    13. }
    14. }
    15. }

    文件夹的复制

    1. package com.yyk.io.IO操作文件;
    2. import java.io.*;
    3. public class 文件夹复制 {
    4. static File srcFile = new File("D:\\IO\\A");//源文件目录
    5. static File tarFile = new File("D:\\IO\\D"); //目标文件目录
    6. public static void main(String[] args) throws Exception{
    7. copy(srcFile);
    8. }
    9. private static void copy(File dirFile) throws Exception {
    10. File[] files = dirFile.listFiles();
    11. if (files == null){
    12. return;
    13. }
    14. for (File file:files) {
    15. String filePath = file.getCanonicalPath();//当前文件的目录
    16. String tarFilePath = tarFile.getCanonicalPath();//需要复制的文件的根目录
    17. String aimPath= tarFilePath + filePath.substring(srcFile.getCanonicalPath().length());//需要复制的目录
    18. File aimFile = new File(aimPath);
    19. if (file.isDirectory()) {//如果是文件夹,创建文件夹
    20. aimFile.mkdir();
    21. //就继续遍历
    22. copy(file);
    23. }else if (file.isFile()){
    24. copyFile(file,aimFile);
    25. }
    26. }
    27. }
    28. public static void copyFile(File file,File aimFile) throws Exception {
    29. InputStream is = new FileInputStream(file);
    30. byte[] buff = new byte[10240];//缓冲区,用来匹配内存和硬盘之间读写速度的差距
    31. OutputStream os = new FileOutputStream(aimFile);
    32. while (true){
    33. int read = is.read(buff);
    34. // System.out.println("读到了"+read+"个字节");
    35. if (read == -1){//如果是EOS,便是没有数据了,直接退出
    36. break;
    37. }
    38. os.write(buff,0,read);//将读到缓冲区的字节全部写入文件中
    39. os.flush();//最后冲刷缓冲区
    40. }
    41. }
    42. }

    模拟OJ测试文档的编写

    1. package com.yyk.io.IO操作文件.oj;
    2. public class Node {
    3. int val ;
    4. Node next;
    5. public Node(int val){
    6. this.val = val;
    7. }
    8. }
    1. package com.yyk.io.IO操作文件.oj;
    2. public class Solution {
    3. public Node reverse(Node head){
    4. Node prev = null;
    5. Node cur = head;
    6. while (cur != null){
    7. Node next = cur.next;
    8. cur.next = prev;
    9. prev = cur;
    10. cur =next;
    11. }
    12. return prev;
    13. }
    14. }
    1. package com.yyk.io.IO操作文件.oj;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.InputStream;
    5. import java.io.OutputStream;
    6. import java.util.Scanner;
    7. public class 测试用例的检验 {
    8. static Solution solution = new Solution();
    9. static File inputFile = new File("D:\\IO\\C\\input.txt");
    10. static File resFile = new File("D:\\IO\\C\\output.txt");
    11. public static void main(String[] args){
    12. try{
    13. //按行读输入输出文件
    14. InputStream is = new FileInputStream(inputFile);//输入
    15. InputStream res = new FileInputStream(resFile);//结果
    16. Scanner isSc = new Scanner(is,"UTF-8");
    17. Scanner resSc = new Scanner(res,"UTF-8");
    18. while (isSc.hasNextLine()){
    19. String inStr = isSc.nextLine();
    20. String resStr = resSc.nextLine();
    21. test(inStr,resStr);
    22. }
    23. System.out.println("通过所有测试用例");
    24. }catch (Exception e){
    25. }
    26. }
    27. private static void test(String inStr,String resStr){
    28. StringBuilder sb = new StringBuilder();
    29. try {
    30. //将instr按找空格隔开,转为int,创建链表然后反转
    31. String[] strs = inStr.split(" ");
    32. Node head = new Node(-1);
    33. Node tem = head;
    34. for (String s:strs) {
    35. Node node = new Node(Integer.parseInt(s));
    36. tem.next = node;
    37. tem = node;
    38. }
    39. Node newNode = solution.reverse(head.next);//反转后的新链表
    40. //遍历链表转为字符串
    41. while (newNode != null){
    42. sb.append(newNode.val + " ");
    43. newNode = newNode.next;
    44. }
    45. //最后去掉最后一个空格
    46. sb.delete(sb.length() - 1,sb.length());
    47. if (!resStr.equals(sb.toString())){
    48. System.out.println("输入用例:" + inStr);
    49. System.out.println("期望输出:" + resStr);
    50. System.out.println("实际输出:" + sb.toString());
    51. System.exit(1);
    52. }
    53. }catch (Exception e){
    54. System.out.println("输入用例:" + inStr);
    55. System.out.println("期望输出:" + resStr);
    56. System.out.println("实际输出:" + sb.toString());
    57. e.printStackTrace();
    58. }
    59. }
    60. }

  • 相关阅读:
    【生产力++】脚本自动化提取待复习内容 极大提高复习效率(下)
    Java开发常用服务端口整理
    Java医院绩效考核管理系统源码,设有手工录入功能(可以批量导入)
    【面试:并发篇35:多线程:设计模式】享元模式
    json、pikcle序列化模块
    硬件及接口学习总结
    nginx测试配置文件的问题
    R语言计算两个向量成对元素的最小值:使用pmin函数计算dataframe数据中多个数据列的逐行最小值
    Linux相关命令整理
    Sass样式使用集锦
  • 原文地址:https://blog.csdn.net/qq_52655865/article/details/125864135