JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流
一、File
1.1、File概述
文件和目录路径名的抽象表示形式。
用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。抽象路径名 有两个组件:
- 一个可选的与系统有关的前缀 字符串,比如盘符,
"/"
表示 UNIX 中的根目录,"\\\\"
表示 Microsoft Windows UNC 路径名。 - 零个或更多字符串名称 的序列。
字段摘要 | |
---|---|
static String |
pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
static char |
pathSeparatorChar
与系统有关的路径分隔符。 |
static String |
separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 |
static char |
separatorChar
与系统有关的默认名称分隔符。 |
构造方法摘要 | |
---|---|
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
|
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
|
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
|
File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 |
方法摘要 | |
---|---|
boolean |
canExecute()
测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean |
canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean |
canWrite()
测试应用程序是否可以修改此抽象路径名表示的文件。 |
int |
compareTo(File pathname)
按字母顺序比较两个抽象路径名。 |
boolean |
createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
static File |
createTempFile(String prefix, String suffix)
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
static File |
createTempFile(String prefix, String suffix, File directory)
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
boolean |
delete()
删除此抽象路径名表示的文件或目录。 |
void |
deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
boolean |
equals(Object obj)
测试此抽象路径名与给定对象是否相等。 |
boolean |
exists()
测试此抽象路径名表示的文件或目录是否存在。 |
File |
getAbsoluteFile()
返回此抽象路径名的绝对路径名形式。 |
String |
getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。 |
File |
getCanonicalFile()
返回此抽象路径名的规范形式。 |
String |
getCanonicalPath()
返回此抽象路径名的规范路径名字符串。 |
long |
getFreeSpace()
返回此抽象路径名指定的分区中未分配的字节数。 |
String |
getName()
返回由此抽象路径名表示的文件或目录的名称。 |
String |
getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null 。 |
File |
getParentFile()
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null 。 |
String |
getPath()
将此抽象路径名转换为一个路径名字符串。 |
long |
getTotalSpace()
返回此抽象路径名指定的分区大小。 |
long |
getUsableSpace()
返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 |
int |
hashCode()
计算此抽象路径名的哈希码。 |
boolean |
isAbsolute()
测试此抽象路径名是否为绝对路径名。 |
boolean |
isDirectory()
测试此抽象路径名表示的文件是否是一个目录。 |
boolean |
isFile()
测试此抽象路径名表示的文件是否是一个标准文件。 |
boolean |
isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。 |
long |
lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。 |
long |
length()
返回由此抽象路径名表示的文件的长度。 |
String[] |
list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
String[] |
list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] |
listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
File[] |
listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] |
listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
static File[] |
listRoots()
列出可用的文件系统根。 |
boolean |
mkdir()
创建此抽象路径名指定的目录。 |
boolean |
mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
boolean |
renameTo(File dest)
重新命名此抽象路径名表示的文件。 |
boolean |
setExecutable(boolean executable)
设置此抽象路径名所有者执行权限的一个便捷方法。 |
boolean |
setExecutable(boolean executable,
boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的执行权限。 |
boolean |
setLastModified(long time)
设置此抽象路径名指定的文件或目录的最后一次修改时间。 |
boolean |
setReadable(boolean readable)
设置此抽象路径名所有者读权限的一个便捷方法。 |
boolean |
setReadable(boolean readable,
boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的读权限。 |
boolean |
setReadOnly()
标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 |
boolean |
setWritable(boolean writable)
设置此抽象路径名所有者写权限的一个便捷方法。 |
boolean |
setWritable(boolean writable,
boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的写权限。 |
String |
toString()
返回此抽象路径名的路径名字符串。 |
URI |
toURI()
构造一个表示此抽象路径名的 file: URI。 |
URL |
toURL()
已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过 toURI 方法将其转换为
URI,然后通过 URI.toURL
方法将 URI 装换为 URL。 |
1.2、File创建与删除
import java.io.*; class FileDemo1 { public static void main(String[] args) { method1(); } public static void method1() { //创建File对象 File f1=new File("a.txt"); //第二种 File f2=new File("d:\\abc","b.txt"); //第三种 File dir=new File("d:\\bcd"); File f3=new File(dir,"c.txt"); //使用分隔符 File f4=new File("d:"+File.separator+"abc"+File.separator+"d.txt"); //输出 System.out.println("f1="+f1);//a.txt System.out.println("f2="+f2);//d:\abc\b.txt System.out.println("f3="+f3);//d:\bcd\c.txt System.out.println("f4="+f4);//d:\abc\d.txt } }
创建文件
//创建文件,在指定位置创建文件,如果该文件已经存在,则不创建,返回 false public static void method1() throws IOException { File f=new File("d:\\file.txt"); //创建 sop("create: "+f.createNewFile()); //删除,删除失败返回false //sop("delete:"+f.delete()); //在退出时删除指定文件 f.deleteOnExit(); }
1.3、File判断 File获取
package com.pb.day20.io.file; import java.io.File; import java.io.IOException; public class FileDemo2 { public static void main(String[] args) throws IOException { File f1=new File("d:\\a.txt"); File f2=new File("e:\\c.txt"); File dir1=new File("d:\\dbc"); File dir2=new File("d:\\dbc\\dd\\aa\\d\\f\\dsf\\fsd"); //判断文件是否存在,不存在就创建 if(!f1.exists()){ f1.createNewFile(); } //判断文件夹是否存在 if(!dir1.exists()){ dir1.mkdir();//创建一层文件夹 } //创建多层文件夹 if(!dir2.exists()){ dir2.mkdirs(); } //判断 sop("f1是文件吗?"+f1.isFile()); sop("dir1是文件夹吗?"+dir1.isDirectory()); sop("f1是可执行文件吗?"+f1.canExecute()); sop("f1可读吗?"+f1.canRead()); sop("f1可写吗?"+f1.canWrite()); sop("f1是隐藏文件吗?"+f1.isHidden()); //获取文件信息 sop(f1.getName());//文件名 sop(f1.getPath());//相对路径 sop(f1.getAbsolutePath());//获取绝对路径,返回值是字符串 sop(f1.getAbsoluteFile());//获取绝对路径,返回值是File类对象 sop(f1.lastModified());//最后修改时间 长整型 sop(f1.length());//文件字节大小,长整型 //重命名 sop(f1.renameTo(f2));//剪切的作用 } public static void sop(Object obj){ System.out.println(obj); } }
1.4、File文件列表
package com.pb.day20.io.file; import java.io.File; import java.io.FilenameFilter; public class FileDemo3 { public static void main(String[] args) { method3(); } //列出当前目录下的指定文件 public static void method3(){ File f=new File("d:\\"); File [] files=f.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { //返回txt文件 return name.endsWith(".txt"); } }); for(File ff:files){ System.out.println(ff.getName()+"..."+ff.length()); } } //列表当前目录下的所有文件包含文件夹名字 public static void method2(){ File f=new File("c:\\"); String [] names=f.list();//必须是目录,否则就是空指针异常 for(String s:names){ System.out.println(s); } } //列出当前系统的所有盘符 public static void method1(){ File [] files=File.listRoots(); for(File f:files){ System.out.println(f); } } }
1.6、File列出所有递归
package com.pb.day20.io.file; /** * 递归调用, * 列表指定目录下的,所有文件包括子目录中的文件 */ import java.io.File; public class FileDemo4 { public static void main(String[] args) { File dir=new File("d:\\"); getFiles(dir); } //递归 public static void getFiles(File dir){ System.out.println(dir); //获取文件数组,列表 File[] files=dir.listFiles(); //遍历 for(File file:files){ //判断是不是文件夹 if(file.isDirectory()){ //是文件夹就再次调用 getFiles(file); }else{ //不是就列表 System.out.println(file); } } } }
递归:
限定条件
注意递归的次数,尽量避免内存溢出
1.7、File删除带文件的目录
package com.pb.day20.io.file; import java.io.File; public class FileDemo5 { public static void main(String[] args) { File dir=new File("d:\\kk"); removeDir(dir); } //删除,带有文件的多层文件夹 public static void removeDir(File dir){ File [] files =dir.listFiles(); for(int x=0;x<files.length;x++){ if(files[x].isDirectory()){ removeDir(files[x]); }else{ //删除文件 System.out.println(files[x]+"----file----"+files[x].delete()); } } //删除空文件夹 System.out.println(dir+"----dir----"+dir.delete()); } }
1.8、将一个文件夹的的所有文件,包含子目录都复制要另一个目录下
/* 将一个文件夹的的所有文件,包含子目录都复制要另一个目录下 */ import java.io.*; class IOCopy { public static void main(String[] args) { //源文件 File src=new File("D:\\music"); //目的文件 File des=new File("e:\\test"); copyDir(src,des); System.out.println("复制完成!"); } /* 递归复制 */ public static void copyDir(File src,File des) { //获取列表 File[] files=src.listFiles(); //判断目标文件是否存在 if(!des.exists()){ //创建目录 des.mkdir(); } //遍历 for(File f:files) { //判断是不是目录 if(f.isDirectory()) { //获取路径,拼接文件名,再次调用自己 copyDir(new File(f.getPath()),new File(des+"\\"+f.getName())); //是不是文件 }else if (f.isFile()) { //复制 copyFile(new File(f.getPath()),new File(des+"\\"+f.getName())); } } } //使用IO流复制文件 public static void copyFile(File src,File des) { BufferedInputStream bis=null; BufferedOutputStream bos=null; try { bis=new BufferedInputStream(new FileInputStream(src)); bos=new BufferedOutputStream(new FileOutputStream(des)); //声明缓冲区 int len=0; while((len=bis.read())!=-1) { bos.write(len); } } catch (IOException e) { e.printStackTrace(); }finally { try { if(bos!=null) bos.close(); } catch (IOException e) { e.printStackTrace(); } try { if(bis!=null) bis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
二、Properties
2.1、Properties概述
构造方法摘要 | |
---|---|
Properties() 创建一个无默认值的空属性列表。 |
|
Properties(Properties defaults)
创建一个带有指定默认值的空属性列表。 |
方法摘要 | |
---|---|
String |
getProperty(String key)
用指定的键在此属性列表中搜索属性。 |
String |
getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。 |
void |
list(PrintStream out)
将属性列表输出到指定的输出流。 |
void |
list(PrintWriter out)
将属性列表输出到指定的输出流。 |
void |
load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。 |
void |
load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 |
void |
loadFromXML(InputStream in)
将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。 |
Enumeration<?> |
propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。 |
void |
save(OutputStream out,
String comments)
已过时。 如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。保存属性列表的首选方法是通过 store(OutputStream out, String comments)
方法或 storeToXML(OutputStream os, String comment)
方法来进行。 |
Object |
setProperty(String key, String value) 调用 Hashtable 的方法 put 。 |
void |
store(OutputStream out,
String comments)
以适合使用 load(InputStream)
方法加载到 Properties 表中的格式,将此 Properties
表中的属性列表(键和元素对)写入输出流。 |
void |
store(Writer writer, String comments)
以适合使用 load(Reader)
方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。 |
void |
storeToXML(OutputStream os,
String comment)
发出一个表示此表中包含的所有属性的 XML 文档。 |
void |
storeToXML(OutputStream os,
String comment,
String encoding)
使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。 |
Set<String> |
stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。 |
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
2.2、存取功能
public static void setAndGet(){ //声明 Properties prop=new Properties(); //设置 prop.setProperty("username", "root"); prop.setProperty("password","root"); //获取用户名对应的值 System.out.println(prop.getProperty("username")); //修改密码 prop.setProperty("password","root123"); //获取全部key Set<String> keys=prop.stringPropertyNames(); //遍历 for(String s:keys){ System.out.println(s+": "+prop.getProperty(s)); } }
2.3、存取配置文件
public static void method2() throws IOException { // 声明Properties集合 Properties prop = new Properties(); FileInputStream fis = new FileInputStream("D:/info.txt"); FileOutputStream fos = new FileOutputStream("D:\\info.txt"); //加载数组到集合 prop.load(fis); System.out.println(prop); prop.list(System.out); //修改 prop.setProperty("sex", "woman"); prop.store(fos, "sex is woman"); System.out.println(prop); fos.close(); fis.close(); } public static void method1() throws IOException { // 文件流 BufferedReader br = new BufferedReader(new FileReader("D:\\info.txt")); // 声明Properties集合 Properties prop = new Properties(); String line = null; // 遍历 while ((line = br.readLine()) != null) { // System.out.println(line); String[] arr = line.split("="); // System.out.println(arr[0]+"..."+arr[1]); prop.setProperty(arr[0], arr[1]); } System.out.println(prop); br.close(); }
示例
public static void method() throws IOException{ File file=new File("a.txt"); //判断文件是否存在 if(!file.exists()){ file.createNewFile(); } FileInputStream fis=new FileInputStream(file); //声明集合 Properties prop=new Properties(); prop.load(fis); int count=0; String value=prop.getProperty("times"); if(value!=null){ count=Integer.parseInt(value); //判断次数 if(count>=5){ System.out.println("使用次数已经用完,请续费!"); return; } } //次数+1 count++; //把KEY和VALUE放回去 prop.setProperty("times", count+""); FileOutputStream fos=new FileOutputStream(file); prop.store(fos, "次数+1"); fos.close(); fis.close(); }
三、PrintWriter与序列流
3.1、PrintWriter与PrintStream
package com.pb.io.properties.demo1; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * 从键盘接收数据,并输出在控制台 * 使用PrintWriter * */ public class PrintWriterDemo { public static void main(String[] args) throws IOException { //从键盘接收数据,并输出在控制台 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //使用打印流输出,并自动刷新 PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)),true); String line=null; System.out.println("请输入内容,以over结束!"); while((line=br.readLine())!=null){ if("over".equals(line)){ break; } pw.println(line); } pw.close(); br.close(); } }
3.2、序列流--SequenceInputStream
SequenceInputStream
表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
构造方法摘要 | |
---|---|
SequenceInputStream(Enumeration<? extends InputStream> e) 通过记住参数来初始化新创建的 SequenceInputStream ,该参数必须是生成运行时类型为
InputStream 对象的 Enumeration 型参数。 |
|
SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream (将按顺序读取这两个参数,先读取
s1 ,然后读取 s2 ),以提供从此 SequenceInputStream
读取的字节。 |
方法摘要 | |
---|---|
int |
available()
返回不受阻塞地从当前底层输入流读取(或跳过)的字节数的估计值,方法是通过下一次调用当前底层输入流的方法。 |
void |
close()
关闭此输入流并释放与此流关联的所有系统资源。 |
int |
read()
从此输入流中读取下一个数据字节。 |
int |
read(byte[] b,
int off, int len) 将最多 len 个数据字节从此输入流读入 byte
数组。 |
四、合并流
4.1、合并流
package com.pb.io.properties.demo1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; public class SequenceDemo { public static void main(String[] args) throws IOException { Vector<FileInputStream> v=new Vector<FileInputStream>(); v.add(new FileInputStream("d:\\1.txt")); v.add(new FileInputStream("d:\\2.txt")); v.add(new FileInputStream("d:\\3.txt")); //转换为枚举 Enumeration<FileInputStream> en=v.elements(); //合并流 SequenceInputStream sis=new SequenceInputStream(en); //目标文件 FileOutputStream fos=new FileOutputStream("d:\\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(); } }
五、分割流
5.1、分割流
package com.pb.io.properties.demo1; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; /** * 将文件切割 * 再合并 * */ public class SplitDemo { public static void main(String[] args) throws IOException { //split(); merge(); } //合并 public static void merge() throws IOException{ File src=new File("D:\\split"); File [] files=src.listFiles(); ArrayList<FileInputStream> list=new ArrayList<FileInputStream>(); for(File f:files){ list.add(new FileInputStream(f)); } Iterator<FileInputStream> it=list.iterator(); //创建枚举 Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() { @Override public FileInputStream nextElement() { return it.next(); } @Override public boolean hasMoreElements() { return it.hasNext(); } }; //创建合并流 SequenceInputStream sis=new SequenceInputStream(en); FileOutputStream fos=new FileOutputStream("D:\\split\\t.mp3"); 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 split() throws IOException{ //源文件 File file=new File("D:\\gm.mp3"); FileInputStream fis=new FileInputStream(file); //目标 FileOutputStream fos=null; //缓冲区 byte[] buf=new byte[1024*1024]; int len=0; int count=1; while((len=fis.read(buf))!=-1){ fos=new FileOutputStream("D:\\split\\"+(count++)+".part"); fos.write(buf,0,len); } fos.close(); fis.close(); } }