IO技术

Posted lomon6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO技术相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

开篇

人们日常生活需要生活用水,那么,水从哪里来呢?我们的生活用水需要一个很大的水工厂,水工厂通过各种大小水管将生活用水运输到我们的社区,我们开一下水龙头就可以用瓢子装水用了。想起来我以前看过的电影,如果刚好你的社区生活用水缺乏,你只能用盘,桶或者其他器皿装水了,然后抬回家去。

我要说什么呢?这跟IO流有什么关系呢?

如果我们把水当做文件,把水工厂当做file,将运输用的大小水管当做inputstream,outputstream,reader,writer,再把瓢子,盘,水桶等容器当做数组,char等。file类是可以放很多很多的水的大仓库,通过inputstream,outputstream,reader,writer这四个节点流(=水管),将水运输到社区,最后,用不同容器(=数组,char)将水装出来用。

你问我为什么要用这个例子作比喻?因为这跟我们的文件处理很相似,在生活中,如果你要用水,会不会去遥远的自来水工厂取水?好吧,你说你家附近就有一家自来水工厂,不远。但是你确定你能直接进去取水用?不嫌麻烦?就算你不想麻烦,但是人家自来水供应商会给你直接接触整个工厂的自来水吗?答案是不会,因为人家也是有严格地按照国家标准执行的。万一你靠近自来水工厂的自来水,投毒进去谁负责任啊。另外一个,为了管理,为了人们的用水方便,只能是将水通过一个大水管到各大社区,然后社区各家各户接一根小的水管到家。

同样的,file类也是一样的,创建了一个file类的对象后,你不可能直接对file的对象进行操作。只能通过inputstream,outputstream,reader,writer这四个水管将文件包装运输,人们用char或者数组等容器从水管中读取数据。

数据源

定义:提供原始数据的媒介(也就是存放数据的地方)。可以是数据库、内存、程序、文件以及网络连接和IO设备

注:一切以程序为中心。文件-->程序(输入流);程序-->文件(输出流)

流的分类

  1. 按流向分类:
  • 输入流:数据源到程序(InputStream、Reader读进来)
  • 输出流:程序到目的地(OutStream、Writer写出去)
  1. 按功能分类:(是否直接操作数据源)
  • 节点流:可以直接从数据源或目的地中读写数据

  • 处理流(包装流):不直接连接到数据源和目的地,是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

    注:节点流是处于io操作的第一线,所有操作必须通过他来进行。

  1. 按照数据分类
  • 字节流:按照字节读取数据(InputStream、OutputStream)

  • 字符流:按照字符读取数据(Reader、Writer)

    注:操作字符:即我们可以看懂的纯文本,汉语、英语。由于要让计算机认识,所以字符流的底层还是基于字节流的操作(自动的在码表中进行转换)。

File类

注:可能有如下三种情况:文件、文件夹、不存在的文件或文件夹

要知道的:在计算机里面的文件是存储在硬盘上,Java虽然需要和文件打交道,但是它是不可以直接对硬盘进行操作,而是通过虚拟机和我们的操作系统进行交互,所以File代表的是Java和文件的一种联系。因此这个文件可能存在也可能不存在,它是只是一个抽象的概念。

File对象的构建

//File f = new File(String path);直接构建
File f1 = new File("E:/java笔记/java导读.png");
//File f = new File(String parent,String child);父子构建
File f2 = new File("E:/java笔记","java导读.png");
//File f = new File(File p , String c);父对象子名称
File f3 = new File(new File("E:/java笔记"),"java导读.png");

File文件名、路径的获取

/**
* 获取File对象的名称
* String name = f.getName();
* 获取File对象的路径
* String path = f.getPath();构建File对象若使用的是相对路径则返回相对路径反之返回绝对路径
* String path = f.getAbsolutePath();返回File对象的绝对路径
* String path = f.getPatent();返回File对象父级路径,如果没有则返回null
*/

String name = f1.getName();
System.out.println("f1的name:"+ name);//f1的name:java导读.png
String path = f1.getPath();
System.out.println("f1的path:"+path);//f1的path:E:java笔记java导读.png
String pathParent = f1.getParent();
System.out.println("f1的parent路径:"+pathParent);//f1的parent路径:E:java笔记

文件的状态

/**
* 判断文件的状态
* f.exists();
* f.isFile();
* f.isDirectory();
 */

boolean exist = f1.exists();
System.out.println("f1是否存在:"+exist);//f1是否存在:true
boolean isFile = f1.isFile();
System.out.println("f1是否是文件:" + isFile);//f1是否是文件:true
boolean isDirectory = f1.isDirectory();
System.out.println("f1是否是文件夹:" + isDirectory);//f1是否是文件夹:false

文件的其他操作

/**
 * 其他的信息
* long s = f.length();返回的文件的字节数,当为0是有两种情况:一:文件字节数为0;二:是文件夹
* Boolean b = file.createNewFile();当文件不存在是才创建成功
* Boolean b = file.delete();删除已经存在的文件
*/
System.out.println("f1的文件的字节数:"+ f1.length());
File newFile = new File("E:/java笔记/1.txt");
boolean isCreate = newFile.createNewFile();
System.out.println("是否创建成功:"+isCreate);
boolean delete = newFile.delete();
System.out.println("是否删除成功:"+delete);

创建文件夹

/**
* 创建文件夹:
* boolean b = f.mkdir();必须确保上级目录存在,否则创建失败
* boolean b = f.mkdirs();上级目录可以不存在,不存在则一同创建。
*/
File file = new File("E:/java笔记/mkdirTest");
boolean ismkdir = file.mkdir();
System.out.println("file创建目录是否成功:"+ ismkdir);
File file1 = new File("E:/java笔记/Test/mkdirsTest");
boolean ismkdirs = file1.mkdirs();
System.out.println("file2创建多级目录是否成功:"+ ismkdirs);

列出下一级

/**
* 列出下一级:
* String[] subNames = f.list();列出下级名称
* File[] subFiles = .listFile();列出下级File对象
*/
File sub = new File("E:/java笔记/第一章");
String[] subNames = sub.list();
for(String s1 : subNames){
    System.out.println(s1);
}
System.out.println("_________________________   ");
File[] subFiles = sub.listFiles();
for(File s2 : subFiles){
    System.out.println(s2.getAbsolutePath());
}
/**
* 打印结果如下:
* 
*   if-switch-三元运算符.docx
*   循环语句.docx
*   _________________________
*   E:java笔记第一章if-switch-三元运算符.docx
*   E:java笔记第一章循环语句.docx
*/

---恢复内容结束---

以上是关于IO技术的主要内容,如果未能解决你的问题,请参考以下文章

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us

golang代码片段(摘抄)

为啥这段代码会泄露? (简单的代码片段)

PHP代码-psysh调试代码片段工具

C# 获得目录创建时间的源码片段

java.io.ByteArrayInputStream