2018.1.18-File、IO流
一、File类
java.io.File类 表示系统文件(即文件和目录)
(1)创建对象: File file=new File(String pathname );
(2)调用方法:操作文件或目录属性eg: c:\\test.txt c:/test.txt
Separator默认分隔符:unix“/”; windows”\\”
(3)常用方法:
File f=new File(“c:”+File.separator+”test”);
f.exists(); //判断是否存在
f.delete(); //删除文件或目录名
f.createNewFile(); //创建文件
f.mkdir(); //抽象路径名指定的目录
f.mkdirs();包括所有必需但不存在的目录
f.getPath() ; (getAbsolutePath()) //当前路径
f.getParentFile() ; //父目录对象
f.isDirectory();
File[] files=f.listFiles();//返回当前正在遍历的目录中文件和目录的File实例数组
eg1:递归遍历文件夹
public static void main(String[] args) {
File f=new File("f:"+File.separator);
showAllFiles(f);
}
public static void showAllFiles(File f){
if(f!=null){
if(f.isDirectory()){ // 是否为目录
File[] files=f.listFiles(); // 返回当前正在遍历的目录中的文件和目录的File实例数组
if(files!=null){
for(File file:files){
showAllFiles(file);
}
}
}else{
System.out.println(f.getPath());
}
}
}
eg2:判断文件或目录是否存在,若存在进行删除操作,反之进行创建;
package file;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File f=new File("d:"+File.separator+"test.txt");
if(f.exists()){ // 判断文件或目录是否存在
f.delete(); // 删除文件
System.out.println("文件已删除");
}else{
try {
f.createNewFile(); // 创建新文件
System.out.println("创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
eg3:遍历的目录中文件和目录
package file;
import java.io.File;
public class ListFilesDemo {
public static void main(String[] args) {
File f=new File("d:"+File.separator);
File[] files=f.listFiles();
System.out.println(files.length);//文件长度
for(File file:files){
System.out.println(file);
}
}
}
eg4:创建目录,并进行当前路径和父目录路径进行展示;
package file;
import java.io.File;
public class DirDemo {
public static void main(String[] args) {
File f=new File("e:"+File.separator+"test1"+File.separator+"test2");
boolean flag=f.mkdirs(); // 创建目录,包括所有必需但不存在的父目录
System.out.println(flag?"目录创建成功":"创建失败");
System.out.println(f.getPath());
System.out.println(f.getParentFile());
}
}
二、IO流 的基本原理及分类
(1)数据流是指数据通信的通道
程序中输入、输出是以“流”方式进行的。
(2)IO流的分类
1、按流向分:
输入流:程序从数据源读取数据的流
输出流:程序向数据源写入数据的流
2、按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
3、按功能分:
节点流:用于直接操作目标设备的流
处理流:是对于一个已存在的流的连接和封装,通过对 数据的处理为程序为程序提供更强大、灵活的读写功能
(3)抽象流类:(JDK所提供的所有流类位于java.io包中,分别继承以下四种流类)
Reader: read(xx)读取字符系列方法;
Writer: write(xx)写入字符系列方法。
三、 文件字节流和 文件字符流
(1)类别
文件字节流:FileInputStream,FileOutputStream;
文件字符流:FileReader,FileWriter.
(2)构造方法:
a. FileInputStream类: FileInputStream(File file);
注意:前两种构造方法在向文件写数据时将覆盖文件中原有的内容;
创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空文件。
c.FileReader类:FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新FileReader;
FileReader(StringfileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
d.FileWriter类:FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter;
eg5:从文件向程序中读取数据(FileInputStream、InputStream):
package stream;
import java.io.*;
public class FileInputStreamDemo {
public static void main(String[] args) {
File f=new File("e:"+File.separator+"test.txt");
InputStream input=null;
try {
input=new FileInputStream(f);
/* 每次读取一个字节数据
int data=0;
while((data=input.read())!=-1){
byte b=(byte)data;
byte[] array=new byte[1];
array[0]=b;
String str=new String(array);
System.out.print(str);
}*/
byte[] b=new byte[1024]; // 自定义缓冲区(“卡车”)
int len=input.read(b); // 读取数据到byte[]数组中,返回读入到byte[]数组中的字节数
System.out.println("读取的内容是:"+new String(b,0,len));
}catch(Exception e) {
e.printStackTrace();
}finally{
try {
input.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
eg6:从程序向文件中写入数据(FileOutputStream、OutputStream):
package stream;
import java.io.*;
public class FileOutputStreamDemo {
public static void main(String[] args) {
File f=new File("e:"+File.separator+"test.txt");
OutputStream out=null;
try {
out=new FileOutputStream(f,true); // 开启追加模式
out.write("秦时明月之君临天下".getBytes());// 直接写入一个字节数组
String data="雪山飞狐";
byte[] b=data.getBytes();
out.write(b,0,4); // 使用三参的write(xxx)方法进行写入
System.out.println(f.length());
System.out.println("写入成功!");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
eg7:从文件向程序中读取数据(FileReader、Reader):
package stream;
import java.io.*;
public class FileReaderDemo {
public static void main(String[] args) {
Reader r=null;
try {
r=new FileReader("e:"+File.separator+"test.txt");
int data=r.read(); // 读取一个字符
char c=(char)data; // 转换成字符
System.out.println("第一次读取:"+c);
char[] cbuf=new char[1024]; // 自定义缓冲区
int len=r.read(cbuf); // 读取数据放入缓冲区中,返回存入缓冲区中的字符个数
System.out.println("第二次读取:"+new String(cbuf,0,len));
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
r.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
eg8:从程序向文件中写入数据(FileWriter、Writer):
package stream;
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
Writer w=null;
try {
w=new FileWriter("e:\\test.txt");
w.write("你好,File、IO".toCharArray()); // 写入字符数组
w.write("ABCDEFG"); // 写入字符串
w.write('a'); // 写入单个字符
w.flush(); // 将缓冲区中的写入内容,刷到磁盘上
System.out.println("写入成功!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}