JAVA的 IO流 详解

来源:互联网 发布:天眼查 知乎 编辑:程序博客网 时间:2024/06/07 00:38
IO流,文件操作类
一、感性认知:
1、广泛的应用场景,比如下载文件,保存日志,传输信息等等。
2、没有可替代方案。
二、理性认知:
1、File类
a、可读可写可执行判断
b、创建文件
c、创建文件夹
d、批量创建文件夹
e、删除文件/文件夹 (也可以指定在虚拟机退出时删除)
f、判断是否为一个目录
g、判断是否为一个文件
h、得到文件的修改时间
i、返回文件的长度
j、返回当前盘符大小
k、返回当前盘符可分配空间
l、重新命名文件/文件夹
m、返回当前目录下的所有文件/文件夹
n、判断当前文件对象路径是否为绝对路径
o、判断两个File对象封装的路径是否为同一个路径。
p、创建临时文件夹CreateNewTempFile
q、得到一个File对象所封装路径的String或File
r、判断File对象所封装的抽象路径名是否存在 exists()
2、输入输出流
a、输入流
字节流
InputStream[AC]
FileInputStream[C]
FilterInputStream[C]
BufferedInputStream[C]
字符流
Reader[AC]
InputStreamReader[C]
FileReader[C]
BufferedReader[C]
b、输出流
字节流
OutputStream[AC]
ByteArrayOutputStream[C]
FileOutputStream[C]
FilterOutputStream[C]
BufferedOutputStream[C]
PrintStream[C]
字符流
Writer[AC]
OutputStreamWriter[C]
FileWriter[C]
BufferedWriter[C]


1,System.in本质是一个InputStream
2,System.out本质是一个PrintStream
3,PrintStream
a,print:将数据写入到输出流,输出流将数据写入到绑定的目标中(控制台,记事本)
b,append:与print方法类似,其本质是调用print方法
c,println:表示将数据输出到制定和目标后,添加换行符
d,printf:支持格式化数据输出
4,ByteArrayOutputStream



(具体案例,见代码:IOUtils)
3、文件的拷贝(见代码)
a、输入流:将待拷贝文件分批读取到内存中
b、输入流:将分批读取到内存中的待拷贝文件的部分数据,一次次写入到新文件中。
4、细节讨论
a、fileOutputStream.write(readBytes, 0, curLength);
写入操作,每次写入的内容为:当前字节数组的0偏移量值,此次读取字节数的长度。
b、write/flush的细节(flush方法,即为:清空当前“流”中缓冲区数据到指定位置)
输出流每当缓冲区已满,会自动执行flush方法,将输出流中的数据写入到指 定位置,如果最后一次输出流缓冲区没有写满,则不会自动执行flush,那么
需要手动执行flush方法,将流中的缓冲区的数据写入到指定位置。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了

CARE:InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用FileReader

String(byte[] byte,int start,int length);如果byte数组指定长度12,但只存储10个字节,那么这里的length最多为10,这样一理解超简单,之前一直不懂。API中是这样说的通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于该子数组的长度。当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。



对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)
对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)
PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。
字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。
Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。
  • 转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。
  • 数据流:DataInputStream,DataOutputStream。
因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。
  • 打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。
  • 对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。
  • 序列化流:SequenceInputStream。
  • 对象序列化:把对象直接转换成二进制,写入介质中。
使用对象流需要实现Serializable接口,否则会报错。而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.
0 0