欢迎光临散文网 会员登陆 & 注册

学习记录之基础API(流)

2022-07-25 22:06 作者:星月袭空  | 我要投稿

File类

File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)

使用File可以做到:

    1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等

    2:创建和删除文件或目录

    3:访问一个目录中的子项

常用构造器:

    File(String pathname)

    File(File parent,String name)可参考文档了解

常用方法:

    length():返回一个long值,表示占用的磁盘空间,单位为字节。

    canRead():File表示的文件或目录是否可读

    canWrite():File表示的文件或目录是否可写

    isHidden():File表示的文件或目录是否为隐藏的

    createNewFile():创建一个新文件,如果指定的文件所在的目录不存在会抛出异常                java.io.FileNotFoundException

    mkdir:创建一个目录

    mkdirs:创建一个目录,并且会将所有不存在的父目录一同创建出来,推荐使用。

    delete():删除当前文件或目录,如果目录不是空的则删除失败。

    exists():判断File表示的文件或目录是否真实存在。true:存在   false:不存在

    isFile():判断当前File表示的是否为一个文件。

    isDirectory():判断当前File表示的是否为一个目录

    listFiles():获取File表示的目录中的所有子项

    listFiles(FileFilter filter):获取File表示的目录中满足filter过滤器要求的所有子项

JAVA IO

java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.

java将IO按照方向划分为输入与输出,参照点是我们写的程序.

输入:用来读取数据的,是从外界到程序的方向,用于获取数据.

输出:用来写出数据的,是从程序到外界的方向,用于发送数据.


java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.

java将IO按照方向划分为输入与输出,参照点是我们写的程序.

输入:用来读取数据的,是从外界到程序的方向,用于获取数据.

输出:用来写出数据的,是从程序到外界的方向,用于发送数据.

Java定义了两个超类(抽象类):

java.io.InputStream:所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据

    java.io.OutputStream:所有字节输出流的超类,其中定义了写出数据的方法.

java将流分为两类:节点流与处理流:

节点流:也称为低级流.节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的.

处理流:也称为高级流.处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作.

实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在.

文件流是一对低级流,用于读写文件的流

java.io.FileOutputStream文件输出流,继承自java.io.OutputStream

常用构造器

覆盖模式对应的构造器

覆盖模式是指若指定的文件存在,文件流在创建时会先将该文件原内容清除。

FileOutputStream(String pathname):创建文件输出流用于向指定路径表示的文件做写操作

FileOutputStream(File file):创建文件输出流用于向File表示的文件做写操作。

注:如果写出的文件不存在文件流自动创建这个文件,但是如果该文件所在的目录不存在会抛出异常:java.io.FileNotFoundException

追加写模式对应的构造器

追加模式是指若指定的文件存在,文件流会将写出的数据陆续追加到文件中。

FileOutputStream(String pathname,boolean append):如果第二个参数为true则为追加模式,false则为覆盖模式

FileOutputStream(File file,boolean append):同上

常用方法:

void write(int d):向文件中写入一个字节,写入的是int值2进制的低八位。
void write(byte[] data):向文件中块写数据。将数组data中所有字节一次性写入文件。
void write(byte[] data,int off,int len):向文件中快写数据。将数组data中从下标off开始的连续len个字节一次性写入文件。

java.io.FileInputStream文件输入流,继承自java.io.InputStream

常用构造器

FileInputStream(String pathname) 创建读取指定路径下对应的文件的文件输入流,如果指定的文件不存在则会抛出异常java.io.FileNotFoundException

FileInputStream(File file) 创建读取File表示的文件的文件输入流,如果File表示的文件不存在则会抛出异常java.io.IOException。

常用方法

int read():从文件中读取一个字节,返回的int值低八位有效,如果返回的int值为整数-1则表示读取到了文件末尾。
int read(byte[] data):块读数据,从文件中一次性读取给定的data数组总长度的字节量并从数组第一个元素位置开始存入数组中。返回值为实际读取到的字节数。如果返回值为整数-1则表示读取到了文件末尾。

缓冲流

缓冲流是一对高级流,在流链接中链接它的目的是加快读写效率。缓冲流内部默认缓冲区为8kb,缓冲流总是块读写数据来提高读写效率

java.io.BufferedOutputStream缓冲字节输出流,继承自java.io.OutputStream

