现在的位置: 首页 > 综合 > 正文

黑马程序员—-JAVA—-IO小结(3)

2013年05月29日 ⁄ 综合 ⁄ 共 3422字 ⁄ 字号 评论关闭

----------------------------------android培训java培训、期待与您交流!------------------------------

 

IO包中的其他对象:
	1,打印流:
		printStream:
			是一个字节打印流,System.out对应的类型就是PrintStream。
			他的构造函数可以接受三种数据类型的值。
			1,字符串路径。
			2,File对象
			3,OutputStream。
		PrintWriter:
			是一个字符打印流。构造函数可以接受四种类型的值。
			1,字符串路径。
			2,File对象。
			   	对于1,2类型的数据,还可以指定编码表,也就是字符集;
			3,OutputStream
			4,Writer
				对于3,4类型的数据,可以指定自动刷新。
				注意:该自动刷新值为true时,只有三个方法可以用:println printf,format

管道流:
	PipedInputStream
	PipedOutputStream
	特点:
		读取管道流和写入管道流可以进行连接。
		连接方式:
		1,通过两个流对象的构造函数。
		2,通过两个对象connect方法。
	通常两个流在使用时,需要加入多线程技术,也就是让读写同时运行。
	注意:对于read方法,该方法是阻塞式的,也就是没有数据的情况,该方法会等待。
RandomAccessFile:
	该对象并不是流体系中的一员。
	该对象中封装了字节流,同时还封装了一个缓冲区(字节数组),通过内部的指针来操作数组中的数据。
	
该对象的特点:
	1,该对象只能操作文件,所以构造函数接受两种类型的参数。
		1,字符串路径。
		2,File对象。
	2,该对象既可以对文件读取,也可以写入。
	   在进行对象实例化时,必须要指定该对象的操作模式、

SequenceInputSrream:
	特点:可以将多个读取流合并成一个流。
	原理:其实就是将每一读取流对象存储到一个集合中。最后一个流对象结尾作为这个流的结尾。

	两个构造函数:
	1,SequenceInputStream(InputStream in1,InputStream in2)
		可以将两个读取流合并成一个流。
	2,SequenceInputStream(Enumeration<? extends InputStream> en)
		可以将枚举中的多个流合并成一个流。

作用:可以用于多个数据的合并。

注意:因为Enumeration是Vector中特有的取出方式,而Vector被ArrayList取代。
	所以要使用ArrayList集合效率更高一些。
	ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
	for(int x=1;x<4;x++)
	{
		al.add(new FileInputStream(x+".txt");
		Iterator<FileInputStream> it = al.iterator();
		Enumeration<FileInputStream> en= new Enumeration<FileInputStream>()
		{
			public boolean hasMoreElements()
			{
				return it.hasNext();
public FileInputStream nextElement(){return it.next();}}}//多个流就变成了一个流,这就是数据源SwqueneceInputStream sis=new SequenceInputStream(en);//创建数据目的FileOutputStream fos=new FileOutputStream("4.txt");byte[] buf=new byte[1024*4];int len=0;while((len=sis.read(buf))!=-1){fos.write(buf,0,len);}fos.close();sis.close();对象的序列化。ObjectInputStreamObjectOutputStrem可以通过这两个流对象直接操作已有对象并将对象进行本地持久化存储。存储后的对象可以进行网络传输。两个对象的特有方法:ObjectInputStreamObject readObject():该方法抛出异常:ClassNotFoundException。ObjectOutputStreamvoid writeObject(Object):被写入的对象必须实现一个接口:Serializable否则会抛出:NotSerializableExceptionSerializable:该接口其实就是一个没有方法的标记接口。用于给类指定一个UID,该UID是通过类中的可序列化成员的数据签名运算出来的一个long类型的值。只要是这些成员没有变化,那么该值每次元素都一样。该值用于判断被序列化的对象和类文件是否兼容。如果被序列化的对象需要被不同的类版本所兼容。可以在类中自定义UID定义方式:static final long serialVersionUID=42L;注意: 对应静态的成员变量,不会被序列化。对应非静态也不想被序列化的成员而言,可以通过transient关键字修饰。通常这两个对象成对使用。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

/*
 * 把一个目录下的所有.java结尾的文件路径存储到一个文件中,方便查找
 * 
 * 思路:
 * 		1:明确目录。封装目录 d:\itcast\20130108
 * 		2:获取这个目录下所有的.java文件。
 * 			递归
 * 			A:读取到一个满足条件的文件,就把其路径写入到一个文本文件中。以后追加写入。	
 * 			B:把满足条件的所有java文件用一个集合存储。将来遍历集合,获取每个文件的全路径写入到文本文件。
 * 		3:把刚获取到的所有java文件的全路径写入到一个文本文件。
 * 			BufferedWriter
 */
public class FilePathCopy {
	public static void main(String[] args) throws IOException {
		// 封装目录
		File file = new File("d:\\itcast\\20130108");
		ArrayList<File> array = new ArrayList<File>();
		getAllFile(file, array);
		// System.out.println(array);
		// 遍历集合,把集合中的文件路径写入到一个文本文件
		File file2 = new File("javalist.txt");
		filePathToFile(array, file2);
	}

	// 把集合中的文件的路径写入文件
	private static void filePathToFile(ArrayList<File> array, File file2)
			throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter(file2));
		for(File file : array){
			bw.write(file.getAbsolutePath());
			bw.newLine();
			bw.flush();
		}
		
		bw.close();
	}

	// 获取所有满足条件的文件集合
	private static void getAllFile(File file, ArrayList<File> array) {
		// 集合定义在这里是有问题的,每次递归都会创建新集合
		// ArrayList<File> array = new ArrayList<File>();
		File[] fileArray = file.listFiles();
		for (File f : fileArray) {
			if (f.isDirectory()) {
				getAllFile(f, array);
			} else {
				if (f.getName().endsWith(".java")) {
					array.add(f);
				}
			}
		}
	}
}
 

----------------------------------android培训java培训、期待与您交流!------------------------------

抱歉!评论已关闭.