论坛首页 Java企业应用论坛

JavaIO复习和目录文件的复制

浏览 8244 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-23   最后修改:2010-02-23

最近用到一些java.io包中的一些类接口,所以写了一些东西来复习。

Input和Output是同一类,而Reader和Writer另属同一类

 

Reader支持16位的Unicode字符的输出,而InputStream只支持8位字符输出。他们的大概结构如下:

 

InputStream的子类有:

               FileInputStream,FilterInputStream,ObjectInputStream,StringBufferInputStream等

OutputStream的子类有:

               ByteArrayOutputStream,FileOutputStream,FilterOutputStream,PipedOutputStream,ObjectOutputStream。

 

Reader的子类有:BufferdReader,InputStreamReader,FilterReader,StringReader,PipedReader,CharArrayReader。

Writer的子类有: BufferedWriter,CharArrayWriter,FilterWriter,OutputStreamWriter,PipedWriter,PrintWriter,StringWriter。

 

曾遇到一个面试题:

请选择下面的这却答案:

 

a. System.out 是一个PrintStream。

b. System.out 是一个OutputStream。

c. System.out 是一个FilterOutputStream。

d. System.out 不是一个PrintStream。

e. System.out 在异常时,将抛出IOExcepton。

 

由于System.out 是一个PrintStream的一个子类,并且PrintStream对象并没有抛出IOException异常。

所以可以看出答案:a b c

例一:InputStream读取文件的应用:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * 
 * @author liugao ec06 cumt
 *
 */
public class TestJavaIo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int b=0;
		long num=0;
		InputStream in=null;
		try {
			in=new FileInputStream("D:/a.txt");
		} catch (FileNotFoundException e) {
			System.out.println("文件找不到");
			System.exit(-1);
		}
		try{
			while((b=in.read()) !=-1){              //b读取是字符的AI码
				System.out.println((char)b);
				num++;
			}
			in.close();
			System.out.println();
			System.out.println("共读取了" + num + "个字节");
			
			}catch(IOException e){
				System.out.println("文件读取错误");
				System.exit(-1);
			}
		}
	}


 

例二:FileReader的应用:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 
 * @author ec06cumt
 *
 */
public class TestFileReader {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		FileReader fr=null;
		int c=0;
		int ln=0;
		try {
			fr=new FileReader("D:/a.txt");
			while((c=fr.read())!=-1){
				System.out.println((char)c);
				ln++;
			} 
			fr.close();
			
			//主要这里的ln的值,当有中文字符时,一个中文字符还是算一个,
			//但InputStream时就一个中文就两个,由此可以看出Reader和Input的区别
			System.out.println("共有:"+ln+"个字符");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

例三:BufferedReader与BufferWriter的应用:

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * BufferReader和BufferWriter的应用示例
 * @author ec06cumt 
 *
 */
public class TestBufferedReader {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			//BuffererReader等就像在原来的字节流的基础上套一个更大的水管,
			//让出水量更大读取的速度更快。
			BufferedWriter bw=new BufferedWriter(new FileWriter("D:/aa.txt"));
			BufferedReader br=new BufferedReader(new FileReader("D://aa.txt"));
			String s=null;
			for(int i=0;i<=100;i++){
				s=String.valueOf(10+(long)(Math.random()*30));
				bw.write(s);
				bw.newLine(); //创建一个换行的标记
				
			}
			bw.flush();      //刷新缓冲区域。
			while((s=br.readLine())!=null){   //readLine 就是水管的一个应用吧
				System.out.println(s);
			}
			bw.close();
			br.close();
		} catch (IOException e) {
			System.out.println("写入错误");
		}
	}

}

 

 例四:DataStream的应用:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

/**
 * 
 * @author ec06cumt
 *
 */
public class TestDataStream {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		DataOutputStream dos=new DataOutputStream(bos);
		try {
//			dos.writeFloat((float) Math.random());
//			dos.writeLong((long) Math.random());
//			dos.writeDouble((double) Math.random());
//			dos.writeChar((char) Math.random());
			
			dos.writeShort((short) Math.random());
			dos.writeBoolean(true);
			//注意ByteArrayInputStream的构造方法是参数要是一个数组
			ByteArrayInputStream bais=new ByteArrayInputStream(bos.toByteArray());
			
			DataInputStream dis=new DataInputStream(bais);
			System.out.println(dis.available());
			//System.out.println(dis.readDouble());
//			System.out.println(dis.readInt());
//			System.out.println(dis.readFloat());
//			System.out.println(dis.readDouble());
//			System.out.println(dis.readChar());
			System.out.println(dis.readShort());
			
			System.out.println(dis.readBoolean());
			bos.close();
			bais.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 例五:ObjectStream的应用

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 对象的写入和读取
 * @author ec06cumt
 *
 */
public class TestObjectStream {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		T t=new T();
		t.k=10;
		
		try {
			FileOutputStream fos=new FileOutputStream("D:/testObjectIo.bak");
			ObjectOutputStream oos=new ObjectOutputStream(fos);
			oos.writeObject(t);
			oos.flush();
			oos.close();
			
			FileInputStream fis=new FileInputStream("D:/testObjectIo.bak");
			ObjectInputStream bis=new ObjectInputStream(fis);
			T tReader= (T) bis.readObject();
			System.out.println(tReader.i + " " +tReader.j + " "+tReader.d + " " + tReader.k);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e1){
			e1.printStackTrace();
		}catch(ClassNotFoundException e2){
			e2.printStackTrace();
		}
	}
	
}

class T implements Serializable{
	int i=2;
	int j=4;
	double d=2.5;
	transient int k=15;
//	 int k=15;
}

 

 

 

 例六:文件的目录复制

 

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class JavaIoCopyFile {

	/**
	 * Author:liugao ec06-2 cumt
	 * @param args
	 */
	public static void main(String[] args) {
		
		File sourceFile=new File("D:/test");
		File targetFile=new File("F:/jstl");
		copy(sourceFile,targetFile);
		
	}

	private static void copy(File sourceFile, File targetFile) {
		File tarpath=new File(targetFile,sourceFile.getName());
		if(sourceFile.isDirectory()){
			tarpath.mkdir();
			File[] dir=sourceFile.listFiles();
			for(int i=0;i<dir.length;i++){
				copy(dir[i],tarpath);
			}
		}else{
			try {
				InputStream is=new FileInputStream(sourceFile);
				OutputStream os=new FileOutputStream(tarpath);
				
				byte[] buf=new byte[1024];
				int len=0;
				while((len= is.read(buf))!=-1){
					os.write(buf);
				}
				System.out.println("复制完成");
				is.close();
				os.close();
				
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}catch(IOException e1){
				e1.printStackTrace();
			}
		}
	}
	
	

}

 

 

 

 常用的也就是这些方法吧。。。。

 

 

 

 

 

 

 

   发表时间:2010-02-25  
提个建议:文件操作 对于流的关闭 能不能放在 finally中进行呢
finally{
   if(null!=in){
      in.close();
   }
}
0 请登录后投票
   发表时间:2010-02-25  
不错  可以借楼主总结的自己也复习复习。
0 请登录后投票
   发表时间:2010-02-26  
恩,不错,很不错的复习材料,看了后收益颇多!
0 请登录后投票
   发表时间:2010-02-28  
fjlyxx 写道
提个建议:文件操作 对于流的关闭 能不能放在 finally中进行呢
finally{
   if(null!=in){
      in.close();
   }
}


谢谢 filyxx 的建议,这个做的很对,就该在finally 中关闭。是我的知识疏忽。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics