文件管理
Java语言使用File类对文件和目录进行操作, 查找文件时需要实现FilenameFilter或FileFilter接口。 另外, 读写文件内容可以通过FileInputStream、 FileOutputStream、 FileReader和FileWriter类实现, 它们属于I/O流。
File类表示一个与平台无关的文件或目录。 File类名很有欺骗性, 初学者会误认为是File对象只是一个文件, 但它也可能是一个目录 。
流的分类
根据不同的角度对流进行分类:
1.处理的数据单位不同,可分为:字符流、字节流
2.数据流方向不同,可分为:输入流、输出流
3.功能不同,可分为:节点流,处理流
IO流概述
所有的输入形式都抽象为输入流, 所有的输出形式都抽象为输出流, 它们与设备无关。
缓冲区
缓冲区可以简单地理解为一段内存区域。
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
4个抽象类
字节为单位的流称为字节流, 以字符为单位的流称为字符流。 Java SE提供4个顶级抽象类, 两个字
节流抽象类: InputStream和OutputStream; 两个字符流抽象类: Reader和Writer。
字符流和字节流的主要区别
1、字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
2、字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
3、Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.
4、字节流与字符流主要的区别是他们的的处理方式
字节流:处理字节和字节数组或二进制对象;
字符流:处理字符、字符数组或字符串。
如何选用
一、字符(Reader和 Writer):中文,字符是只有在内存中才会形成的,操作字符、字符数组或字符串,
二、字节(InputStream 和OutputStream):音频文件、图片、歌曲,所有的硬盘上保存文件或进行传输的时候,操作字节和字节数组或二进制对象,
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
节点流和处理流类型
节点流
类型 | 字符流 | 字节流 |
---|---|---|
File(文件) | FileReader FileWriter | FileInputStream FileOutputStream |
Memory Array | CharArrayReader CharArrayWriter | ByteArrayInputStream ByteArrayOutputStream |
Memory String | StringReader StringWriter | - |
Pige(管道) | PipedReader PipedWriter | PipedInputStream PipedOutputStream |
处理流
类型 | 字符流 | 字节流 |
---|---|---|
Buffering | BufferedReader BufferedWriter | BufferedInputStream BufferedOutputStream |
Filtering | FilterReader FilterWriter | FilterInputStream FilterOutputStream |
Converting between bytes and oharacter | InputStreamReader OutputStreamWriter | |
Object Serialization | ObjectInputStream ObjectOutStream | |
Data conversion | DataInputStream DataOutputStream | |
Counting | LineNumberReader | LineNumberInputStream |
Peeking ahead | PushbackReader | PushbackInputStream |
Pringting | PrintWriter | PrintStream |
转换流
转换流非常的有用,它可以把一个字节流转换成一个字符流,转换流有两种,一种叫InputStreamReader,另一种叫OutputStreamWriter。InputStream是字节流,Reader是字符流,InputStreamReader就是把InputStream转换成Reader。OutputStream是字节流,Writer是字符流,OutputStreamWriter就是把OutputStream转换成Writer。把OutputStream转换成Writer之后就可以一个字符一个字符地通过管道写入数据了,而且还可以写入字符串。我们如果用一个FileOutputStream流往文件里面写东西,得要一个字节一个字节地写进去,但是如果我们在FileOutputStream流上面套上一个字符转换流,那我们就可以一个字符串一个字符串地写进去。
转换流测试代码:
public void test(){
try{
//OutputStreamWriter字符流 FileOutputStream//字节流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"));
osw.write("你好,世界!");
System.out.println(osw.getEncoding()); //output: UTF-8
osw.close();
osw = new OutputStreamWriter(new FileOutputStream("D:/test.txt",true),"ISO8859_1");
osw.write("你好");
System.out.println(osw.getEncoding());//output: ISO8859_1
osw.close();
}catch(Exception e){
e.printStackTrace();
}
}