第一讲 File类
一、概述
1、File类:文件和目录路径名的抽象表现形式
2、特点:
1)用来将文件或文件夹封装成对象
2)方便于对文件与文件夹的属性信息进行操作
3)File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
4)File对象可以作为参数传递给流的构造函数
二、File对象创建
方式一:
File f =new File("a.txt");
将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。
方式二:
File f2=newFile("c:\\abc","b.txt");
将文件所在目录路径和文件一起传入,指定文件路径。
方式三:
File d=new File("c:\\abc");
File f3=new File(d,"c.txt");
将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。
小知识:
File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”(双斜杠\\在windows中表示表示转义后的分隔符,但是在linux系统中就不是)。
三、File类的常见方法
1、创建
booleancreateNewFile();
//在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。
boolean mkdir();//创建文件夹,只能创建一级文件夹
例:
File dir=new File("abc");
dir.mkdir();//创建abc这个文件夹
boolean mkdirs();//创建多级文件夹
2、删除
boolean delete();
//删除文件或目录。文件存在,返回true;文件不存在或者正在被执行,返回false。
void deleteOnExit();//在程序退出时删除指定文件
3、判断
boolean canExecute();//是否是可执行文件
boolean exists();//文件是否存在
boolean isFile();//是否是文件
boolean isDirectory();//是否是文件夹
boolean isHidden();//是否是隐藏文件
boolean isAbsolute();//文件是否是绝对路径
记住:在判断文件对象是否是文件或者目录时,必须要判断该文件对象封装的内容是否存在。通过exists判断。
4、获取信息
String getName();//获取文件名
String getPath();
//获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)
String getParent();
//获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。
String getAbsolutePath();//获取文件的绝对路径
long lastModified();//返回文件最后一次被修改的时间
long length();//返回文件长度
5、列出文件及文件过滤
static File[] listRoots();//列出可用的文件系统根目录,即系统盘符
String[] list();
//列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
String[]list(FilenameFilter filter);
//返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。
//FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。
File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹
File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。
[java] view plain copy
- <span style="font-size:14px;">
-
-
-
-
-
-
- import java.io.*;
- class GetJavaFile
- {
- public static void main(String[] args)
- {
- File file=new File("E:\\Java Study\\Practice\\day07");
- getJavaFile(file);
- }
-
- public static void getJavaFile(File dir)
- {
-
- String[] javaFile=dir.list(new FilenameFilter()
- {
- public boolean accept(File dir,String name)
- {
- return name.endsWith(".java");
- }
- });
-
- System.out.println("len:"+javaFile.length);
-
- for (String s : javaFile )
- {
- System.out.println(s);
- }
- }
- }
- </span>
四、递归
1、定义
当函数内每一次循环还可以调用本功能来实现,也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。
2、递归注意事项
a、限定条件。是来结束循环调用,否则是死循环。
b、注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。
示例一
[java] view plain copy
-
-
-
-
-
-
- import java.io.*;
- class RecursionDemo
- {
- public static void main(String[] args)
- {
-
- File dir=new File("e:\\Java Study\\Practice");
-
-
- allFileList(dir,0);
- }
-
-
- public static void allFileList(File dir,int level)
- {
-
- System.out.println(getLevel(level)+dir);
- level++;
- File[] fileArr=dir.listFiles();
-
-
- for (File file : fileArr)
- {
- if(file.isDirectory())
- {
-
- allFileList(file,level);
- }
- else
- System.out.println(getLevel(level)+file);
- }
- }
-
-
- public static String getLevel(int level)
- {
- StringBuilder sb=new StringBuilder();
- sb.append("|--");
-
- for (int x=level;x>0 ; x--)
- {
-
- sb.insert(0,"| ");
- }
- return sb.toString();
- }
- }
示例二
[java] view plain copy
-
-
-
-
-
-
-
- import java.io.*;
- class RemoveDir
- {
- public static void main(String[] args)
- {
-
- File dir=new File("e:\\1");
-
- removeDir(dir);
-
- }
-
-
- public static void removeDir(File dir)
- {
- File[] files=dir.listFiles();
-
- for (File file : files )
- {
-
- if(!file.isHidden()&&file.isDirectory())
- removeDir(file);
- else
- System.out.println(file.toString()+":-file-:"+file.delete());
- }
- System.out.println(dir+":::dir:::"+dir.delete());
- }
- }
示例三
[java] view plain copy
-
-
-
-
-
-
-
-
-
- import java.util.*;
- import java.io.*;
-
- class JavaFileList
- {
- public static void main(String[] args)
- {
-
- File dir=new File("e:/Java Study/Practice");
-
-
- List<File> list =new ArrayList<File>();
-
-
- fileToList(dir,list);
-
-
- File file=new File(dir,"javafilelist.txt");
-
- writeToFile(list,file);
-
- }
-
- public static void fileToList(File dir,List<File> list)
- {
- File[] files=dir.listFiles();
-
- for (File file : files)
- {
-
- if(file.isDirectory())
- {
- list.add(file.getAbsoluteFile());
- fileToList(file,list);
- }
-
- else if(file.getName().endsWith(".java"))
- list.add(file);
- }
- }
-
-
- public static void writeToFile(List<File> list,File file)
- {
-
- BufferedWriter bw=null;
-
- try
- {
- bw=new BufferedWriter(new FileWriter(file));
- for (File file0 : list )
- {
- bw.write(file0.getAbsolutePath());
- bw.newLine();
- bw.flush();
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("写入文件失败");
- }
- finally
- {
- try
- {
- if(bw!=null)
- bw.close();
- }
- catch (IOException e)
- {
- throw new RuntimeException("流资源关闭失败");
- }
- }
- }
- }
第二讲 Properties类
一、概述
1、Properties是Hashtable的子类,它具备Map集合的特点。而且它里面还有存储的键值对,都是字符串,无泛型定义。是集合中和IO技术想结合的集合容器。
2、特点:
1)可用于键值对形式的配置文件
2)在加载时,需要数据有固定的格式,常用的是:键=值
二、特有方法
1、设置
Object setProperty(String key,String value);
//设置键和值,调用Hashtable的方法put
2、获取
String getProperty(String key);
//指定key搜索value
Set<String> stringPropertyName();
//返回属性列表的键集,存入Set集合
3、加载流和存入流
void load(InputStream ism);
//从输入字节流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。
void load(Readerreader);
//从输入字符流中读取属性列表(键和元素对)。又称将流中的数据加载进集合。
voidlist(PrintStream out);//将属性列表输出到指定的输出流
void store(OutputStreamout,String comments);
//对应load(InputStream )将属性列表(键值对)写入输出流。comments属性列表的描述。
void store(Writerwriter, String comments);
//对应load(Reader)将属性列表(键值对)写入输出流。comments属性列表的描述。
示例
[java] view plain copy
-
-
-
-
-
-
-
-
-
- public static void method()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();
-
- System.out.println(prop);
- }
练习:
[java] view plain copy
-
-
-
-
-
-
-
-
-
-
-
- import java.util.*;
- import java.io.*;
-
- class RunCount
- {
- public static void main(String[] args)throws IOException
- {
- int count=runCount();
- if(count>5)
- {
- System.out.println("次数到了,交钱!!!!!");
- return ;
- }
- else
- System.out.println("程序第"+count+"次Run!");
- }
-
- public static int runCount()throws IOException
- {
- Properties ps=new Properties();
-
- File file=new File("info.ini");
- if(!file.exists())
- file.createNewFile();
- FileReader fr=new FileReader(file);
-
- ps.load(fr);
-
- int count=0;
- String value=ps.getProperty("time");
-
- if(value!=null)
- {
- count=Integer.parseInt(value);
- }
- count++;
- ps.setProperty("time",count+"");
-
- FileWriter fw=new FileWriter(file);
- ps.store(fw,"");
-
- fr.close();
- fw.close();
-
- return count;
- }
- }
第三讲 打印流
一、概述
1、打印流包括:PrintStream和PrintWriter
2、该流提供了打印方法,可将各种类型的数据都原样打印。
二、字节打印流:PrintStream
构造方法中可接收的参数类型:
1、File对象。File
2、字符串路径:String
3、字符输出流:OutputStream
三、字符串打印流:PrintWriter
构造方法中可接受的参数类型
1、File对象:File
2、字符串路径:String
3、字节输出流:OutputStream
4、字符输出流:Writer
示例
[java] view plain copy
- import java.io.*;
-
- class PrintStreamDemo
- {
- public static void main(String[] args) throws IOException
- {
-
- BufferedReader bufr =
- new BufferedReader(new InputStreamReader(System.in));
-
-
- PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);
-
- String line = null;
-
- while((line=bufr.readLine())!=null)
- {
- if("over".equals(line))
- break;
- out.println(line.toUpperCase());
-
- }
-
-
- out.close();
- bufr.close();
-
- }
- }
第四讲 序列流
一、概述
1、SequenceInputStream对多个流进行合并。也被称为合并流。
2、常用构造函数
SequenceInputStream(Enumeration<?extends FileInputStream> e)
二、常见合并多个流文件步骤
1、创建集合,并将流对象添加进集合
2、创建Enumeration对象,将集合元素加入。
3、创建SequenceInputStream对象,合并流对象
4、创建写入流对象,FileOutputStream关联写入文件
5、利用SequenceInputStream对象和FileOutputStream对象读数据进行反复读写操作。
示例:
[java] view plain copy
-
-
-
-
-
-
-
-
-
- import java.util.*;
- import java.io.*;
-
- class SequenceInputStreamDemo
- {
- public static void main(String[] args)throws IOException
- {
- Vector<InputStream> ve=new Vector<InputStream>();
- ve.add(new FileInputStream("1.txt"));
- ve.add(new FileInputStream("2.txt"));
- ve.add(new FileInputStream("3.txt"));
-
- Enumeration<InputStream> en=ve.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();
- }
- }
练习:
[java] view plain copy
-
-
-
-
-
-
-
- import java.util.*;
- import java.io.*;
-
- class SplitFile
- {
- public static void main(String[] args) throws IOException
- {
-
- File file=new File("C:\\Users\\asus\\Desktop\\苏芮 - 一样的月光.mp3");
-
- splitFile(file);
-
-
- File file1=new File("E:\\Java Study\\Practice\\day20\\splitFile\\一样的月光.mp3");
-
- merge(file1);
-
- }
-
- public static void splitFile(File file)throws IOException
- {
-
- BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
-
- BufferedOutputStream bos=null;
-
-
- byte[] buf=new byte[1024*1024];
- int len=0,x=0;
- while ((len=bis.read(buf))!=-1)
- {
-
- bos=new BufferedOutputStream(new FileOutputStream("E:\\Java Study\\Practice\\day20\\splitFile\\"+(++x)+".part"));
- bos.write(buf,0,len);
- bos.close();
- }
-
- bis.close();
- }
-
-
- public static void merge(File file)throws IOException
- {
-
- ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
-
- for (int x=1;x<=6 ; x++)
- {
- al.add(new FileInputStream("E:\\Java Study\\Practice\\day20\\splitFile\\"+x+".part"));
- }
-
-
- final ListIterator<FileInputStream> it=al.listIterator();
- 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(file);
-
-
- byte[] buf=new byte[1024];
- int len=0;
- while((len=sis.read(buf))!=-1)
- {
- fos.write(buf,0,len);
- }
-
-
- fos.close();
- sis.close();
-
- }
-
- }