------- android培训、java培训、期待与您交流! ----------
IO流(二)
File类
File的概述:
操作数据源的时候,大多的数据源都是来自文件或者文件夹,上次说到文件名可以通过字符串直接传入,但是这样一来得到的就是只有文件里面的数据流,有时候需要用到文件的属性等,想要得到文件的属性,就要用的将文件封装成为对象,通过文件对象,就可以访问到文件的属性。
①用来将文件或者文件夹封装成为对象
②方便对文件或者文件夹的属性信息进行操作
③File类对象可以作为参数传递给IO流
下面了解一些常用方法:
File类的构造方法:
File(String parent ):通过给定的抽象路径得到文件对象
File(String parent,String child):通过parent字符串和child字符串的结合得到文件路径,创建File类对象
File(File parent ,String child):在得到在文件或者文件夹的对象下,将child文件或者文件夹封装成为File类对象
例子:
package cn.itheima.IO;
import java.io.File;
public class FileDmeo1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//封装一个相对路径,封装的路径是什么,得到的对象的路径就是什么
//这里封装的到的对象是:test.txt
File file1 = new File("test.txt");
//这个构造函数和第一个其实差不多,他就是把两个字符串连接起来,再进行创建File对象
File file2 = new File("D:\\javaProject\\Itheima","test.txt");
//先得到想要封装的文件或者文件夹的上级目录,封装成为对象
File file = new File("D:\\javaProject\\Itheima");
//传入将要封装的文件或者文件夹的父目录的对象,在该对象和字符串创建File对象
File file3 = new File(file,"test.txt");
System.out.println(file);
System.out.println(file1);
System.out.println(file2);
System.out.println(file3);
//得到的结果
// D:\javaProject\Itheima
// test.txt
// D:\javaProject\Itheima\test.txt
// D:\javaProject\Itheima\test.txt
}
}
File类常见方法:
CreatNewFile():在指定的位置创建文件,如果文件不存在,创建,反之,创建失败,和IO不同,IO流创建文件的时候文件存在就会覆盖该文件
delete():删除文件或者文件夹,删除的文件若不存在则反回false,有文件,只能删除一次
delteOnExit():在程序退出时删除指定文件,
exitsts():判断文件是否存在,在判断文件的各种属性的时候,应该先判断文件对象封装的类容是否存在。
isDirectory():判断是否是目录文件
isAbsolute():判断封装的路径是否为绝对路径
lastModified():文件的最后修改时间
getPath():File类封装的路径,封装的是什么路径,得到的就是什么样的路径
getAbsolutePath():获得封装的文件路径的绝对路径
getParent():获取封装文件的上一级目录,如:File file = new File("test.txt");得到的父目录为null,File file = new File("abc\\test.txt");得到的父目录的值为abc
renameTo(new File):改变文件名,参数中还可以指定改变后文件的名字以及改变后的文件存储的位置
文件目录:
listRoots():列出可用的文件系的根,也就是列出本机盘符
list(): 打印指定目录下的文件夹或者文件名称(包含隐藏文件),调用list()的File对象必须是封装了一个目录,且该目录必须存在。
lsit(FilenameFilter f);过滤文件,只需要自己想要的文件,比如说获取某一个文件夹下面的.java文件,实现FilenameFilter接口,并覆盖实现accept方法
listFiles();得到当前文件夹下面的所有文件或者文件的对象,返回的一个Fiel数组
例子:
package cn.itheima.IO;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class listRootsDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//getRoots();
//getlist();
//getJavaFile1();
//getJavaFile();
getlistFiles();
}
private static void getlistFiles() {
// TODO Auto-generated method stub
File file = new File("D:\\javaProject\\Itheima");
File[] fi=file.listFiles();
for(File f : fi){
System.out.println(f);
}
}
private static void getJavaFile() {
// TODO Auto-generated method stub
File file = new File("D:\\javaProject\\Itheima");
if(file.length()==0){
return;
}
String[] str = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".java");
}
});
for(String s:str){
System.out.println(s);
}
}
//自定义:得到指定文件路径下的.java文件
private static void getJavaFile1() throws IOException{
// TODO Auto-generated method stub
File file = new File("D:\\javaProject\\Itheima");
if(file.length()==0){
return;
}
String[] str = file.list();
for(String s : str){
if(s.endsWith(".java"))
System.out.println(s);
}
}
private static void getlist() {
// TODO Auto-generated method stub
File file = new File("c:\\");
//当前目录下的所有文件,包含隐藏文件,必须是封装一个目录,若果封装的是一个文件,产生异常,
//如果目录下没有文件,返回null
String[] str =file.list();
for(String s : str){
System.out.println(s);
}
}
private static void getRoots() {
//listRoots获取本机中盘符
File[] files = File.listRoots();
for(File file : files){
System.out.println(file);
}
}
}
得到一个文件夹里面的所有内容,输入在打印台上,然后删除这个文件夹
思路:
得到文件里面所有的信息:如果文件夹下面还有文件夹,得判断文件夹下面是否有文件夹,知道文件夹下面的只是文件,这里就要使用到递归思想
删除文件:再得到文件的前提,从最底层目录删除,依次向上删除,知道指定文件夹,也使用递归
下面是自己写的实例:
package cn.itheima.IO;
import java.io.File;
import java.io.IOException;
public class getAllFile {
/**
*获取指定文件夹所有的内容
*并且删除此文件夹下所有内容:
*思路:从里向外删除,使用递归
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
String dir ="D:\\javascript";
getAll(dir);
}
private static void getAll(String dir) throws IOException {
File file = new File(dir);
File[] files = file.listFiles();
for(File f : files){
//判断是否是文件夹
if(f.isDirectory()){
dir=f.getAbsolutePath();
getAll(dir);
}
System.out.println(f.getName());
f.delete();
}
file.delete();
}
}
Properties使用:
properties是hashtable的子类,具备了Map集合的特点,里面存储都是键值对,是集合和IO技术想结合的集合容器,它可以作为配置文件使用,可作为持久化设备存储。
下面通过Property的一个实例来了解其用法和他所拥有的方法:
package cn.itheima.IO;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PropertiesDemo {
/**
*
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
loadFile();
}
private static void loadFile() throws IOException{
// TODO Auto-generated method stub
//加载一个指定的文件,该文件里存储的是键值对,将其加载进Properties中
//源:文件(硬盘) 操作字符流,使用Reader系列 目的:文件(硬盘)
FileReader fr = new FileReader("test2.txt");
//创建Properties对象
Properties p = new Properties();
//将流加载进Properties中
p.load(fr);
//改变其中某个key的值
p.setProperty("zhangsan","98");
System.out.println(p);
//将Properties作为持久化存储设备
FileWriter fw = new FileWriter("test3.txt");
//Properties中的store是将Properties加载到指定的流中,参数二是一个注释,不被Properties所加载
p.store(fw, "haha");
fr.close();
fw.close();
}
}
Properties中的load方法理解:
读取相应的字符流信息,通过每次读取一行,在”=“处进行字符串的分隔,分隔得到的左面即为Properties的key值,右面为vaule值,经过setProperty(String key,String vaule)就可以将读取到的数据加入Properties中。其他的一些方法都很容易理解,这里就不做详细介绍了
PrintWriter(字符打印流)与PrintStream(字节打印流)类
两者都可以理解为打印流,就是为其他的流增加了一些功能,使其能够打印出数据的原样性,也可直接操作文件
PrintStream类构造函数可以接收的参数类型:①文件对象 PrintWriter类的构造函数可以接收的参数类型: ① 文件对象
②字符串路径 ②字符串路径
③字节输出流 ③字节输出流
④Writer(字符输出流)
两者中都可以对基本数据类型进行直接的操作,writer接受的参数就可以决定对那一种类型的数据进行操作,都比较简单这里主要介绍PrintWriter中的几个现象
在PrintWriter的PrintWriter(OutputStream out, boolean autoFlush)
构造函数中,可以通过设置autoFlush为true,在使用Println将数据打印出去的时候,就会
实现自动刷新,而不需指定flush,当要将数据写入文件的时候也是一样的,只是的注意OutputStream中要将文件封装成为一个字节输出流,autoFlush的值true即可
SequenceInputStream 类
可以将多个流对象整合成为一个流对象,它有两个构造函数,SequenceInputStream(InputStream s1,InputStream s2)
接受两个流对象,先读取s1,再读取s2,
有三个以上的流对象的时候,就要使用SequenceInputStream(Enumeration<? extends InputStream> e)
的构造函数,首先要将所有的流对象放入Enumeration中,
通过Vector可以将流对象加入Enumeration中,就可以将几个流合并成为一个流
借助实例理解:
package cn.itheima.IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class SequenceInputDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("test1.txt"));
v.add(new FileInputStream("test2.txt"));
v.add(new FileInputStream("test3.txt"));
FileOutputStream fos = new FileOutputStream("demo.txt");
Enumeration<FileInputStream> en= v.elements();
SequenceInputStream s = new SequenceInputStream(en);
byte[] buf = new byte[1024];
int len=0;
while((len=s.read(buf))!=-1){
fos.write(buf,0,len);
}
s.close();
fos.close();
}
}
IO流还有一些相关的知识,将会写在下一次博客中