IO流笔记
java IO流
1、流相当于是内存和硬盘之间的管道
2、字节流是按照一个字节一个字节地读,即使汉字在windows系统中是按照两个字节,其读取还是读到一半的字节大小;
字符流是按照一个字符一个字符地读,不管是汉字还是字母,每次也都读取到一个汉字\字母。
3、从硬盘将内容读\写到内存中,是按照内容在Windows操作系统中所占的大小。
4、输入流和输出流的区别:
输入流:new FileInputStream(文件)—>从文件通向源内存的流,read(缓存方式)—>从流中读到read的缓存方式中去
输出流:new FileOutputStream(文件)—>从内存通向目标文件的流,write(缓存方式)—>从缓存方式中写入到文件中去
5、java.io包下需要掌握的流有16个:
文件专属:
java.io.FileInputStream
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInputStream
java.io.DataOutputStream
对象专属流:
java.io.ObjectInputStream
java.io.ObjectOutputStream
·FileInputStream:
1、字节输入流中,文件地址可以是“/”或“\\”,因为再java中’\'表示转义 字符。
2、read()原理:最开始方法指向内容之前,每调用一次 read(),往后挪一个字节,在内容读完后,再调用read()会返回-1。
3、read(byte[] bytes)原理:一次读取到的字节大小变成了字节数组的长度。
·字节数组长度>=内容字节数:返回读到的字节数
·字节数组长度<内容字节数:覆盖掉原字节数组中的相等数量的字节, 剩余字节仍保留上一次读取到的字节,并返回读取到的字节数 利用String(byte[] bytes)方法,转换每次读到的内容,但会将第二种情况中保留的字节依旧显示 利用String(byte[] bytes, int offset, int length)方法,实现所读即所得。
4、available():返回流当中还剩余没有独到的字节数量。可用与设定字节数组的大小,但不便于大文件
5、skip(int n):跳过几个字节不读 注意:空格也是一个字节,ASCII为32。
FileOutputStream:
1、直接写入会清空原文件内容,若不清空则采用FileOutputStream(String name,boolean append)
2、常用方法:String的getBytes()--->将字符串转变成字节数组
3、输出流一定要记得flush()清空管道,否则文件不完整 注意:输入\出流都实现了Closeable接口,所以都需要关闭。需要注意的是,在手动处理异常时,一般在finally语句块中输入\出流都会抛出异常最好分开两次try···catch,以防一个异常影响另一个关闭
·FileReader:略 ·FileWriter:
1、比FileOutputStream多了一个直接读入字符串的方法-->public void write(String str, int off, int len)
·BufferedReader:
·BufferedWriter:
·BufferedInputStream:
·BufferedOutputStream:
1、缓冲的原理: 其实就是在内存中事先开辟一块空间用作缓冲区,从源中获取一定量 的数据装进缓冲区中,再从缓冲区中不断地取出一个一个的数据。 在此次取完后,再从源中继续取出下一批数据进入缓冲区,程序作用的对象更改为缓冲区,从而减少与硬盘的交互次数。当源中的数据取完后,用-1作为结束标记。
2、重要方法:String·readLine()--->读取一个文本行,如果已到达流末尾,则返回 null 。注意:只有在BufferedReader中采用该方法;此方法不读取换行符。
3、缓冲流其实只是一个装饰流,没有特定的方法,仍和一般的输入\出一样操作。
·InputStreamReader:
·OutputStreamWriter:
1、 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
2、字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
3、字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 ,在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
·DataInputStream:
·DataOutputStream:
1、数据专属流:可以将数据连同数据的类型一并写入文件(不是普通文件,记事本打不开)
2、两个流必须一起使用,并且需要实现知道写入的顺序及类型 3、read()和write()都带有类型格式
·PrintStream: ·PrintWriter:
1、标准输出流:能输出格式化的数据(方法重载),不需要收到关闭
2、用途:在程序中System.out是返回一个PrintStream类型,默认是输出到控制台。经过指定标准输出流的目标文件和System.setOut(标准输出流)方法的设定,将向指定文件输出。
java.io.File类
含义:文件和目录路径名的抽象表示形式
常用方法:
·exists():判断文件是否存在,返回boolean值
·createNewFile():以文件的方式创建
·mkdir():一目录的形式创建
·mkdirs():创建多重目录
·getParent():获取文件的父路径,返回字符串类型路径
·getParentFile():获取文件的父文件,再通过getAbsolutePath()方法获取父文件的绝对路径
·getAbsolutePath():获取文件\目录的绝对路径
需要了解的方法:
·listFile():获取目录下的所有文件的集合
目录\文件的拷贝:
·subString(int i):去掉盘符,获取去掉前面i个字节的字符串
·getAbsolutePath().endsWith(String s)?文件路径:文件路径+“\\”:判断是否以斜杠结尾,加上三目运算符,判断结尾标志