下图是一个描述输入流和输出流的类层次图。
字符流:
Reader:用于读取字符流的抽象类。
|---BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大 多数情况下,默认值就足够大了。
|---LineNumberReader:跟踪行号的缓冲字符输入流。此类定义了方法setLineNumber(int)和getLineNumbner(),它们可分别用于设置和获取当前行号。
|---InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
|---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
***************************************************************************
Writer:写入字符流的抽象类。
|---BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
|---OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
|---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
****************************************************************************
字节流:
InputStream:是表示字节输入流的所有类的超类。
|--- FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
|--- FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
|--- BufferedInputStream:该类实现缓冲的输入流。
**************************************************************************
OutputStream:此抽象类是表示输出字节流的所有类的超类。
|--- FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
|--- FilterOutputStream:此类是过滤输出流的所有类的超类。
|--- BufferedOutputStream:该类实现缓冲的输出流。
流的操作规律:
1、明确源和目的。
数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
2、操作的数据是否是纯文本数据?
如果是:数据源:Reader
数据汇:Writer
如果不是:数据源:InputStream
数据汇:OutputStream
3、虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。
4、需要在基本操作上附加其他功能吗?比如缓冲。
如果需要就进行装饰。
/记住,只要一读取键盘录入,就用这句话。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
输入输出例子:
File file = new File("E:/a.txt");
FileOutputStream out = new FileOutputStream(file);
OutputStreamWriter ow = new OutputStreamWriter(out, "UTF-8");
ow.append("你好,涂梦");
ow.append("\r\n");
ow.append("see you !");
ow.close();
out.close();
FileInputStream fileIn = new FileInputStream(file);
InputStreamReader read = new InputStreamReader(fileIn, "UTF-8");
StringBuffer sb = new StringBuffer();
while(read.ready()){
sb.append((char)read.read());
}
System.out.println(sb.toString());
read.close();
fileIn.close();
遍历一个目录下所有的目录文件
String file = "F:/fileZilla/FileZilla FTP Client";
File f = new File(file);
if(f.isDirectory()){
String [] s =f.list();
for (int i = 0; i < s.length; i++) {
String string = s[i];
File f1 = new File(file+"/"+s[i]);
if(f1.isDirectory()){
System.out.println(s[i]+"这是一个目录");
}else{
System.out.println(s[i]+"这是一个文件");
}
}
}else{
System.out.println(f.getName()+"这是一个文件");
}
删除一个目录下的所有文件
public static void delete(File f){
File [] fs =f.listFiles();
if(fs != null){
for (File file2 : fs) {
if(file2.isDirectory()){
delete(file2);
}else{
file2.delete();
}
}
}else{
f.delete();
}
}
copy一个文件:
1.字符流
File file = new File("E:/a.txt");
File file2 = new File("E:/b.txt");
BufferedReader bfr= new BufferedReader(new FileReader(file));
BufferedWriter bfw = new BufferedWriter(new FileWriter(file2));
char[] arr = new char[1024];
int num=0;
while((num = bfr.read(arr))!= -1){
bfw.write(arr, 0, num);
}
bfw.close();
bfr.close();
2.字节流
File file = new File("E:/a.txt");
File file2 = new File("F:/a.txt");
FileInputStream in = new FileInputStream(file);
FileOutputStream out = new FileOutputStream(file2);
int num = 0;
byte[] a= new byte[1024];
while((num =in.read(a))!= -1){
out.write(a, 0, num);
}
out.close();
in.close();