一,io的常用类:
1,File类
2,OutputStream 字节输出流
3,InputStream 字节输入流
4,Writer 字符输出流
5,Reader 字符输入流
package io; import java.io.*; /* 字节流 在JAVA中所有的输入流的父类为: java.io.InputStream,此类是一个抽象类 一、java.io.FileInputSteram 此类为文件输入流。 read方法的作用 从流(数据来源)中一次返回一个数据字节。如果文件中没有数据字节则会返回-1 available方法作用 返回当前流有多少个字节可以读。 skip(long) 跳过指定的指节数。 二、java.io.FileOutputStream 在JAVA中所有的输出流的父类为: java.io.OutputStream,此类是一个抽象类 三、BufferedInputStream BufferedOutputStream 字节缓冲输入输出流,通过read(byte[]) 与write(byte[])实现,主要用于 在读取数据字节的时候记录字节数。 注: 以上的流都属于字节流,字节流特点是一次读取一个字节,可以用它来读取任何文件内容。 字符流 由于字节流一次读取一个字节,因此在读取一些文本内容的时候,效率会比较低, 因此JDK提供了字符流来读取字符类文件(一次读取二个字节)。 注:字符流也是由字节流来实现,字符流只能读取字符类文件。 一、java.io.Reader(抽象类) 所有字符输入流的父类 二、java.io.Writer(抽象类) 所有字符输出流的父类。 三、java.io.FileReader 文件输入字符流 四、java.io.FileWrite 文件字符输出流 如果出现字符编码不一至造成的乱码可以使用 InputStreamReader与 OutputStreamWrite */ /** * io字节流和字符流的传递方式 * @author dyb * */ public class IoDemoTree { public static void main(String[] args) { } /*java本身没有IO的读写功能,它是借助平台(window)自身的读写功能来实现,每调用 一次read方法与write方法都需要与平台建立一次连接(耗费一定的时间),因此正确的 操作应该是在建立一次连接后读取尽量多的字节数。 read(byte[]) 与write(byte[]) 适合不记录读取字节数的情况下一次性读完所有文件内容。 */ /** * 一次性读完整个文件,使用下列方法。 * @throws IOException */ public void rw() throws IOException { FileInputStream in = new FileInputStream("src/start.mp3"); FileOutputStream out = new FileOutputStream("src/start_2.mp3"); long s=System.currentTimeMillis();//获取文件传输开始的的时间 byte[] by=new byte[8194]; int len = 0; while((len=in.read(by))!=-1){ out.write(by,0,len); } in.close();out.close(); long e=System.currentTimeMillis(); System.out.println(e-s); } /** * 需要读取记录字节数使得下列方法。 * @param aa * @throws IOException */ public void rw(int aa) throws IOException { FileInputStream in = new FileInputStream("src/start.mp3"); FileOutputStream out = new FileOutputStream("src/start_2.mp3"); BufferedInputStream bin=new BufferedInputStream(in); BufferedOutputStream bout=new BufferedOutputStream(out); long s=System.currentTimeMillis(); int a = 0; while((a=bin.read())!=-1){ bout.write(a); } bin.close();bout.close(); long e=System.currentTimeMillis(); System.out.println(e-s); } /** * 需要读取字符类文件并且可以修改字符编码,使用下面方法 * @param aa * @throws IOException */ public void rw(byte aa) throws IOException{ InputStreamReader iObj=new InputStreamReader (new FileInputStream("src/action/说明.txt"),"GBK"); OutputStreamWriter oObj=new OutputStreamWriter (new FileOutputStream("src/action/说明2.txt"),"UTF-8"); char[] by=new char[8888]; int len=iObj.read(by); while(len!=-1){ oObj.write(by,0,len); len=iObj.read(by); } iObj.close(); oObj.close(); } }
例二:
复制文件夹下所有的文件
package io; import java.io.*; /** * 使用File复制文件和目录 * @author dyb * */ public class IoDemoTwo { public static void main(String[] args) throws IOException { /*st.copy("E:\\360SoftMgrGame","E:\\360downloads/aaa");*/ IoDemoTwo obj=new IoDemoTwo(); File src=new File("E:/360SoftMgrGame"); File target=new File("E:/360downloads"); if(!target.exists()) target.mkdirs(); obj.copy(src, target); } /* * 递归复制下一级目录 */ public void copy(File src,File target){ File[] fs=src.listFiles(); for(int i=0;i<fs.length;i++){ String name=fs[i].getName(); File newF=new File(target,name); if(fs[i].isDirectory()){ newF.mkdirs(); copy(fs[i],newF); }else{ rw(fs[i], newF); } } } /** * 复制文件 */ public void rw(File src,File target){ try { FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(target); byte[] by = new byte[8194]; int len = 0; while ((len = in.read(by)) != -1) { out.write(by, 0, len); } in.close(); out.close(); }catch (IOException e){ e.printStackTrace();; } } }