Java基础-IO
IO
- InputStream/OutputStream
- IO流以byte为最小单位,因此也称为字节流。
- InputStream,从磁盘内容读取到内存中,称为输入流。
- OutputStream,从内存写入磁盘文件,称为输出流。
- Reader/Writer
- 按照char来读这种流称为字符流。
- 最小传输数据单位是char。
- 如果数据源不是文本,只能使用InputStream,如果是文本,使用Reader更加方便一些。
- 同步/异步
- 同步IO是指必须等待数据放回后才可以执行代码,优点是代码编写简单,但是CPU执行效率低;
- 异步是指IO时仅发出请求,然后立刻执行后序代码,优点是CPU执行效率高,缺点是代码编写简单;
- java.io提供了同步IO,而java.nio则是异步IO;
一、File对象
- 路径分割符的注意:
- Windows平台使用
\
作为路径分割符; - 在Java字符串中需要用
\\
表示一个\
; - Linux平台使用
/
作为路径分割符;
- Windows平台使用
- File对象有三种形式表示路径:
- getPath(),返回构造方法传入的路径;
- getAbsolutePath(),返回绝对路径;
- getCanonicalPath(),返回的是规范路径,而规范路径就是把.和..转换成标准的绝对路径后的路径:C:\Windows\notepad.exe;
- File对象有一个静态变量用于表示当前平台的系统分隔符,System.out.println(File.separator); // 根据当前平台打印""或"/";
- 文件和目录:
- File对象既可以表示文件,也可以表示目录。
- 构造一个File对象,不会导致任何磁盘的操作,只有调用File对象的某些方法的时候,才真正进行磁盘操作;
- File对象获取到一个文件时,还可以进一步判断文件的权限和大小。
- 创建和删除文件:
- 当File文件表示一个文件时,可以通过createNewFile()创建一个新文件,用delete()删除该文件;
- 需要一些临时文件,File对象提供了createTempFile()来创建一个临时文件,以及deleteOnExit(),在JVM退出时自动时自动删除该文件。;
- 遍历文件和目录:
- 当File对象表示一个目录的时候,可以使用list()和listFiles()列出目录下的文件和子目录名。
- 同样也可以通过一下方法创建和删除目录:
- **boolean mkdir(): **,创建当前File对象表示的目录;
- **boolean mkdirs(): **,创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来。
- **boolean delete(): **,删除当前File对象表示的目录,当前目录必须在空才能删除成功。
- Path:
- Java标准库提供了一个Path对象,它位于java.nio.file包,和File对象类似。
三、InputStream
- 是一个抽象类,它是所有输入流的超类;
- 最重要的一个方法是read()方法,同时流都是通过close()来关闭流的;
- 缓冲:
- 提供了两个重载的方法来支持读取多个字节,int read(byte[] b), 读取若干字节并填充到byte数组,返回读取的字节数;
- int read(byte[], int off, int len):指定byte[]数组的偏移量和最大填充数;
- 阻塞:在调用InputStream的read方法读取数据时,我们说的read方法是阻塞的;
四、OutputStream
- 某些情况下,需要强制调用使用flush()方法来强制删除缓冲区。
- 总是使用try(resource)来保证OutputStream正确关闭。
五、Filter模式
- Java的IO标准库提供的InputStream根据来源可以包括:
- FileInputStream,从文件读取数据
- ServletInputStream,从HTTP请求读取数据
- Socket.getInputStream,从TCP连接读取数据
- ........
- 为了解决依赖继承会导致子类数量失控的问题,JDK首先将InputStream分为两大类:
- 一类是直接提供数据的基础InputStream
- 一类是提供额外附加功能的InputStream
- 通过一个“基础”组件再叠加各种“附加”功能组件的模式,称为Filter模式(或者叫装饰器模式:Decorator)
六、操作Zip
- ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容。
- ZipInputStream可以读取zip格式的流,ZipOutputStream可以把多份数据写入zip包;
- 配合FileInputStream和FileOutputStream就可以读写zip文件;
七、读取classpath文件
- 把资源存储在classpath中可以避免文件路径依赖;
- Class对象的getResourceAsStream()可以从classpath中读取指定资源;
- 根据classpath读取资源时,需要检查返回的InputStream是否为null;
八、序列化
- 可以序列化的Java对象必须实现java.io.Serializable接口,类似Serializable这样的空接口被称为“标记接口”(Marker Interface);
- 反序列化不调用构造方法,可以设置serialVersionUID作为版本号;
- Java的序列机制仅适用于Java,如果需要和其他语言进行交换数据,必须使用序列化方法,例如JSON;
九、Reader
- Reader定义了所以字符输入的超类:
- FileReader实现了文件字符流输入,使用时需要指定编码;
- CharArrayReader和StringReader可以在内存中模拟一个字符流输入;
- Reader是基于InputStream构造的:可以通过InputStreamReader在指定编码的同时将任何InputStream转换为Reader;
- 总是使用try(resource)保证Reader正确关闭;
十、Writer
十一、使用Files
- 从Java7开始,提供了Files和Paths这两个工具类,能够极大的方便我读写文件;
- 虽然Files和Paths是java.nio包里面的类,但是封装了很多简单的读写文件的简单方法;
- Files提供的读写文件,受内存限制,只能读写小文件,例如配置文件,不可一次读入几个G的大文件。
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.