您的位置:首页 > 职场人生

黑马程序员——IO流2

2013-07-06 15:55 211 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

一、File类:用来将文件文件夹封装成对象,方便对文件文件夹属性信息进行操作,

1,构造方法:

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 实例。

2,字段:

static String pathSeparator      与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 在 UNIX 系统上,此字段为
':'
;在 Microsoft Windows 系统上,它为
';'


static char pathSeparatorChar        与系统有关的路径分隔符。

static String separator       与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 在 UNIX 系统上,此字段的值为
'/'
;在 Microsoft Windows 系统上,它为
'\\'


static char separatorChar       与系统有关的默认名称分隔符。

3,主要方法:

1),获取。String getName()    返回此文件或目录的名称。 

                    String getPath()    返回相对路径名字符串。

                    String getAbsolutePath()   返回绝对路径名字符串。

                    long length()   返回此文件的长度。 

                    long lastModified()    返回此文件最后一次被修改的时间的毫秒值。

                    public String[] list():获取指定目录下的所有文件和文件夹的名称数组

                    public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组

public String[] list():获取指定目录下的所有文件和文件夹的名称数组

public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组public String[] list():获取指定目录下的所有文件和文件夹的名称数组

public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组public String[] list():获取指定目录下的所有文件和文件夹的名称数组

public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组public String[] list():获取指定目录下的所有文件和文件夹的名称数组

public File[] listFiles():获取指定目录下的所有文件和文件夹的File数组

2),创建。boolean createNewFile()    当且仅当不存在指定名称的文件时,不可分地创建一个新的空文件,返回true。若文件存在返回 false

                    boolean mkdir()    创建此抽象路径名指定的目录。 若目录不存在,创建目录返回true,若目录存在,不创建返回false

                    boolean mkdirs()   创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

2),删除。boolean delete()    删除文件或目录。只能删除单级空目录,若目录里有东西,此方法无法删除。

4),判断。boolean isDirectory()  判断此抽象路径名表示的文件是否是一个目录。

                    boolean isFile()   判断此抽象路径名表示的文件是否是一个标准文件。

                    boolean exists()    判断文件或目录是否存在。

示例:删除一个带内容的目录。

package itcast;

import java.io.File;
/*
* 删除一个带内容的目录。
* 原理:必须从最里面往外删。
* 需要进行深度遍历。
*/
public class RemoveDir{
public static void main(String[] args) {
File dir  = new File("e:\\demodir");
removeDir(dir);
}
public static void removeDir(File dir) {
File[] files = dir.listFiles();
for(File file : files){
//如果是目录,递归调用删除方法
if(file.isDirectory()){
removeDir(file);
}
//如果是文件,删除文件
else{
System.out.println(file+":"+file.delete());
}
}
//删除目录
System.out.println(dir+":"+dir.delete());
}
}

二、Properties类:HashTable的子类,Properties 类表示了一个持久的属性集。
Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。通常该集合用于操作以键值对形式存在的配置文件。

主要方法:Set<String>  stringPropertyNames()    返回此属性列表中的键集

void list(PrintStream out)   将属性列表输出到指定的输出流

void store(OutputStream out, String comments)   将此 Properties 表中的属性列表(键和元素对)写入输出流

void load(InputStream inStream)   从输入流中读取属性列表(键和元素对)

三、打印流:PrintStream与PrintWriter

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

PrintWriter与PrintStream功能相似,在需要写入字符而不是写入字节的情况下,应该使用
PrintWriter
类。

四、序列流:SequenceInputStream,表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。将多个流有序的合并成一个流,即将多个源有序的合并成一个源。

合并文件示例:

package itcast;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/*
* 需求:将1.txt;2.txt;3.txt合并到一个文件中
*/
public class FileMerge {
public static void main(String[] args) throws IOException {
Vector<InputStream> v = new Vector<InputStream>();
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));

Enumeration<InputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en );
FileOutputStream fos = new FileOutputStream("4.txt");
byte[] b = new byte[1024];
int len = 0;
while ((len=sis.read(b))!=-1){
fos.write(b, 0, len);
}
sis.close();
fos.close();
}
}

思考:Vector效率比较低能不能用ArrayList代替,但是ArrayList中没有elements()方法来获取Enumeration。那么有没有办法来替代Enumeration呢?

可以用集合的迭代器替代Enumeration,因为迭代与Enumeration功能重叠。Enumeration Collections.enumeration(Collection c)封装了这个操作。

package itcast;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

/*
* 需求:将1.txt;2.txt;3.txt合并到一个文件中
*/
public class FileMerge {
public static void main(String[] args) throws IOException {
ArrayList<InputStream> al = new ArrayList<InputStream>();
al.add(new FileInputStream("1.txt"));
al.add(new FileInputStream("2.txt"));
al.add(new FileInputStream("3.txt"));

Enumeration<InputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en );
FileOutputStream fos = new FileOutputStream("5.txt");
byte[] b = new byte[1024];
int len = 0;
while ((len=sis.read(b))!=-1){
fos.write(b, 0, len);
}
sis.close();
fos.close();
}
}

带获取配置文件的文件切割与合并的示例:

package itcast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

public class SplitMergeFile {
private static final int SIZE = 1024*1024;

public static void main(String[] args) throws IOException {
File sourfile = new File("D:\\1.mp3");
File destdir = new File("D:\\partfiles");
split(sourfile);
merge(destdir);
}

private static void split(File file) throws IOException {
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[SIZE];
FileOutputStream fos = null;
int len = 0;
int count = 1;
File dir = new File("D:\\partfiles");
while ((len=fis.read(b))!=-1){
if(!dir.exists()) dir.mkdir();
fos = new FileOutputStream(new File(dir,(count++)+".part"));
fos.write(b, 0, len);
fos.close();
}
//将被切割文件信息保存到集合中
prop.setProperty("partcount", count+"");
prop.setProperty("filename", file.getName());

fos = new FileOutputStream(new File(dir,count+".properties"));
//将集合中的数据存储到文件中
prop.store(fos,"save file info");
fis.close();
fos.close();
}

private static void merge(File destdir) throws IOException {
// 获取指定目录下的配置文件对象
File[] files = destdir.listFiles(new SuffixFilter(".properties"));
if(files.length!=1) throw new RuntimeException("配置文件不存在");
//获取配置文件的配置信息
Properties prop = new Properties();
FileInputStream fis =new FileInputStream(files[0]);
prop.load(fis);
String filename = prop.getProperty("filename");
int count =Integer.parseInt(prop.getProperty("partcount"));
//将碎片文件与流关联并封装在集合中
ArrayList<InputStream> al = new ArrayList<InputStream>();
for (int i = 1;i<count;i++)
al.add(new FileInputStream(new File(destdir,(i)+".part")));
//将多个流合并成一个序列流
Enumeration<InputStream>  en= Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
//读取序列流,并写进输出流中
FileOutputStream out = new FileOutputStream(new File(destdir,filename));
byte[] b = new byte[1024];
int len = 0;
while((len=sis.read(b))!=-1){
out.write(b, 0, len);
}
sis.close();
out.close();

}
}

class SuffixFilter implements FilenameFilter {
private String suffix;

public SuffixFilter(String suffix) {
super();
this.suffix = suffix;
}

public boolean accept(File dir, String name) {
return name.endsWith(suffix);

}

}

小结:这节主要是对File类以及其他功能的IO流的介绍,这样对IO包里的类有了大致的了解,即了解了其层次情况,以及基本使用规律,对IO流有了较为系统的理解

 

 

----------------------   ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io流 黑马程序员