常用构造器

    BufferedOutputStream(OutputStream out):创建一个默认8kb大小缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。

    BufferedOutputStream(OutputStream out,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上。

常用方法

flush():强制将缓冲区中已经缓存的数据一次性写出

缓冲流的写出方法功能与OutputStream上一致,需要知道的时write方法调用后并非实际写出,而是先将数据存入缓冲区(内部的字节数组中),当缓冲区满了时会自动写出一次。

java.io.BufferedInputStream缓冲字节输出流,继承自java.io.InputStream

常用构造器

    BufferedInputStream(InputStream in):创建一个默认8kb大小缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。

    BufferedInputStream(InputStream in,int size):创建一个size指定大小(单位是字节)缓冲区的缓冲字节输入流,并连接到参数指定的字节输入流上。

常用方法

缓冲流的读取方法功能与InputStream上一致,需要知道的时read方法调用后缓冲流会一次性读取缓冲区大小的字节数据并存入缓冲区,然后再根据我们调用read方法读取的字节数进行返回,直到缓冲区所有数据都已经通过read方法返回后会再次读取一组数据进缓冲区。即:块读取操作

对象流

对象流是一对高级流,在流链接中的作用是完成对象的序列化反序列化

序列化:是对象输出流的工作,将一个对象按照其结构转换为一组字节的过程。

反序列化:是对象输入流的工作,将一组字节还原为对象的过程。

java.io.ObjectInputStream对象输入流,继承自java.io.InputStream

常用构造器

ObjectInputStream(InputStream in):创建一个对象输入流并连接到参数in这个输入流上。

常用方法

Object readObject():进行对象反序列化,将读取的字节转换为一个对象并以Object形式返回(多态)。

如果读取的字节表示的不是一个java对象会抛出异常:java.io.ClassNotFoundException

java.io.ObjectOutputStream对象输出流,继承自java.io.OutputStream

常用构造器

ObjectOutputStream(OutputStream out):创建一个对象输出流并连接到参数out这个输出流上

常用方法

void writeObject(Object obj):进行对象的序列化,将一个java对象序列化成一组字节后再通过连接的输出流将这组字节写出。

如果序列化的对象没有实现可序列化接口:java.io.Serializable就会抛出异常:java.io.NotSerializableException

序列化接口java.io.Serrializable

该接口没有任何抽象方法,但是只有实现了该接口的类的实例才能进行序列化与反序列化。

实现了序列化接口的类建议显示的定义常量:static final long serialVersionUID = 1L;

可以为属性添加关键字transient,被该关键字修饰的属性在序列化是会被忽略,达到对象序列化瘦身的目的。

字符流

java将流按照读写单位划分为字节与字符流。字节流以字节为单位读写,字符流以字符为单位读写。

转换流java.io.InputStreamReader和OutputStreamWriter

功能无需掌握,了解其核心意义:

1:衔接其它字节与字符流

2:将字符与字节进行转换

相当于是现实中的"转换器"

PrintWriter

具有自动行刷新功能的缓冲字符输出流

构造器:

PrintWriter(String filename)

PrintWriter(File file)

常用方法:

void println(String line):按行写出字符串

缓冲字符输出流

缓冲字符输出流需要记住的是PrintWriter和BufferedReader

作用:

1:块写或块读文本数据加速

2:可以按行写或读字符串

java.io.PrintWriter 具有自动行刷新的缓冲字符输出流

常用构造器

PrintWriter(String filename) :可以直接对给定路径的文件进行写操作

PrintWriter(File file):可以直接对File表示的文件进行写操作

上述两种构造器内部会自动完成流连接操作。

PrintWriter(OutputStream out):将PW链接在给定的字节流上(构造方法内部会自行完成转换流等流连接)

PrintWriter(Writer writer):将PW链接在其它字符流上

PrintWriter(OutputStream out,boolean autoflush)

PrintWriter(Writer writer,boolean autoflush)

上述两个构造器可以在链接到流上的同时传入第二个参数,如果该值为true则开启了自动行刷新功能。

常用方法

void println(String line):按行写出一行字符串

特点

自动行刷新,当打开了该功能后,每当使用println方法写出一行字符串后就会自动flush一次

java异常处理机制:

  • 异常处理机制是用来处理那些可能存在的异常,但是无法通过修改逻辑完全规避的场景。

  • 而如果通过修改逻辑可以规避的异常是bug,不应当用异常处理机制在运行期间解决!应当在编码时及时修正

try语句块用来包含可能出错的代码片段

catch用来捕获并处理对应的异常,可以定义多个,也可以合并多个异常在一个catch中。

finally是异常的最后一块,只要程序执行到try中则必走。一般用于释放资源这类操作。

throw用于主动对外抛出异常。要么是满足语法不满足业务主动抛出异常,要么就是实际发生了异常但是不应当在当前代码片段被解决是抛出。具体情况要结合实际业务分析。

throws用于在方法声明时声明该异常的抛出,使得调用者必须处理该异常。

我们学习的javaIO称为BIO,即:阻塞式IO
所谓阻塞式IO指的是当我们在读写数据时,数据没有准备好之前,程序(线程)会进入阻塞状态等待数据
准备完毕后再进行读写。
非阻塞IO:NIO
在读写数据时,若数据还没有准备完毕,此时程序(线程)会继续向后执行其他逻辑并不会在读写方法这里阻塞。 NIO真正解决的问题是网络上IO操作的阻塞问题。NIO有一个核心API:多路选择器Selector   select:单词的含义是"选择"多路选择器的作用相当于是一个"监控设备",将多个"通道"注册到该选择器上,此时选择器就会自动监控每个通道中的事件,一旦出现了某个我们需要关注的事件,比如一个客户端连接了,或者某个客户端发送过来消息了。那么多路选择就可以通知我们某个通道需要处理该操作,此时我们就可以进行相关处理了。














学习记录之基础API(流)的评论 (共 条)

分享到微博请遵守国家法律