IO、存储、硬盘、文件系统相关常识

1.IO

IO(输入/输出)是一个广泛的概念,通常指代计算机与外部设备(如键盘、鼠标、打印机、显示器等)或其他计算机组件(如磁盘、网络等)之间的数据交换过程。IO 操作可以涉及到多种类型的数据传输和设备。

2.存储和硬盘

 存储的定义: 我们平常意义的存储可能是存储数据的硬盘,在计算机中,用于数据直接处理的是内存,存储数据的是硬盘,内存相较于硬盘来说速度是快成百上千倍的  , 内存是个不可持久化的,对于内存来说,断电后内存中的数据就会清空   外存也就是硬盘,是持久化的数据,断电后外存的数据不会丢失。

  硬盘的定义:硬盘是一种用于存储数据的计算机存储设备,也被称为硬盘驱动器或硬盘。它由一个或多个旋转的磁盘组成,每个磁盘都有一个磁性表面,可以读写数据。硬盘通常安装在计算机的内部,也可以用作外置设备。硬盘是计算机中最基本的存储设备之一,用于存储操作系统、应用软件、文件和其他数据

从内存往上的称为易失存储,硬盘往下的称为持久存储;

易失存储在断电后会丢失数据,以进程为单位管理;变量、对象本质上的编程语言对硬件中内存(易失存储)的抽象

持久存储断电后一般仍能保存,通常可以跨进程读写

各个存储访问速度的一个直观感受:

硬盘(Hard Disk Drive - HDD)的实现:

  1. 磁盘 (利用磁性实现的一种存储方式),一般就指硬盘或者(机械硬盘)
  2. 固态硬盘 (Solid State Disk - SSD)
  3. 闪存 (Flash Memory)

磁盘查找文件的步骤:

  1. 旋转盘片找到对应的扇区
  2. 找到对应的磁道

从磁盘的读取数据的过程中有许多物理操作,因此效率较低

并且磁盘更适合做连续数据的读写,而不适合做随机数据的读写

 3.文件系统       

 3.1.树形结构组织和目录

在硬盘中,存在很多目录和文件,目录之间有存在一些嵌套关系,整体的这一套结构,是一个树形结构,即N叉树。

文件非常多,目录也非常多,目录之间还能嵌套

3.2.文件路径

1.绝对路径 --> Windows是从此电脑这个树根开始进行分层级,所以绝对路径就是从此处开始的,如下图:这个路径就是一个绝对路径,从根目录开始找,一直找到目标文件所在的位置(每经过一个目录就用“\”来分割),所经历的目录就是绝对路径。

2.相对路径 --> 除了绝对路径,我们还可以从任务节点(目录)出发,找到某一个文件(也是找到文件位置所经历的节点),此时所对应的就是相对路径。(从给定的某个目录出发(也叫基准目录/工作目录)所经历的路径)如下图:从Program Files目录开始,找到wab.exe,此时的Program Files就是基准目录(工作目录),Program Files\Windows Mail就是相对路径的表示。

3.3 文件类型

分为俩类:1. 文本文件(简单理解为打开是你能看的懂的英文或者汉字)

                    2. 二进制文件(简单理解为它是给计算机看的,打开是一大堆乱码)

举一些他俩的列子:1. 文本文件:文本文档,.c ,.java,.cpp也是文本文件

                                 2. 二进制文件:图片,音频,视频,可执行程序,动态库都是二进制文件

4.使用java操作文件

Java中通过java.io.File类来对一个文件(目录)进行抽象的描述。注意,有File对象并不代表真存在该文件

4.1 File 概述

我们先来看看File类中的常见属性、构造方法和方法

代码实例:

观察get系列的特点和差异

import java.io.File;
import java.io.IOException;
public static void main(String[] args) throws IOException {
        File f = new File("./hello.txt");
        System.out.println(f.getParent());//返回File对象的⽗⽬录⽂件路径
        System.out.println(f.getName());//返回FIle对象的纯⽂件名称
        System.out.println(f.getPath());//返回File对象的⽂件路径
        System.out.println(f.getAbsolutePath());//返回File对象的绝对路径
        System.out.println(f.getCanonicalPath());//返回File对象修饰过的绝对路径
    }

