IO、存储、硬盘、文件系统相关常识
1.IO
IO(输入/输出)是一个广泛的概念,通常指代计算机与外部设备(如键盘、鼠标、打印机、显示器等)或其他计算机组件(如磁盘、网络等)之间的数据交换过程。IO 操作可以涉及到多种类型的数据传输和设备。
2.存储和硬盘
存储的定义: 我们平常意义的存储可能是存储数据的硬盘,在计算机中,用于数据直接处理的是内存,存储数据的是硬盘,内存相较于硬盘来说速度是快成百上千倍的 , 内存是个不可持久化的,对于内存来说,断电后内存中的数据就会清空 外存也就是硬盘,是持久化的数据,断电后外存的数据不会丢失。
硬盘的定义:硬盘是一种用于存储数据的计算机存储设备,也被称为硬盘驱动器或硬盘。它由一个或多个旋转的磁盘组成,每个磁盘都有一个磁性表面,可以读写数据。硬盘通常安装在计算机的内部,也可以用作外置设备。硬盘是计算机中最基本的存储设备之一,用于存储操作系统、应用软件、文件和其他数据
从内存往上的称为易失存储,硬盘往下的称为持久存储;
易失存储在断电后会丢失数据,以进程为单位管理;变量、对象本质上的编程语言对硬件中内存(易失存储)的抽象
持久存储断电后一般仍能保存,通常可以跨进程读写
各个存储访问速度的一个直观感受:
硬盘(Hard Disk Drive - HDD)的实现:
- 磁盘 (利用磁性实现的一种存储方式),一般就指硬盘或者(机械硬盘)
- 固态硬盘 (Solid State Disk - SSD)
- 闪存 (Flash Memory)
磁盘查找文件的步骤:
- 旋转盘片找到对应的扇区
- 找到对应的磁道
从磁盘的读取数据的过程中有许多物理操作,因此效率较低
并且磁盘更适合做连续数据的读写,而不适合做随机数据的读写
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();
}
}
}
}
}
原文地址:https://blog.csdn.net/Brenda_Bestow/article/details/140528718
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!