Java语言学习高级笔记(六):IO流

本笔记适合在了解Java基础后想要进一步进阶学习的同学,同时包含部分Java经典面试题供同学们深入理解。

File类的使用:

  1. File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
  2. File类声明在java.io包下
  3. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。
    如果需要读取或写入文件内容,必须使用IO流来完成。
  4. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".

如何创建File类的实例:

File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)

路径分隔符:

  windows:\\
  unix:/
  通用:File.separator

File类常用方法:

public String getAbsolutePath():获取绝对路径。
public String getPath() :获取路径。
public String getName() :获取名称。
public String getParent():获取上层文件目录路径。若无,返回nullpublic long length() :获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() :获取最后一次的修改时间,毫秒值。

如下的两个方法适用于文件目录:

public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组。
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组。
public boolean renameTo(File dest):把文件重命名为指定的文件路径。
      比如:file1.renameTo(file2)为例:要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在。
public boolean isDirectory():判断是否是文件目录。
public boolean isFile() :判断是否是文件。
public boolean exists() :判断是否存在。
public boolean canRead() :判断是否可读。
public boolean canWrite() :判断是否可写。
public boolean isHidden() :判断是否隐藏。

创建硬盘中对应的文件或文件目录:

public boolean createNewFile() :创建文件。若文件存在,则不创建,返回falsepublic boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建。

删除磁盘中的文件或文件目录:

public boolean delete():删除文件或者文件夹。

删除注意事项:Java中的删除不走回收站。

流的分类:

操作数据单位:字节流、字符流。
数据的流向:输入流、输出流。
流的角色:节点流、处理流。

流的体系结构:

抽象基类节点流(或文件流)缓冲流(处理流的一种)
InputStreamFileInputStream (read(byte[] buffer))BufferedInputStream (read(byte[] buffer))
OutputStreamFileOutputStream (write(byte[] buffer,0,len)BufferedOutputStream (write(byte[] buffer,0,len) / flush())
ReaderFileReader (read(char[] cbuf))BufferedReader (read(char[] cbuf) / readLine())
WriterFileWriter (write(char[] cbuf,0,len))BufferedWriter (write(char[] cbuf,0,len) / flush())

四步走:

1.实例化File类的对象,指明要操作的文件。
2.提供具体的流。
3.数据的读入和输出。
4.流的关闭操作。

输入流:

  1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1。
  2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理。
  3. 读入的文件一定要存在,否则就会报FileNotFoundException。

输出流:

1.输出操作,对应的File可以不存在的,并不会报异常。
2.File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
   File对应的硬盘中的文件如果存在:
        如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的覆盖。
        如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容。

对于文本文件(.txt,.java,.c,.cpp),使用字符流处理。
对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理。
注:使用字节流处理文本文件,可能出现乱码。但是如果为文本复制则正常,因为将字符分开又合上。

缓冲流:(带有默认为8192大小的缓冲区)

作用:提供流的读取、写入的速度。
提高读写速度的原因:内部提供了一个缓冲区。
注:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略。

转换流:(属于字符流)

InputStreamReader:将一个字节的输入流转换为字符的输入流。
OutputStreamWriter:将一个字符的输出流转换为字节的输出流。
作用:提供字节流与字符流之间的转换。
解码:字节、字节数组 —>字符数组、字符串。
编码:字符数组、字符串 —> 字节、字节数组。
FileInputStream fis = new FileInputStream(“aaa.txt”);
InputStreamReader isr = new InputStreamReader(fis,“UTF-8”);参数2指明了字符集,具体使用哪个字符集,取决于文件所读文件保存时使用的字符集。

字符集:

ASCII:美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表。用一个字节的8位表示。
GB2312:中国的中文编码表。最多两个字节编码所有字符。
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码。
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

其他流的使用:

1.标准的输入、输出流:
System.in:标准的输入流,默认从键盘输入。
System.out:标准的输出流,默认从控制台输出。
System类的setIn(InputStream is) / setOut(PrintStream ps)方式重新指定输入和输出的流。

2.打印流:PrintStream 和PrintWriter
提供了一系列重载的print() 和 println()。

3.数据流:DataInputStream 和 DataOutputStream
作用:用于读取或写出基本数据类型的变量或字符串。
注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致。

对象流:ObjectInputStream(反序列化过程) 和 ObjectOutputStream(序列化过程)

作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

要想一个java对象是可序列化的,需要满足相应的要求:

  1.需要实现接口:Serializable。
  2.当前类提供一个全局常量:serialVersionUID。
  3.除了当前类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型和String类可序列化。)

序列化机制:

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
(以后学json时是把对象序列化成特殊的字符串进行传输,不用都满足序列化要求。)(进程的共享需要序列化机制。)
补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。

RandomAccessFile流:

1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口。
2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流:new RandomAccessFile(new File(“aaa.jpg”),“r”);其中"r"代表只读,"rw"代表读写。
3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。
如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖。)
4.可以通过seek(int pos)操作,调整指针位置,将插入位置之后的数据先保存在一个StringBuilder中,再用seek(int pos)调回指针到插入位置,进行写入覆盖操作,再将StringBuilder中的数据重新写入,实现RandomAccessFile“插入”数据的效果。

Java NIO:Non-Blocking IO,由Java 1.4版本引入

是一种支持面向缓冲区的(IO是面向流的)、基于通道的IO操作,以更加高效的方式进行文件的读写。
Java API中提供了两套NIO,一套是针对标准输入输出的NIO(处理本地文件),另一套是网络编程NIO。
在JDK 7中对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称它为NIO.2。
JDK 7(NIO.2)中提供Path接口、Paths类、Files类来代替File。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学长丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值