file是java.io包下代表与平台无关的文件和目录 也就是说如果你想在程序里面访问文件或者目录的话,你就要使用到File这个类,file还能创建,删除,重命名文件和目录但是不能访问文件或者目录本身的内容,如果需要访问里面内容的话就必须使用输入/输出流。
File file=new File(" 可以放文件的绝对路径或者相对路径都OK ")
file.getName() 返回此File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)。
file.getPath(); 返回此File对象所对应的路径名
file.getAbsolutePath() : 返回此File对象所对应的绝对路径名。
file.getParent() : 返回此File对象所对应目录(最后一级子目录)的父目录名
file.renameTo(File newName) : 重命名此File对象所对应的文件或目录,如果重命名成功,则返回true;否则返回false。
file.exists() : 判断File对象所对应的文件或目录是否存在
file.canWriter() 判断File对象所对应的文件或目录是否可写。
file.canRead() 判断File对象所对应的文件或目录是否可读。
file.isFile() 判断File对象所对应的是否是文件,而不是目录。
file. isDirectory(): 判断File对象所对应的是否是目录,而不是文件
file.isAbsolute(): 判断File对象所对应的文件或目录是否是绝对路径。
file.delete(): 删除File对象所对应的文件或路径。
file. createNewFile() 当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功则返回true;否则返回false。
public class FileTest {
public static void main(String[] args) throws IOException {
// 以当前路径来创建一个File对象
File file = new File(“.”);
// 直接获取文件名
System.out.println(file.getName());
// 获取相对路径的父路径
System.out.println(file.getParent());
// 获取绝对路径
System.out.println(file.getAbsoluteFile());
// 获取上一级路径
System.out.println(file.getAbsoluteFile().getParent());
// 以系统当前时间作为新文件名来创建新文件
File newFile = new File(System.currentTimeMillis() + “”);
System.out.println(“newFile对象是否存在:” + newFile.exists());
// 以指定newFile对象来创建一个文件
newFile.createNewFile();
// 以newFile对象来创建一个目录,因为newFile已经存在
// 所以下面方法返回false,即无法创建该目录
newFile.mkdir();
// 使用list()方法列出当前路径下的所有文件和路径
String[] fileList = file.list();
System.out.println(“====当前路径下所有文件和路径如下======”);
for(String fileName : fileList) {
System.out.println(fileName);
}
}
}
iol流是实现数据的输出和输入的基础
io流的分类:
按流向来分:输入流(只能读数据而不能写数据) InputStream Reader
输出流(只能写数据而不能读数据)OutPutStram Writer
按数据单元来划分:字节流 (8个bit字节) InputStream OutPutStram
字符流(16个bit的字符)Reader Writer
节点流和处理流:
节点流:向一个特点的IO设备(如磁盘、网络)读/写数据的流,称为节点流,
处理流:则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能
InputStream和Reader都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流---会直接和指定文件关联。
在InputStream里包含如下三个方法。
int read() : 从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)。
int read(byte[] b) : 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数。
int read(byte[] b, int off, int len) : 从输入流中最多读取len个字节的数据,并将其存储在数组b中,放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数。
在Reader里包含如下三个方法:
int read() : 从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。
int read(char[] cbuf) : 从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。
int read(char[] cbuf, int off, int len) : 从输入流中最多读取len个字符的数据,并将其存储在字符数组cbuf中,放入数组cbuf中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字符串。
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
// 父类的实例对象指向子类的实现对象
InputStream fis = new FileInputStream(“a.txt”);
//定义一个缓冲的字符数组
byte[] bbuf = new byte[1024];
int len = 0;
//读取一个规定字节的文件数据,读入到规定的字节数组中。并返回读入的字符个数
while((len = fis.read(bbuf)) != -1) {
System.out.println(new String(bbuf, 0, len));
}
//关闭资源
fis.close();
}
}
OutputStream和Writer
OutputStream和Writer也非常相似,两个流都提供了如下三个方法
void write(int c) : 将指定的字节/字符输出到输出流中,其中c既可以代表字节,也可以代表字符。
void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中。
void write(byte[]/char[] buf, int off, int len): 将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中。
因为字符流直接以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。Writer里还包含如下两个方法。
void write(String str) : 将str字符串里包含的字符输出到指定输出流中。
void write(String str, int off, int len): 将str字符串里从off位置开始,长度为len的字符输出到指定输出流中。
public class FileOutputStreamTest {
public static void main(String[] args) {
try(
//创建字节输入流
FileInputStream fis = new FileInputStream(“a.txt”);
//创建字节输出流
FileOutputStream fos = new FileOutputStream(“newFile.txt”)) {
//定义字节缓冲数组
byte[] bbuf = new byte[32];
int len = 0;
while((len = fis.read(bbuf)) != -1) {
fos.write(bbuf, 0, len);
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
将Java对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原来的Java对象。
对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象。
public class Person implements java.io.Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
…
}
public class WriteObjectd {
public static void main(String[] args) {
try(
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“object.txt”));
) {
Person per = new Person(“孙悟空”, 500);
// per对象写入输出流
oos.writeObject(per);
} catch(IOException ex) {
ex.printStackTrace();
}
}
}
希望从二进制流中恢复Java对象,则需要使用反序列化。反序列化的步骤如下:
1.创建一个ObjectInputStream输入流,这个输入流是一个处理流,所以必须建立在其他节点流的基础上。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“object.txt”));
2.调用ObjectInputStream对象的readObject()方法读取流中的对象,该方法返回一个Object类型的Java对象,如果程序知道该Java对的类型,则可以将该对象强制类型转换成其真实类型。
Person p - (Person)ois.readObjectd();