Java中的I/O讲解(超容易理解)(上篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址子逸爱编程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/a15766649633?spm=1000.2115.3001.5343使用工具 IntelliJ IDEA Community Edition 2023.1.4

使用语言 Java8 

代码能力快速提升小方法,看完代码自己敲一遍,十分有用 

目录

1.File类

1.1 File简述

1.2 使用File操作文件和目录 

1.2.1 创建File对象

1.3 File类的常用方法

1.4 使用方法贯穿示例

1.4.1 示例代码 

1.5 打印盘中首目录的所有文件名方法

2.I(Input)/O(output)流概述

2.1 I/O流的概念与作用

2.2 流的分类 

2.2.1 按流向划分:输入流和输出流 

2.2.2 按处理单元划分:字节流和字符流 

2.2.3 按流的角色划分:节点流和处理流


1.File类

1.1 File简述

在程序运行的过程中,输入/输出是常用的操作,也是必需的部分。允许程序读取外部数据,包括来自磁盘,光盘,文件等存储设备的数据,这类操作属于输入数据;同时允许程序记录运行状态,将程序数据输出到磁盘、光盘、文件等存储设备中,这类操作属于输出数据,数据的输入和输出离不开文件,经常使用到的文件类型有很多,如扩展名为.txt、.doc、.bmp、.class的文件等。 

File类是java.io包下代表操作与平台无关的文件和目录的类,也就是说,如果需要在程序中操作文件或目录,就可以通过File类实现对文件或目录的新建、删除、重命名等操作。

1.2 使用File操作文件和目录 

1.2.1 创建File对象

在程序中,一个File对象可以代表一个文件或目录。它可以查出与文件相关的信息,如名称、修改日期、文件大小等。File类的构造方法定义如下: 

public File(String pathName)

其中,pathName指文件路径。因此,在创建File对象的时候必须设置文件路径。 

例如,操作C盘下的test.txt文件,创建File对象的语句如下:

File file=new File("C:\\test.txt");

提示:
在Windows操作系统中,文件路径名中的路径分隔符可以使用正斜杠"/",如C:/test.txt;也可以使用反斜杠"\",但必须写成"\\",其中第一个"\"表示转义符,如"C:\\test.txt"。
pathNmae可以是相对路径也可以是绝对路径。绝对路径是以根目录(Windows系统中的盘符)开头的完整路径。例如:
File file=new File("C:\\test.txt");

在项目中使用相对路径时,需要放在src同级目录才可以点出来,示例如下:

1.3 File类的常用方法

boolean createNewFile()
    创建新文件
boolean delete()
    删除文件
boolean exists()
    判断文件是否存在
    存在就为true,不存在就为false
Boolean isFile()
    判断是否是文件
    是的话就是true不是就是false
boolean isDirectory()
    判断是否是目录(文件夹)
    是的话就是true不是就是false
long length()
    返回文件长度,单位为字节;若文件不存在,则返回OL
String getPath()
    返回文件名相应的路径
String getAbsolutePath()
    返回此对象表示的文件绝对路径 

这里只列举了File类的一些常用方法,在实际开发中,如需完成对File类的更多操作,则可随时查阅API帮助文档。 

1.4 使用方法贯穿示例

在方法中使用IO流时,可能会发生编译异常(检查异常:FileNotFoundException或IOException),这时需要进行异常处理才能进行编译;

1.4.1 示例代码 

在以上代码中,为保证程序的严谨性,避免错误发生,在创建新文件或删除文件之前,都会使用if语句进行判断,以避免重复创建文件或删除不存在的文件 。 

1.5 打印盘中首目录的所有文件名方法

listFIles()方法代表的就是文件集合;

2.I(Input)/O(output)流概述

2.1 I/O流的概念与作用

File类能够实现对文件和目录的创建、删除等基础性操作,但是无法实现对文件内容的操作,也就是无法实现对文件的读写。而java中的I/O流能够方便地实现数据的输入和输出,是实现文件读写的基础。 

如何解释I/O呢?
I即input,指读入操作,O即output,指写出操作。

 流:指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。既然是流,必然有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘、文件等,甚至可以是Internet上的某个统一资源定位符。所谓I/O流就是实现数据输入和输出的流,在I/O流的基础上,可以实现对文件的读写操作。那么,文件的读写指什么?

读文件,是指把文件中的数据读取到内存中,反之,写文件就是把内存中的数据写到文件中。
java中所有流类型都封装到java.io包中,用以实现I/O操作。下面从不同的角度对流进行分类,它们在概念上会有重叠的地方。

2.2 流的分类 

2.2.1 按流向划分:输入流和输出流 

流具有明确的方向性,按照流的流向来分,可以分为输入流和输出流 :

输入流

  • 只能从中读取数据,而不能写入数据的流,实现程序从数据源中读数据,数据源指文件、磁盘能够存储数据的媒介
  • 程序从数据源中读数据

输出流

  • 只能向其写入数据,而不能从中读数据的流,实现程序向目标数据源中写数据
  • 程序去写目标数据源

Java的输入流主要以InputStream和Reader作为基类(父类),而输出流则主要以OutputStream和Writer作为基类(父类)。它们都是一些抽象类,无法直接实例化对象。

按照流的流向进行分类时,输入流完成数据读入操作,输出流完成数据写出操作,这里的"出"和"入"一定是从程序运行所在内存的角度来论述的。如果从文件或磁盘的角度来论述,方向恰恰相反,混淆了概念就会引发错误。

2.2.2 按处理单元划分:字节流和字符流 

按照处理单元划分,Java中的流可分为字节流和字符流,它们的区别在于操作的数据单元不同。

字节流

  • 以8位字节位为操作数据单元的流,可用于操作二进制数据(如操作图片文件)
  • 字节流是一个一个字节读取的

字符流

  • 以16位的字符作为操作数据单元的流,可用于操作文本数据
  • 字符流是几个几个读取的 

字节流和字符流的用法几乎相同。它们向下细分,还可以划分字节输入流、字节输出流、字符输入流、字符输出流。 

通俗地理解,可以把I/O流看作一个水管,这个水管中依次排列着许多水滴,每滴水滴就是一个处理单元,即一个字节或字符。在字节流中每滴水滴是一个字节,在字符流中每滴水滴时一个字符。

2.2.3 按流的角色划分:节点流和处理流

按流的角色划分,Java中的流可分为节点流和处理流:

节点流
    可以直接向一个特定的存储介质(如磁盘、文件)读写数据的流。当使用节点流进行读写数据操作时,程序直接连接到数据源。
处理流

  • 用于对一个已存在的流进行连接和封装,是通过封装后的流实现读写操作的流。
  • 程序连接数据源是先封装再连接数据源 

处理流就是封装了节点流;

从以上的介绍可以看出,当使用处理流进行读写操作时,程序并不会直接连接到实际的数据源。使用处理流包装节点流,程序通过处理流执行输入和输出功能,让节点流与文件或磁盘等存储介质交互。它可以隐藏底层节点流的差异,并且对外提供更加方便的输入和输出的方法,因此节点流也被称为包装流,它的优势如下:

  • 对开发人员来说,使用处理流进行I/O操作更简单。
  • 使用处理流的执行效率高。 
  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
插入排序是一种简单直观的排序算法,它的基本思想是将一个元素插入到已经有序的序列的适当位置,使得插入后的序列仍然有序。下面是一个Java实现的插入排序算法的示例代码: ```java public class InsertSort { public static void main(String[] args) { int[] array = {53, 68, 32, 96, 58, 12, 25, 68, 99}; System.out.println("原序列:"); for (int i : array) { System.out.print(i + " "); } System.out.println(); insertSort(array); System.out.println("排序后:"); for (int i : array) { System.out.print(i + " "); } } public static void insertSort(int[] arr) { int preIndex, current; // i作为本次循环确定取出的元素值下标 for (int i = 1; i < arr.length; i++) { // preIndex:为记录当前下标i需要从后往前的下标值 preIndex = i - 1; // 取出本次循环最后一个下标i的元素值 current = arr[i]; // 当比较的preIndex值还没越界,并且下标preIndex的元素值大于本次比较值current时 // preIndex下标元素值后移,同时preIndex--,继续比较下一次 while (preIndex >= 0 && arr > current) { arr = arr = current; } } } ``` 在这个示例,我们首先定义了一个`insertSort`方法来实现插入排序。该方法接受一个整型数组作为参数,并对其进行排序。在方法,我们使用两个循环来进行排序:外层循环从数组的第二个元素开始,内层循环用于比较并将当前元素插入到已排序序列的适当位置。具体来说,内层循环首先将当前元素保存在`current`变量,然后从当前元素的前一个元素开始,逐个向前比较并将较大的元素后移,直到找到合适的位置插入`current`。最后,将`current`插入到正确的位置,完成一次插入操作。重复这个过程,直到数组的所有元素都被插入到正确的位置。 插入排序的时间复杂度是O(n^2),其n是数组的长度。它是一种稳定的排序算法,因为在比较和插入的过程,相等元素的相对顺序不会改变。 希望这个讲解能帮助您理解Java的插入排序算法。如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [插入排序详解(Java)](https://blog.csdn.net/weixin_45969711/article/details/127741051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [插入排序详解(Java实现)](https://blog.csdn.net/qq_38741971/article/details/81662860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [插入排序](https://blog.csdn.net/weixin_42615154/article/details/109142872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值