1.IO流分类
从不同角度分类:
按流动方向的不同可以分为输入流和输出流;
按处理数据的单位不同分为字节流和字符流;
按功能的不同可分为节点流和处理流;
2.字节流和字符流
字节流以字节(8bit)为单位,字节流能处理所有类型的数据(如图片、avi等)
字符流以字符为单位,根据码表映射字符,一次可能读多个字节,字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
2.1字符流写操作
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class io1 {
public static void main(String[] args) throws IOException{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。(如果文件不存在,就创建)
//而且该文件会被创建都指定目录下,如果该目录下已有同名文件,将被覆盖
FileWriter i = new FileWriter("demo.txt");
//调用write方法,将字符串写入到流中
i.write("abcdefg");
//刷新流对象中的缓冲中的数据,将数据刷到目的地中
i.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲区的数据,将数据刷到目的地中
//和flush的区别:
//flush刷新后,流可以继续使用
//而close后,关闭流,流就关闭了,不可以再用了
i.write("hello");
i.close();
i.write("close");//出错,因为流已关闭了
}
}
</span>
2.2字符流的读操作
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class io4 {
public static void main(String[] args) throws IOException{
//读取文件,要保证文件存在,如果不存在,会出现FileNotFoundException异常
FileReader f = new FileReader("dom.txt");
/*<span style="font-family: 宋体;">//调用流读取对象的read方法</span></span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);"> //该方法每次只能读取一个字符
int c = f.read();
System.out.println("c=="+c);
System.out.println("c=="+(char)c);
int c1 = f.read();//如果没有字符了,则返回-1
System.out.println("c1=="+c1);
System.out.println("c1=="+(char)c1);
f.close();
*/
/*
* 正确的代码
int chr=0;
while((chr=f.read())!=-1){-1时,跳出循环,因为-1时,程序读到文件尾
System.out.println((char)chr);
}
*/
/*
* 正确的代码
*
while(true){
int ch=f.read();
if(ch==-1)
break;
System.out.println((char)ch);
}
*/
}
}
</span>
2.3用字符数组读取字符流
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class io5 {
public static void main(String[] args) throws IOException{
FileReader f = new FileReader("dom.txt");
char[] c = new char[1024];
int num = 0;
while((num=f.read(c))!=-1){
System.out.println("num=="+num+"....."+new String(c,0,num));
}
}
}
</span>
2.4字节流的读写操作
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class io12 {
public static void main(String[] args) throws IOException{
FileOutputStream f = new FileOutputStream("fram.txt");
f.write("abcde".getBytes());
//System.out.println();
f.close();
FileInputStream f1 = new FileInputStream("greeting.java");
System.out.println(f1.available());//输出f1文件字节数
int num = 0;
/*
* 读取方式一:
while((num=f1.read())!=-1)
System.out.println((char)num);
f1.close();
*/
// 读取方式二:
byte[] b=new byte[1024];
while((num=f1.read(b))!=-1){
System.out.println(new String(b,0,num));
}
f1.close();
//
}<span style="line-height: 22px; font-family: Arial, Helvetica, sans-serif;"> </span></span>
3.转换流
OutputStreamWriter:把字节输出流对象转成字符输出流对象
InputStreamReader:把字节输入流对象转成字符输入流对象
FileWriter和FileReader分别是OutputStreamWriter和InputStreamReader的直接子类,而不是Writer和Reader的直接子类,区别于FileInputStream 和InputStream。
如:
//构建一个字节输出流对象
OutputStream out = new FileOutputStream("");
//把字节输出流转成字符输出流
Writer w = new OutputStreamWriter(out);
//然后的操作和使用字符输出流的操作一样
---------------------------------------------
//构建一个字节输入流对象
InputStream is = new FileInputStream("");
//把字节输入流转成字符输入流
Reader r = new InputStreamReader(is);
//然后的操作和使用字符输入流的操作一样
4.File类
4.1File类的常用方法
String getName():返回文件名或路径名(若是路径,返回最后一级子路径名)
String getPath():返回对象对应的路径名
File getAbsoluteFile():返回绝对路径
String getAbsolutePath():返回对象对应的绝对路径
String getParent():返回文件目录的上一级目录名
boolean renameTo(File newName):重命名此File对象对应的文件或目录,若重命名成功返回true;
boolean exists():判断对象对应的文件或目录是否存在;
boolean canWrite():判断对象对应文件或目录是否可写;
boolean canRead():判断对象对应文件或目录是否可读;
boolean isFile():判断对象是文件,不是目录;
boolean isDirectory() 判断对象的文件是否是一个目录;
boolean isAbsolute() 判断对象对应文件或目录是否为绝对路径名;
boolean createNewFile() 当且仅当不存在,该方法创建一个该File对象所指定的新文件,创建成功返回true。
boolean delete():删除File对象所对应的文件或路径;
boolean mkdir() 创建File对象所对应的目录,调用该方法的File对象必须对应路径,而不是文件。
String[] list():列出File对象的所有子文件名和路径名。
File[] listFiles():列出File对象的所有子文件和路径。
static File[] listRoots():列出系统所有的根路径;
4.2文件过滤器 java.io.FilenameFilter
File 类里有方法: String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
<span style="font-size:18px;background-color: rgb(255, 255, 255);">//构造过滤器,只输出需要的文件!
import java.io.File;
import java.io.FilenameFilter;
class MyFilter implements FilenameFilter {
private String ext;
public MyFilter(String ext) {
super();
this.ext = ext;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(ext);// 真正起作用的还是这里的ext
}
}
public class Demo3 {
public static void main(String[] args) {
File f = new File("D:/V5/牛/水牛");
File[] file = f.listFiles(new MyFilter(".txt"));
for (File file2 : file) {
System.out.println(file2);
}
}
}</span>