黑马程序员——Java基础——IO流(二)——File类、Properties类、打印流、序列流
第一件 File类
一、File类
a、用于将文件或者文件夹封装成对象
b、方便对文件与文件夹的属性信息进行操作
c、File对象可以作为参数传递给流的构造函数
d、了解File类中的常用方法
二、File对象的创建
a、File f=new File("a:\\a.txt");
b、File f2=new File("C:\\abc","a.txt");//分开的好处是后一个参数能够使用其他对象如string
c、File d=new File("C:\\abc")
File f3=new File(d,"c.txt")
知识点File.seperator是跨平台的分隔符如:File f=new File("a:"+File.seperator+"a.txt");
二、File类的常见方法
1、创建
boolean createNewFile();
Boolean mkdir():创建文件夹,只能一级文件夹
Boolean mkdirs():增加了个就能创建多级文件夹了
2、删除
boolean delete();//删除文件或目录;文件存在返回true,不存在或被执行时,返回false
void deleteOnExit();//程序退出时删除
3、判断
boolean exists();//是否存在。经常用
boolean ifFile();//是否问价
boolean isDirectory;是否文件夹
boolean isHidden();是否隐藏文件
boolean isAbsolute();是否问价绝对路径
4、获取信息
String getName()//获取文件名
String getPath();//获取问价的相对路径(就是说文件创建时传什么就写什么)
String getParent();//获取文件父目录。返回的是绝对路径的父目录。如果获取的是相对路径,返回null,如果相对路径有上一层目录,则返回这个
String getAbsolutePath():获取文件的绝对路径
long lastModified():返回文件最后一次被修改的时间
long length();返回文件长度
boolean rename();有点类似剪切
5、列出文件及文件的过滤器
static File[] listRoots();//列出可用的文件系统根目录
String[] list()//列出单曲所有文件,放回string【】
File[] listFiles()//列出所有文件。返回的是路径
String【】 list(FilenameFilter filter(过滤器))//获取满足过滤器的文件,放回文件数组名
File[] ListFiles(FilenameFilter filter(过滤器))//满足过滤器的文件,返回的是文件路径
一下是使用过滤器寻找一个文件夹内的某类文件的例子:
1 /*练习:获得一个某一文件下的.jpg文件 2 * 思路:1、创建某一个File类,通过一个自定义的函数getJpg找到他的jpg文件; 3 * 2、使用listFiles(new FilenameFilter(){//复写accept()})即可 4 */ 5 import java.io.*; 6 public class GetFile { 7 public static void main(String[] args){ 8 File file=new File("F:\\tupain"); 9 getJpg(file); 10 } 11 //获得一个目录下所有jpg的方法 12 private static void getJpg(File file) { 13 // 传入FilenameFilter匿名内部类,并复写accept方法 14 File[] jfile=file.listFiles(new FilenameFilter() { 15 public boolean accept(File dir, String name) {//复写accpt 16 return name.endsWith(".jpg"); 17 } 18 });//注意这个位置 19 for(File f:jfile){ 20 System.out.println(f); 21 } 22 } 23 }
四、递归
1、定义:函数类每次循环都调用自身
1 /* 2 * 列出指定目录下文件或文件夹的目录,包括子目录 3 * 阶乘和二进制的递归方法 4 * 思路: 5 * 1、将需要搜索的文件夹使用listFiles后得到file数组 6 * 2、用for循环遍历 7 * 3、当出现不为空(使用ofDirectory()判断)时,再次调用自身函数 8 * 注:上述调用自身函数的方法称为递归 9 */ 10 import java.io.*; 11 public class DiGuiDemo { 12 public static void main(String[] args) { 13 File dir=new File("F:"); 14 showDir(dir); 15 } 16 //遍历文件和其子文件 17 private static void showDir(File dir) { 18 System.out.println(dir+""+f); 25 } 26 } 27 // 二进制 28 public static void toBin(int n){ 29 if(n>0){ 30 toBin(n/2); 31 System.out.println(n%2); 32 } 33 } 34 // 阶乘 35 public static int getX(int n){ 36 if(n==1){ 37 return 1; 38 } 39 return n*getX(n-1); 40 } 41 }
练习3:
1 /* 2 * 练习题: 3 * 做一个指定目录下的.avi文件的绝对路径,存储到一个文本文件中。 4 * 思路: 5 * 1、对指定目录遍历; 6 * 2、获得递归过程所以的java文件路劲 7 * 3、将这些路径存储到集合 8 * 4、将集合中的数据写入一个文本中; 9 */ 10 import java.io.*; 11 import java.util.*; 12 public class JavaFileList { 13 public static void main(String[] args){ 14 // 指定目录 15 File dir=new File("F:"); 16 // 定义一个list集合,用于存储.java文件的file对象 17 List<File> list=new ArrayList<File>(); 18 // 调用获取文件路径方法,最后的list就获得了指定类型的文件路径 19 fileTolist(dir,list); 20 // 指定写入文件 21 File f=new File(dir,"avi大全.txt"); 22 // 调用写入文件方法 23 writeTO(f,list); 24 } 25 //将集合中元素写入一个文本文件中 26 private static void writeTO(File f, List<File> list) { 27 BufferedWriter bw=null; 28 try { 29 // 使用字符流缓冲区对象关联写入的文件 30 bw=new BufferedWriter(new FileWriter(f)); 31 for( File f0:list ){ 32 bw.write(f0.getAbsolutePath()); 33 bw.newLine(); 34 bw.flush(); 35 } 36 37 } catch (IOException e) { 38 throw new RuntimeException("写入文件失败"); 39 } 40 finally{ 41 try { 42 if(bw!=null) 43 bw.close(); 44 } catch (IOException e2) { 45 46 } 47 } 48 } 49 //获取指定文件内所有的据对路径 50 private static void fileTolist(File dir, List<File> list) { 51 File[] files=dir.listFiles();//列出dir的目录 52 // 开始遍历 53 for(File f:files){ 54 // 如果是非隐藏的且在目录内的继续 55 if(!(f.isHidden())&&f.isDirectory()){ 56 fileTolist(f,list); 57 }else if(f.getName().endsWith(".avi")||f.getName().endsWith(".mov")){ 58 list.add(f); 59 } 60 } 61 } 62 }
第二讲 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);//从输入字节流中读取属性列表(键和元素对)。
1 /* 2 * 练习:要做一个软件有一定运行次数限制的注册软件 3 * 4 * 分析:由于需要每一次软件开关与关闭时该注册列表都保存有,所以需要使用io技术+键值对形式存储 5 * map+io====properties 6 * 思路:1、需要封装一个file文件用于判断原来的配置文件 7 * 2、使用集合properties为存储容易存储配置信息;分别用FileInputStream和FileOutputStream流 8 * 来传输信息 9 * 3、每运行一次,使用计数器count增加一次,最后通过判断 10 * 关键语句:porperties:load()用于读取缓冲流信息 getProperty(key):由键得值 11 * store(写入缓冲流对象,备注) 12 * Integer.parseInt()获得字符型变int型 13 * FileInputStream和FileOutputStream这里信息少不需要增强 14 */ 15 import java.io.*; 16 import java.util.*; 17 public class RunCout { 18 public static void main(String[] args) throws IOException{ 19 Properties prop=new Properties();//创建一个存放键值对的集合 20 21 File file=new File("D\\count.ini");//建立一个封装用的文件。后缀为ini 22 23 if(!file.exists()){//判断是否存在 24 file.createNewFile(); 25 } 26 // 非存文本,硬盘里所以用FileInputStream读取 27 FileInputStream fis=new FileInputStream(file); 28 prop.load(fis);//集合读取的是缓冲流信息 29 int count=0; 30 String value=prop.getProperty("time");//由键读值,这个time应该是默认就有的 31 if(value!=null){ 32 count=Integer.parseInt(value);//count获得value的信息 33 if(count>=5){ 34 System.out.println("此路是我开,拿钱"); 35 return; 36 } 37 } 38 count++; 39 prop.setProperty("time", "count");//设置一下time=count 40 // 至此prop集合已经设置好,只需要传进列表中需要FileOutputStream,传入源的file中 41 FileOutputStream fos=new FileOutputStream(file); 42 prop.store(fos, "");// 43 // 关流 44 fis.close(); 45 fos.close(); 46 } 47 }
第三讲 打印流
1|打印流:该流提供打印数据,将各个类型的数据原样打印
2、字节打印流:PrintStream
1、File对象。File
2、字符串路径:String
3、字节输出流:OutputStream
2、字节打印流:PrintWriter
1、File对象。File
2、字符串路径:String
3、字节输出流:OutputStream
4、多一个:字符输出流:writer
举个字符流的例子:
import java.io.*; public class PrintStreamDemo { public static void main(String[] args)throws IOException{ // 键盘录入 BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); // 使用打印流并关联文件 File file=new File("D:\\a.txt"); PrintWriter pw=new PrintWriter(new FileWriter(file),true);//true的刷新只针对流而已的 // 所以true前面的参数需要new一个FileWriter对象 String line=null; while((line=br.readLine())!=null){ if(line.equals("over")){ System.out.println("程序结束"); break; } pw.println(line.toUpperCase());//大写输出 // pw.flush;由于前面prinyWriter(,true)所以不需要刷新 } br.close(); pw.close(); } }
总结:打印流很屌,可以多运用下~
第四讲 序列流
概述:
1、打印流SequenceInputStream,也称合并流,就是把多个流合并
2、常用构造函数:
SequenceInputStream(Enumeration<?extends FileInputStream> e);
常见合并多个流的步骤
1、创建Vector集合,将对象文件添加
2、创建Enumeration对象,将集合元素加入
3、创建SequenceInputStream对象,合并枚举对象
4、输出写入流相关联文件
5、数组缓冲读取法读取
1 /*合并流:SequenceINputStream 2 * 需求:将三个文本合并为一个 3 * 思路: 4 * 1、创建一个Vector集合(由于只能用枚举(Enumeration)),用于三个流添加到集合 5 * 2、创建Enumeration,创建SequenceInputStream对象关联Enumeration 6 * 3、输出流关联新文本 7 * 4、反复读写操作 8 * 关键字:Enumeration需要Vector集合 9 * 10 */ 11 import java.util.*; 12 import java.io.*; 13 public class SequenInputDemo { 14 public static void main(String[] args) throws IOException{ 15 Vector<FileInputStream> ve=new Vector<FileInputStream>();//创建几个智能方法InputStream流 16 ve.add(new FileInputStream("D:\\11.txt")); 17 ve.add(new FileInputStream("D:\\22.txt")); 18 ve.add(new FileInputStream("D:\\合并.txt")); 19 20 Enumeration<FileInputStream> en=ve.elements();//创建en枚举ve 21 // 合并流合并en 22 SequenceInputStream sis=new SequenceInputStream(en); 23 // 关联被写入的文件 24 FileOutputStream fos=new FileOutputStream("D:\\合并2.txt"); 25 // 开始写了 26 byte[] buf=new byte[1024]; 27 int len=0; 28 while((len=sis.read(buf))!=-1){ 29 fos.write(buf,0,len);//写进fos的FileOutputStream中 30 } 31 fos.close(); 32 sis.close(); 33 } 34 }
最后一个分几节输送文件的栗子:
1 public class qiegeDemo { 2 3 public static void main(String[] args) throws IOException{ 4 // 关联要切割文件, 5 File file=new File("D:\\dog.JPG"); 6 int num=mysplit(file);//mysplit方法放回int型代表了分开了num节-1 7 // 合并后的文件 8 File fi=new File("D:\\zz.JPG"); 9 myHebin(num,fi); 10 } 11 //开始切啦 12 private static int mysplit(File file) throws IOException { 13 BufferedInputStream bis= 14 new BufferedInputStream(new FileInputStream(file)); 15 16 BufferedOutputStream bos=null;//由于要多次写入所以只定义不new 17 18 byte[] buf=new byte[1024*1024];//一兆 19 20 int len=0,count=1; 21 22 while((len=bis.read(buf))!=-1){ 23 // 没满一兆就写入一个新文件,注意每次改名字后缀名随便取 24 bos=new BufferedOutputStream(new FileOutputStream("D:\\22\\"+(count++)+".part")); 25 bos.write(buf,0,len); 26 bos.close();//每次关闭 27 } 28 bis.close(); 29 return count; 30 } 31 public static void myHebin(int num,File file)throws IOException 32 { 33 // 使用ArrayList 34 ArrayList<FileInputStream> al=new ArrayList<FileInputStream>(); 35 for(int x=1;x<num;x++){ 36 al.add(new FileInputStream("D:\\22\\"+x+".part")); 37 } 38 // Enumeration是Vector的特有方法,所以要创建匿名内包内改写 39 ListIterator<FileInputStream> it=al.listIterator(); 40 Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() { 41 public FileInputStream nextElement() { 42 return it.next(); 43 } 44 @Override 45 public boolean hasMoreElements() { 46 return it.hasNext(); 47 } 48 }; 49 50 // 关联枚举对象 51 SequenceInputStream sis=new SequenceInputStream(en); 52 // 关联要写入的文件 53 FileOutputStream fos=new FileOutputStream(file); 54 55 // 一下考虑封装一下 56 byte[] buf=new byte[1024*1024]; 57 int len=0; 58 while((len=sis.read(buf))!=-1){ 59 fos.write(buf,0,len); 60 } 61 sis.close(); 62 fos.close(); 63 } 64 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。