A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何小红 中级黑马   /  2012-9-13 07:16  /  2554 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

没有思路,请各位指点一二

3 个回复

倒序浏览
在计算机中不论复制什么文件
原理就是 把源文件中的数据先读到内存中,然后再从内存中把这些数据写到目标文件中。
至于代码,毕老师关于IO流里面的讲解的都有,也有代码示例。 学到了自然就知道了
回复 使用道具 举报
这是复制文件夹,通过键盘接收,它的原理是利用递归。
首先创建一个文件夹,然后遍历里面的每个文件对象,判断如果是文件,那么就用字节流或者字符流,拷贝文件,然后如果是文件夹,就利用递归。具体看下面的代码,如果不明白,我再详细的说明!
public class Exercise6 {

        public static void main(String[] args) throws IOException {
                File src = DirUtil.getDir();        // 从键盘接收一个文件夹路径
                File dest = DirUtil.getDir();        // 从键盘接收另一个文件夹路径
                copyDir(src, dest);                                // 将第一个文件夹中的内容拷贝到第二个文件夹中
        }

        /*
         * src:                F:\Itcast\WorkSpace\day21-8
         * dest:        F:\
         * newDir:        F:\day21-8
         *
         * 把day21-8整个文件夹复制到F:\下
         */
        private static void copyDir(File src, File dest) throws IOException {
                File newDir = new File(dest, src.getName());        // 在dest中创建一个和src同名的文件夹
                newDir.mkdir();
               
                File[] fileArr = src.listFiles();                                // 获取src中的所有子文件
                for (File subfile : fileArr) {                                        // 循环遍历子文件
                        if (subfile.isFile()) {                                                // 如果是文件, 直接拷贝
                                FileInputStream fis = new FileInputStream(subfile);
                                FileOutputStream fos = new FileOutputStream(new File(newDir, subfile.getName()));
                                byte[] buffer = new byte[1024];
                                int len;
                                while ((len = fis.read(buffer)) != -1)
                                        fos.write(buffer, 0, len);
                                fis.close();
                                fos.close();
                        } else {                                                                        // 如果是文件夹, 递归
                                copyDir(subfile, newDir);
                        }
                }
        }

}
public class DirUtil {
       
        public static File getDir() throws IOException {
                System.out.println("请输入一个文件夹路径:");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                while (true) {
                        File dir = new File(br.readLine());
                        if (!dir.exists())
                                System.out.println("路径不存在, 请重新输入:");
                        else if (!dir.isDirectory())
                                System.out.println("您输入的不是文件夹路径, 请重新输入:");
                        else
                                return dir;
                }
        }
       
}

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 鼓励一下。隐约记得代码不该这么复杂.

查看全部评分

回复 使用道具 举报
复制文件的原理其实很简单,就是java的读取流读入内存,然后由输出流输出到指定的路径位置。如果是文本文件,通常使用字符流来完成,其他文件因为不需要编码就直接使用字节流来完成,这里给段复制图片的代码,好好看看注释:
  1. public class TestCopy1 {
  2.         /*
  3.          * 将一个图片从一个地方复制到另一个地方 需求分析: 源:硬盘,输入流 InputStream Reader 目的:文件 输出流
  4.          * OutputStream Writer 明确:操作的不是纯文本 那就用InputStream 输出用OutputStream
  5.          * 具体使用的对象:通过设备来区分 源设备:硬盘 目标源:硬盘 是否提高效率:是
  6.          * 那么使用BufferedInputStream与BufferedOutputStream
  7.          */
  8.         public static void main(String[] args) throws IOException {
  9.                 BufferedInputStream bufin = new BufferedInputStream(//定义字节缓冲
  10.                                 new FileInputStream("d:\\222.jpg"));
  11.                 BufferedOutputStream bufout = new BufferedOutputStream(
  12.                                 new FileOutputStream("d:\\446.jpg"));//定义字节缓冲输出
  13.                 byte[] by = new byte[bufin.available()];//定义长度为对象字节长度的数组
  14.                 int len = 0;//计数,读入数组的字节长度
  15.                 if((len = bufin.read(by)) != -1) {//一次全读进数组,这里用if条件,因为一次就可以全读取完,不然就用while
  16.                         bufout.write(by,0,len);//这里一次性输出相应长度的数组内容,如果数组内容是1024的大小,那么就用while来多次取多次输出
  17.                         bufout.flush();//刷新保存
  18.                 }
  19.                 bufout.close();//关闭流
  20.                 bufin.close();
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马