IO流
*在Java中所有数据都是使用流读写的,流是一组有序的数据序列,将数据从一个地方带到另一个地方。
*流是单向的,一维的,分为输入(input)流与输出(output)流。
Java的IO主要包含三个部分:
◦ 流式部分――IO的主体部分。
◦ 非流式部分――主要包含一些辅助流式部分的类。
◦ 文件读取部分的与安全相关的类以及与本地操作系统相关的文件系统的类。
Java中的流操作分为两种
◦ 基于字节流(InputStream读取,OutputStream写入)。
◦ 字符流(Reader读取,Writer写入)。
Java IO流可以概括为“两个对应,一个桥梁”。
◦ 字节流和字符流的对应,输入流和输出流的对应。
◦ 一个桥梁指从字节流到字符流的桥梁。
Java中,设计了四个抽象类来表示流:
◦ InputStream,字节流,读取数据
◦ OutputStream,字节流,写入数据
◦ Reader,字符流,读取数据
◦ Writer,字符流,写入数据
*其他多种多样变化的流均是继承了它们,并进行豪华装饰派生出来的加强版。
File类
File类对象表示磁盘上的文件或目录。它提供了与平台无关的方法来对磁盘上的文件或目录进行操作。
例如
运行结果
File类常用方法
package com.zc.file;
/**
* file类常用方法
* @author zc
*/
import java.io.File;
import java.io.IOException;
public class FileText {
public static void main(String[] args) {
/** 实例化file对象,并直接调用其构造方法 */
File file = new File("d:\\zc1.txt");
File file1 = new File("d:\\zc");
File file2 = new File("d:\\zc\\zc");
try {
boolean b = file.createNewFile();//创建新的文件
boolean b1 = file1.mkdir();//创建文件夹
boolean b2 = file2.mkdirs();//创建文件夹及子类文件
if (b&&b1&&b2){
System.out.println("ok,创建成功");
}
} catch (IOException e) {
e.printStackTrace();
}
String path = file.getPath();//返回构造方法中的路径
String apath = file.getAbsolutePath();//获取此文件的绝对路径
String name = file.getName();//获取文件名称
boolean e = file.exists();//判断文件是否存在
boolean d = file1.delete();//删除文件(如果是文件夹,里面没有文件才可以删除)
String [] strName = file2.list();//获取文件下所有文件的名称
}
}
字节流
fileInputStream和FileOutputStream
fileInputStream和FileOutputStream是InputStream和OutputStream的子类,适合于操作字节流,即最高操作8个位的单元。
FileInputStream提供了测试文件大小的方法available(),提供了关闭流的方法close(),使用read()方法从数据源中读取数据。可以使用缓冲区,通过指定byte[]b的大小来提高效率——如果不设计缓冲区,那么只能一个字节一个字节的读取,效率太低
示例:复制图片
字符流
BufferedReader与BufferedWriter
BufferedReader与BufferedWriter实现了自带缓冲区的字符流高效读写,其最小操作单元为一个字符(16位),同时,我们也可以自己指定缓冲区的大小,默认的缓冲区有8192个字符,通常情况下已经足够了。
BufferedReader
对比FileInputStream,我们发现它多了两个方法:readLine()和ready(),readLine()方法用于从缓冲区每次读取一行,ready()用于判断文件是否被读取完毕。
BufferedReader在读取文字档案时,会先将数据资料先读入缓冲区,而之后若使用read()等方法时,会先从缓冲区中进行读取,如果缓冲区数据不足,才会再从文件中读取,藉由缓冲区,可以减少对磁盘的I/O动作,借以提高程序的效率。
BufferedWriter
该类具有缓冲区,所以在写入的过程是首先将字符填充缓冲区(8192个字符),然后再将缓冲区的内容交由操作系统写入磁盘上的文件,这样就提高了性能,避免了对每个字符写入磁盘的频繁操作。
flush()方法的作用就是将缓冲区内的数据传递给操作系统,并通过操作系统写入磁盘。在调用close()方法时,会自动调用flush()方法。
示例:使用BufferedReader对System.in进行包装,读取控制台中字符串,并通过BufferedWriter写入文件。
package com.zc.filecharacterflow;
import java.io.*;
/**
* 字符流示例读取控制台中字符串,并通过写入文件。
* @author zc
*/
public class Example {
public static void main(String[] args) {
BufferedReader br = null;//创建一个字符输入流对象
BufferedWriter bw = null;//创建一个字符输入流对象
br = new BufferedReader(new InputStreamReader(System.in));
try {
//数据写入文件,bufferedWriter对FileWriter进行包装
bw = new BufferedWriter(new FileWriter("d:\\zc.txt"));
String line = null;
while ((line = br.readLine())!=null){//每次读取一行
if(line.equals("exc")){//判断输入exc时不在读取
break;
}
//写入输出流
bw.write(line);
bw.newLine();//换行
}
bw.flush();//刷新缓冲区
} catch (IOException e) {
e.printStackTrace();
}
}
}