标签:
File类
1. 用来将文件或者文件夹封装成对象
2. 方便对文件与文件夹的属性信息进行操作(流只能操作数据)
3. File对象可以作为参数传递给流的构造函数
File类常见方法:
1. 创建
boolean createNewFile();在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文件,而且文件已经存在,则覆 盖。
boolean mkdir():创建文件夹
boolean mkdirs():创建多级文件夹
2. 删除
boolean delete(); //删除失败返回false
void deleteOnExit();//在虚拟机退出时删除指定文件
3. 判断
boolean exists();//文件是否存在
isFile();
isDirectory();
isHidden();
isAbsolute()//是否是绝对路径
4. 获取信息
getName();
getPath();
getParent();
getAbsolutePath();
long lastModified();//上次修改的时间
long length();//文件大小
import java.io.*; class day20 { public static void main(String[] args) throws IOException { method_5(); } public static void method_5() { File f1 = new File("file.txt"); File f2 = new File("haha.txt"); sop(f1.renameTo(f2)); } public static void method_4() { File f = new File("file.txt");//文件可以存在也可以不存在 sop("path:"+f.getPath());//相对路径 sop("abspath:"+f.getAbsolutePath());//绝对路径 sop("parent:"+f.getParent());//该方法返回的是绝对路径中的文件父目录 //如果获取的是相对路径,返回null,比如上面的file.txt。如果相对路径中有 //上一层目录,那么该目录就是返回结果 } public static void method_3()throws IOException { File f = new File("file.txt"); f.createNewFile(); //记住在判断文件对象是否是文件或者目录时,必须要先判断文件 //对象封装的内容是否存在,通过exists判断。 sop("dir:"+f.isDirectory()); sop("file:"+f.isFile()); sop(f.isAbsolute());//是否是绝对路径 } public static void method_2() { File f = new File("file.txt"); //sop("execute:" + f.canExecute()); sop("exists:"+f.exists()); } public static void method_1() throws IOException { File f = new File("file.txt"); //f.deleteOnExit();//虚拟机退出时删除,就算中间发生异常也没关系 //sop("create:" + f.createNewFile()); sop("delete:"+f.delete()); //创建文件夹(目录) File dir = new File("abc"); sop("mkdir:"+dir.mkdir()); //File dirs = new File("abc\\d\\kk\\ff\\fdg"); //dirs.mkdirs(); } //创建File对象 public static void consMethod() { //将a.txt封装成file对象,可以将已有的和未出现的 //文件或者文件夹封装成对象 File f1 = new File("c:\\a.txt"); File f2 = new File("c:\\abc", "b.txt"); File d = new File("c:\\abc"); File f3 = new File(d, "c.txt"); sop("f1:" + f1); sop("f2:" + f2); sop("f3:" + f3); File f4 = new File("c:"+File.separator+"abc"+File.separator+"t.txt"); //File.separator是分隔符,可以跨平台 } public static void sop(Object obj) { System.out.println(obj); } }
列出指定目录下的所有文件和目录(不包含子目录中的文件)
import java.io.*; class day20 { public static void main(String[] args) throws IOException { File dir = new File("d:\\java_day18");//当前目录下的目录和文件对象(不包含子目录中的文件) File[] files = dir.listFiles(); for(File f : files) { sop(f.getName()+"::"+f.length()); } } public static void listDemo2() { File dir = new File("d:\\java_day18"); String[] arr = dir.list(new FilenameFilter()//文件名过滤器 { public boolean accept(File dir, String name) { //sop(dir+"..."+name); return name.endsWith(".txt");//只显示.txt文件 } }); sop(arr.length); for(String name : arr) { sop(name); } } public static void listDemo()//打印c盘下文件和文件夹的名称 { File f = new File("c:\\"); String[] names = f.list();//调用list方法的file对象必须是封装了一个目录, //该目录还必须存在 for(String name : names) { sop(name); } } public static void listRootsDemo()//打印出所有的盘符 c:\\ d:\ { File[] files = File.listRoots(); for(File f : files) { sop(f); } } public static void sop(Object obj) { System.out.println(obj); } }
列出指定目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下的所有内容。
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。
递归要注意:
1. 限定条件
2. 要注意递归的次数,避免内存溢出。
import java.io.*; class day20 { public static void main(String[] args) throws IOException { File dir = new File("d:\\java_day18"); showDir(dir, 0); } public static String getLevel(int level)//单纯是为了让显示直观一些 { StringBuilder sb = new StringBuilder(); sb.append for(int x = 0; x < level; x ++) { sb.append("|--"); } return sb.toString(); } public static void showDir(File dir, int level) { sop(getLevel(level)+dir);//打印下目录 level++; File[] files = dir.listFiles(); for(File file : files) { if(file.isDirectory()) showDir(file, level); else sop(getLevel(level)+dir); } } public static void sop(Object obj) { System.out.println(obj); } }
输出:
d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18
|--d:\java_day18\hello
|--|--d:\java_day18\hello
|--d:\java_day18
删除一个带内容的目录。
删除原理:
在windows中,删除目录是从里面往外删除的。
既然是从里往外删除,就需要用到递归。
import java.io.*; class day20 { public static void main(String[] args) throws IOException { File dir = new File("d:\\java_day18"); removeDir(dir); } public static void removeDir(File dir) { File[] files = dir.listFiles(); for(int x = 0; x < files.length; x ++) { if(!files[x].isHidden() && files[x].isDirectory()) removeDir(files[x]); else sop(files[x].toString()+".."+files[x].delete()); } sop(dir.toString()+"....>>>"+dir.delete()); } public static void sop(Object obj) { System.out.println(obj); } }
练习:将一个指定目录下的txt文件的绝对路径,存储到一个文本文件中。建立一个txt文件列表文件。
思路:
1. 对指定的目录进行递归。
2. 获取递归过程中所有的txt文件的路径。
3. 将这些路径存储到集合中。
4. 将集合中的数据写入到一个文件中。
import java.io.*; import java.util.*; class day20 { public static void main(String[] args) throws IOException { File dir = new File("d:\\java_day18"); List<File> list = new ArrayList<File>(); fileToList(dir, list); //sop(list.size()); File file = new File(dir, "javaList.txt"); writeToFile(list, file.toString()); } //将dir目录下所有.txt文件绝对路径保存到list集合中去 public static void fileToList(File dir, List<File> list) { File[] files = dir.listFiles(); for(File file : files) { if(file.isDirectory()) fileToList(file, list); else { if(file.getName().endsWith(".txt")) list.add(file); } } } //将文件绝对路径的集合中的文件绝对路径写入到文件中去 public static void writeToFile(List<File> list, String javaListFile)throws IOException { BufferedWriter bufw = null; try { bufw = new BufferedWriter(new FileWriter(javaListFile)); for(File f :list) { String path = f.getAbsolutePath(); bufw.write(path); bufw.newLine(); bufw.flush(); } } catch (IOException e) { throw e; } finally { try { if(bufw != null) bufw.close(); } catch (IOException e) { throw e; } } } public static void sop(Object obj) { System.out.println(obj); } }
Properties是hashtable的子类。也就是说它具备Map集合的特点,而且它里面存储的键值对都是字符串。是集合中和io技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。
那么加载数据时,需要数据有固定格式:键=值
import java.io.*; import java.util.*; class day20 { public static void main(String[] args) throws IOException { method_2_loadDemo(); } //如何将流中的数据存储到集合中 //想要将info.txt中键值数据存到集合中进操作 //info.txt中的内容如下: //zhangsan=40 //lisi=50 /* 1.用一个流和info.txt文件关联 2.读取一行数据,将该行数据用'='分割 3.等号左边作为键,右边作为值,存入到properties集合中即可 */ public static void method_2_loadDemo() throws IOException { FileInputStream fis = new FileInputStream("info.txt"); Properties prop = new Properties(); //将流中的数据加载进集合 prop.load(fis);//封装好了 //sop(prop); prop.list(System.out);//列出集合目录 prop.setProperty("zhangsan", "100");//修改内存中,但没修改文件中的数据 FileOutputStream fos = new FileOutputStream("info.txt"); prop.store(fos, "midified"); prop.list(System.out);//列出集合目录 fos.close(); fis.close(); } public static void method_1() throws IOException { BufferedReader bufr = new BufferedReader(new FileReader("info.txt")); String line =null; Properties prop = new Properties(); while((line = bufr.readLine()) != null) { String[] arr = line.split("="); prop.setProperty(arr[0], arr[1]); } bufr.close(); sop(prop); } //设置和获取元素 public static void setAndGet() { Properties prop = new Properties(); prop.setProperty("zhangsan", "30"); prop.setProperty("lisi", "40"); //sop(prop); String value = prop.getProperty("lisi"); sop(value);//输出40 //修改 prop.setProperty("lisi", "89"); //获取全部 Set<String> names = prop.stringPropertyNames(); for(String s : names) { sop(s+":"+prop.getProperty(s)); } } public static void sop(Object obj) { System.out.println(obj); } }
用于记录应用程序运行次数。如果使用次数已到,那么给出注册提示。
很容易想到的是:计数器。可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行了自增。但随着该应用程序的退出,该计数器也在内存中消失。下一次再启动该程序,又重新开始从0计数。这样不是我们想要的。想要的是程序即使结束,该计数器的值也存在,下次程序启动后会先加载该计数器的值并加1后再重新存储起来。所以要建立一个配置文件,用于记录该软件的使用次数。
该配置文件使用键值对的形式。这样便于阅读数据,并操作数据。键值对数据是map集合,数据是以文件形式存储,使用io技术。那么map+io-àproperities。配置文件可以实现应用程序数据的共享。
import java.io.*; import java.util.*; class day20 { public static void main(String[] args) throws IOException { Properties prop = new Properties(); File file = new File("count.ini");//先封装成文件对象,可以判断存不存在 if(!(file.exists()))//文件不存在,创建一个 file.createNewFile(); FileInputStream fis = new FileInputStream(file); prop.load(fis); int count = 0; String value = prop.getProperty("time"); if(value != null) { count = Integer.parseInt(value); if(count >= 5) { sop("DATE OUT"); return; } } count ++; prop.setProperty("time", count+""); FileOutputStream fos = new FileOutputStream(file); prop.store(fos,""); fos.close(); fis.close(); } public static void sop(Object obj) { System.out.println(obj); } }
打印流
该流提供了打印方法,可以将各种类型数据都原样打印。
PrintStream 字节打印流
构造函数可以接受的参数类型:
1. file对象 File
2. 字符串路径 String
3. 字节输出流 OutputStream
PrintWriter 字符打印流
1. file对象 File
2. 字符串路径 String
3. 字节输出流 OutputStream
4. 字符输出流 Writer
import java.io.*; import java.util.*; class day20 { publicstatic void main(String[] args) throws IOException { BufferedReaderbufr = new BufferedReader(new InputStreamReader(System.in)); PrintWriterout = new PrintWriter(System.out, true); //保存到文件中PrintWriterout = new PrintWriter(new FileWriter("a.txt", true)); //true代表println换行自动刷新 Stringline = null; while((line = bufr.readLine()) != null) { if("over".equals(line)) break; out.println(line.toUpperCase()); //out.flush();前面如果有true,就不用写这句话了 } out.close(); bufr.close(); } publicstatic void sop(Object obj) { System.out.println(obj); } }
序列流
SequenceInputStream
多个流变成一个流
将1.txt 2.txt 3.txt 三个文件的内容保存到4.txt 一个文件中去
import java.io.*; import java.util.*; class day20 { public static void main(String[] args) throws IOException { Vector<FileInputStream> v = new Vector<FileInputStream>(); v.add(new FileInputStream("1.txt")); v.add(new FileInputStream("2.txt")); v.add(new FileInputStream("3.txt")); Enumeration<FileInputStream> en = v.elements(); SequenceInputStream sis = new SequenceInputStream(en); //多个流对象编程一个流 FileOutputStream fos = new FileOutputStream("4.txt"); byte[] buf = new byte[1024]; int len = 0; while((len = sis.read(buf)) != -1) { fos.write(buf, 0, len); } fos.close(); sis.close(); } public static void sop(Object obj) { System.out.println(obj); } }
接下来能合并就能切割
import java.io.*; import java.util.*; class day20 { public static void main(String[] args) throws IOException { merge(); } public static void splitFile()throws IOException { FileInputStream fis = new FileInputStream("x.jpg"); FileOutputStream fos = null; byte[] buf = new byte[1024 * 1024];//1M int len = 0; int count = 1; while((len = fis.read(buf)) != -1)//每1M就存一个文件 { fos = new FileOutputStream("splitFiles\\"+(count++)+".part"); fos.write(buf, 0, len); fos.close(); } fis.close(); } public static void merge() throws IOException//合并切割文件 { ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); for(int x = 1; x<= 7; x++) { al.add(new FileInputStream("splitFiles\\"+x+".part")); } final Iterator<FileInputStream> it = al.iterator(); //下面匿名内部类访问到了it,所以这里要用final修饰 Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() { public boolean hasMoreElements() { return it.hasNext(); } public FileInputStream nextElement() { return it.next(); } }; SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream("victory.jpg");//合并成该文件 byte[] buf = new byte[1024 * 1024]; int len = 0; while((len = sis.read()) != -1) { fos.write(buf, 0, len); } fos.close(); sis.close(); } public static void sop(Object obj) { System.out.println(obj); } }
标签:
原文地址:http://blog.csdn.net/sr_19930829/article/details/51360932