java中IO知识点概念
这里写自定义目录标题
- 内存中的数据以电子信号的形式表示,而磁盘中的数据是以磁场的方向表示。
- 1.流的分类
- 2.File类
- 3.流的API 关键
- 4.理解缓冲的作用-一次性多拿些
- 读写文件的时候为什么要有缓冲流 -意义是什么
- 缓冲流的使用
- 5.路径问题
- 6.文件的创建
- 7.内存和磁盘存储本质
- 8.为什么内存可以提供非常高速的数据读写访问,而机械盘的读写速度相对较慢的原因之一。
- 9.如何改变磁场的状态
- 10.内存数据写入磁盘
- 11.什么是内存泄漏内存溢出 有什么区别
- 12.难道即使运行程序关闭了 内存也不会释放嘛
- 12.转换流
- 13.字节与字符的区别
- 14.字符如果进行各种二进制运算 需要根据相应的编码规则转换成对应的二进制嘛
- 15. apache-common包 封装了哪些操作
- 16.是不是相当于对 jdk 源码进行了二次封装
内存中的数据以电子信号的形式表示,而磁盘中的数据是以磁场的方向表示。
1.流的分类
按数据的流向不同分为:输入流和输出流。
按操作数据单位的不同分为:字节流(8bit)和字符流(16bit)。
根据IO流的角色不同分为:节点流和处理流。
2.File类
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
3.流的API 关键
字节流 InputStream OutputStream
字符流 Reader Writer
4.理解缓冲的作用-一次性多拿些
读写文件的时候为什么要有缓冲流 -意义是什么
就是为了一次性从磁盘多读一些内容到内存或者从内存中多取些数据到磁盘这是缓冲区的意义。
简单来说,当我们使用缓冲流读取或写入数据时,数据会首先被缓存到内存中的缓冲区,
直到缓冲区被填满或达到一定的阈值后,才会将数据批量写入磁盘或者网络。
这样的做法可以避免频繁的IO操作,减少了程序的开销,提高了读写效率。
除此之外,缓冲流还具有自动关闭流的功能,可以自动地释放资源,避免了忘记关闭流而导致资源泄露的问题。
缓冲流的使用
// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("abc.jpg"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("abc_copy.jpg"));
// 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
5.路径问题
**绝对路径:**从盘符开始的路径,这是一个完整的路径。
**相对路径:**相对于项目目录
的路径,这是一个便捷的路径,开发中经常使用。
6.文件的创建
1.File f = new File(“a.txt”);
区分 f.mkdir()和f.mkdirs()
2.在某个目录下创建文件
File f5= new File(“newDira\newDirb”);
System.out.println(“newDira\newDirb创建:” + f5.mkdirs());
File file = new File(f5,“a.txt”);
7.内存和磁盘存储本质
内存(RAM)是计算机系统中的随机存取存储器。它由一组芯片组成,每个芯片上有许多存储单元,每个存储单元可以存储一个位(0或1)。内存的存储方式是电子信号,每个存储单元通过电流的开关状态来表示0或1。
内存是易失性存储器,这意味着当计算机断电时,内存中存储的数据会丢失。因此,内存主要用于存储正在运行的程序和临时数据。当计算机启动时,操作系统和其他应用程序会加载到内存中,CPU可以快速从内存中读取指令和数据进行处理。
机械盘(如硬盘或固态硬盘)是计算机系统中的永久存储器。它由一个或多个磁盘片组成,每个磁盘片上有许多磁道和扇区。磁盘片在高速旋转的同时,磁头可以移动到特定的磁道上读写数据。机械盘的存储方式是通过改变磁场来表示0或1,磁性材料在磁场的作用下可以保持稳定状态
。
机械盘是非易失性存储器,这意味着即使计算机断电,磁盘中的数据仍然可以保持。因此,机械盘主要用于长期存储文件、操作系统和应用程序等永久数据。
总结来说,内存是计算机系统中的临时存储器,以电子信号的形式存储数据,读写速度非常快,但断电后数据会丢失;机械盘是计算机系统中的永久存储器,以改变磁场的方式存储数据,读写速度相对较慢,但数据在断电后仍然保持。它们在存储方式和性质上存在本质的区别,用于不同的存储需求和目的。
8.为什么内存可以提供非常高速的数据读写访问,而机械盘的读写速度相对较慢的原因之一。
改变电流状态比改变磁场状态要快是因为在内存和机械盘中所使用的物理原理不同,导致了其存储速度上的差异。
-
内存中的存储单元是由电子器件组成,数据以电流的开关状态来表示0或1。由于电子器件的特性,电流可以非常迅速地在导体中传播,因此改变电流状态的速度非常快。当CPU需要读取或写入内存中的数据时,电子信号可以立即传输到相应的存储单元,实现快速的数据访问和操作。
-
机械盘中的存储单元是由磁性材料组成,数据以磁场的方向来表示0或1。在机械盘中,磁头需要移动到特定的磁道上才能进行读写操作,而且改变磁场的状态需要一定的时间。虽然机械盘的技术也在不断改进,但是相较于内存中的电子传输速度,改变磁场状态的速度仍然较慢。
因此,由于内存中的数据是以电子信号的形式存储,并且电子传输速度极快,所以改变电流状态比改变磁场状态更快。这也是为什么内存可以提供非常高速的数据读写访问,而机械盘的读写速度相对较慢的原因之一。
9.如何改变磁场的状态
磁场的状态可以通过改变磁性材料中的磁向来实现。在机械盘中,磁性材料通常是一层铁氧化物涂覆在磁盘片表面上,每个磁盘片上包括许多磁道和扇区,数据就存储在这些磁道和扇区中。
磁盘驱动器中的磁头包括一个电磁线圈,当电流通过线圈时,它会产生磁场。通过调整线圈中的电流方向和强度,磁头可以在磁盘上创建或反转一个磁场,从而将磁性材料中的磁向进行相应的改变。这种方法可以实现对磁盘中数据的读写操作。
具体地说,在写入数据时,磁头会被定位到特定的扇区上,电流被应用到线圈上,使其产生一个磁场,磁场的极性和大小被精确控制,以在磁性材料中创建一个特定的磁场模式,表示0或1。在读取数据时,磁头会被定位到特定的扇区上,电流被应用到线圈上,以检测磁性材料中的磁场,将其转换为电信号,并将其发送到计算机系统中进行处理。
总之,改变磁场状态主要是通过在磁盘驱动器中使用磁头和电磁线圈,通过控制电流的方向和强度来创建或反转磁场,进而实现对磁盘中数据的读写操作。
10.内存数据写入磁盘
首先,内存中的数据以电子信号的形式表示,而磁盘中的数据是以磁场的方向表示。在将数据写入磁盘之前,需要经过以下过程:
-
数据编码:内存中的数据按照特定的编码规则进行转换,以便在磁盘中进行存储。这通常涉及将数据划分为数据块,并为每个数据块分配适当的校验位和标识符。
-
写入操作系统缓存:数据首先被写入操作系统的缓存中,这是一个临时的存储区域。操作系统会对数据进行管理,并将其合并为更大的数据块以提高写入效率。
-
磁盘调度和写入:操作系统会将数据从缓存中传输到磁盘控制器,然后再由磁盘控制器将数据写入磁盘。这个过程中,磁头会被定位到指定的磁道和扇区,并通过改变磁场的状态来写入数据。
-
磁盘刷新和持久化:在数据写入磁盘后,磁盘控制器会执行一系列操作,以确保数据被正确地刷新到磁盘表面,并持久化保存。
所以,内存到磁盘的操作涉及多个步骤,其中包括将内存中的数据经过编码、写入操作系统缓存、磁盘调度和写入等过程,最终将数据以磁场的方向存储在磁盘中。
11.什么是内存泄漏内存溢出 有什么区别
内存泄漏和内存溢出都是与程序中使用的内存相关的问题,但是它们所指的具体问题不同。
内存泄漏指的是程序中存在一些对象或变量,它们已经不再被使用,但是在内存中仍然占用着空间,从而导致程序的内存使用量越来越大。如果内存泄漏的问题一直得不到解决,程序最终可能会耗尽所有可用的内存资源,导致程序异常终止或崩溃。
例如,一个程序中创建了一个对象,但是在之后的代码中没有将该对象释放掉,这就会导致内存泄漏。如果这种情况发生在循环中或者在频繁执行的代码块中,那么内存泄漏的问题会非常严重。
内存溢出则指的是程序在申请内存时,由于内存不足或者内存分配不当,导致程序无法正常申请到所需要的内存资源,从而导致程序异常终止或崩溃。
例如,在Java中,如果我们不正确地使用数组或集合类,可能会导致内存溢出的问题。当数组或集合中的元素数量过多时,程序可能无法申请到足够的内存,从而导致内存溢出。
因此,内存泄漏和内存溢出都是与程序中使用的内存相关的问题,但是它们所指的具体问题不同。内存泄漏是指内存资源没有被正确释放,导致内存使用量增加;而内存溢出则是指程序所需内存超过了可用内存,导致程序无法正常运行。
12.难道即使运行程序关闭了 内存也不会释放嘛
当程序运行结束时,操作系统会自动回收程序所占用的内存资源。一般情况下,操作系统会在程序退出时自动释放内存。
然而,在某些情况下,程序运行过程中可能会出现内存泄漏的问题。内存泄漏指的是程序中分配的内存空间在不再使用时没有正确释放,导致这部分内存无法被回收,从而造成内存资源的浪费。
常见的内存泄漏情况包括:
-
未显式释放分配的内存:如果程序中使用动态内存分配函数(如
malloc
、new
等)分配了内存,但在之后没有调用相应的释放函数(如free
、delete
等)进行释放,就会导致内存泄漏。 -
循环引用:在某些编程语言中,如果对象之间存在循环引用,即彼此引用对方,而没有外部引用指向它们,那么即使程序运行结束,这些对象也无法被垃圾回收机制回收,从而造成内存泄漏。
-
资源未正确释放:除了内存外,程序还可能涉及其他资源的分配和释放,如文件句柄、网络连接等。如果这些资源在程序运行结束后没有正确释放,也会造成类似的泄漏问题。
因此,虽然操作系统会在程序退出时自动释放内存,但需要注意编写代码时避免出现内存泄漏的情况,以确保程序能够正常释放资源并高效利用内存。
12.转换流
转换流是字节与字符间的桥梁–就是相互转换的媒介
13.字节与字符的区别
字节和字符都是计算机内部存储和传输信息的基本单位,但它们之间有一些区别。
-
存储方式不同:字节是计算机内部存储信息的最小单位,通常由8个二进制位组成,可以表示256种不同的状态。而字符则是一种抽象概念,通常指代人类语言中的一个字母、数字或符号,其表示方式可以是一个或多个字节,具体取决于所使用的字符编码。
-
编码方式不同:字节可以直接通过二进制编码来表示,而字符需要通过字符编码进行转换。计算机中常用的字符编码包括ASCII编码、Unicode编码等。
-
应用场景不同:字节主要用于表示二进制数据、图像、音频、视频等非文本数据,而字符主要用于表示文本信息,如HTML、XML、JSON等数据格式。
-
处理方式不同:字节可以进行各种二进制运算,如位运算、按位与、按位或等操作,而字符通常需要进行相应的解码和编码操作,才能进行相关处理。
总之,字节和字符都是计算机内部存储和处理信息的基本单位,但它们之间存在明显的区别。在日常编程中,需要根据不同的应用场景和需求,选择合适的数据类型进行存储和处理。
14.字符如果进行各种二进制运算 需要根据相应的编码规则转换成对应的二进制嘛
是的,如果要对字符进行各种二进制运算,需要先将其转换为对应的二进制表示。这个过程通常称为字符编码或字符集编码。
在计算机内部,字符通常用数字表示,不同的编码规则会使用不同的数字表示方式。例如,ASCII编码规则使用7位二进制数表示一个字符,可以表示128种不同的字符;而Unicode编码规则使用16位或32位二进制数表示一个字符,可以表示更多的字符。
要进行字符的二进制运算,需要先将字符转换为对应的二进制表示,然后进行相应的运算操作,最后再将得到的二进制结果转换回字符形式。这个过程中需要注意选择合适的编码方式,并避免出现编码转换错误的情况。
需要注意的是,并不是所有的字符都可以进行二进制运算。只有那些能够被编码为二进制数的字符才能进行这种运算。在进行字符的二进制运算时,还需要考虑到字符编码的一些特殊性质,如字节序、编码方案等,以确保运算结果的正确性和一致性。
15. apache-common包 封装了哪些操作
Apache Commons是一个开源的Java项目,旨在提供许多常见任务的可重用Java组件。其中,Apache Commons包含了多个子项目,每个子项目都专注于解决特定领域的常见问题。
以下是Apache Commons中一些常见子项目的主要功能:
-
Apache Commons Lang:提供了许多有用的工具类,用于操作字符串、日期、枚举等。例如,StringUtils用于对字符串进行操作,DateUtils用于日期操作,EnumUtils用于枚举类型的处理等。
-
Apache Commons IO:提供了对输入输出操作的支持,包括文件操作、流操作、文件过滤等。比如,FileUtils提供了一系列便捷的文件操作方法,IOUtils提供了一系列便捷的流操作方法等。
-
Apache Commons Collections:提供了一系列扩展了JDK集合框架的集合类,以及一些其他有用的数据结构和工具类,如列表操作、映射操作、迭代器操作等。
-
Apache Commons Math:提供了一系列数学相关的实用工具类和算法,包括线性代数、随机数生成、统计分布等各种数学运算。
-
Apache Commons Codec:提供了对常见编解码算法的支持,包括Base64、MD5、SHA等常见加密算法。
除了上述子项目外,Apache Commons还包含其他一些子项目,涵盖了更多领域的常见问题,如配置文件解析、反射工具、命令行解析等。这些项目都旨在为Java开发人员提供高质量、可重用的通用组件,以简化开发工作并提高代码的可维护性和可读性。
16.是不是相当于对 jdk 源码进行了二次封装
Apache Commons项目的确提供了许多对JDK功能的二次封装,以简化开发人员的使用和提供更高级别的抽象。它们并不是对JDK源码的直接修改或替代,而是构建在JDK之上,提供了一些更便捷、易用、功能丰富的工具类、算法和数据结构。
Apache Commons的目标是填补JDK中某些领域的功能缺失,并提供更高级别的抽象,从而简化常见任务的实现。它提供了许多通用的、经过测试和优化的组件,使开发人员能够更快速地开发应用程序,而无需从头开始编写相关代码。
虽然Apache Commons与JDK有一些重叠的功能,但它们并不冲突,而是互相补充。开发人员可以根据具体需求选择使用JDK提供的原生功能还是Apache Commons提供的封装组件。 Apache Commons的设计哲学是保持与JDK的兼容性,并提供额外的功能和灵活性。
总而言之,Apache Commons项目是对JDK功能的二次封装,旨在提供更高级别、更易用的工具类、算法和数据结构,以简化开发人员的工作。它们并不替代JDK,而是为开发人员提供更多选择和便利。