import java.io.File; 

import java.io.IOException; 

public class Main { 

public static void main(String[] args) throws IOException { 

	File file = new File("hello-world.txt"); // 要求该文件不存在,才能看到相同 

的现象 

	System.out.println(file.exists()); 

	System.out.println(file.isDirectory()); 

	System.out.println(file.isFile()); 

	System.out.println(file.createNewFile()); 

	System.out.println(file.exists()); 

	System.out.println(file.isDirectory()); 

	System.out.println(file.isFile()); 

	System.out.println(file.createNewFile()); 

	} 

}

普通文件删除

import java.io.File; 

import java.io.IOException; 

public class Main { 

public static void main(String[] args) throws IOException { 

	File file = new File("some-file.txt"); // 要求该文件不存在,才能看到相同的现象 

	System.out.println(file.exists()); 

	System.out.println(file.createNewFile()); 

	System.out.println(file.exists()); 

	System.out.println(file.delete()); 

	System.out.println(file.exists()); 

	} 

}

4.2文件内容的读写 —— 数据流

InputStream方法

InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本

可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用

FileInputStream

public class Demo3 {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("E:\\qqfile\\1507665758\\FileRecv\\2024-06-27-IO\\IO\\src\\hello.txt")) {
            byte[] buf = new byte[1024];
            int len; while (true) {
                len = is.read(buf);
                if (len == -1) {
                    // 代表文件已经全部读完
                     break; }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", buf[i]);
                }
            }
        }
    }
}

OutputStream方法

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,

所以使用 FileOutputStream

利用 OutputStreamWriter 进行字符写入

import java.io.*; 

public class Main { 

public static void main(String[] args) throws IOException { 

            try (OutputStream os = new FileOutputStream("output.txt")) { 

                os.write('H'); 

                os.write('e'); 

                os.write('l'); 

                os.write('l'); 

                os.write('o'); 

                // 不要忘记 flush 

                os.flush(); 

			} 

		} 

	}

利⽤PrintWriter找到我们熟悉的⽅法
上述,我们其实已经完成输出⼯作,但总是有所不⽅便,我们接来下将OutputStream处理下,使⽤PrintWriter类来完成输出,因为PrintWriter类中提供了我们熟悉的print/println/printf⽅法
 

import java.io.*;
public class Main {
   public static void main(String[] args) throws IOException {
       try (OutputStream os = new FileOutputStream("output.txt")) {
         try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8
           try (PrintWriter writer = new PrintWriter(osWriter)) {
                writer.println("我是第⼀⾏");
                writer.print("我的第⼆⾏\r\n");
                writer.printf("%d: 我的第三⾏\r\n", 1 + 1);
                writer.flush();
              }
          }
       }
    }
}

相关推荐

  1. 常用文件系统存储类型小整理

    2024-07-20 23:24:03       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 23:24:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 23:24:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 23:24:03       45 阅读
  4. Python语言-面向对象

    2024-07-20 23:24:03       55 阅读

热门阅读

  1. 解决网络游戏频繁掉线的策略与实践

    2024-07-20 23:24:03       16 阅读
  2. Qt项目:基于Qt实现的网络聊天室---好友申请

    2024-07-20 23:24:03       15 阅读
  3. 微软全球大蓝屏:必须手工修复

    2024-07-20 23:24:03       21 阅读
  4. 25、气象填色图绘制

    2024-07-20 23:24:03       13 阅读
  5. 【Flutter】 webview_flutter避坑

    2024-07-20 23:24:03       17 阅读
  6. C++的模板(十二):forward模板

    2024-07-20 23:24:03       16 阅读
  7. Kotlin协程最佳实践

    2024-07-20 23:24:03       11 阅读
  8. SQL Server的魔法工坊:打造数据库的自定义函数

    2024-07-20 23:24:03       20 阅读
  9. Qt判定鼠标是否在该多边形的线条上

    2024-07-20 23:24:03       15 阅读
  10. 什么是虹膜识别技术

    2024-07-20 23:24:03       14 阅读
  11. C++/Qt 信号与槽

    2024-07-20 23:24:03       18 阅读