黑马程序员技术交流社区

标题: 求助, windows路径名 & java路径名 [打印本页]

作者: 香草芭芙    时间: 2014-10-18 22:30
标题: 求助, windows路径名 & java路径名
本帖最后由 香草芭芙 于 2014-10-20 06:44 编辑

想写个类, 类里 有方法, 只需传入参数  源地址(String类型)  & 目标地址(String类型)
需求:
搜索 "C:\Users\Dell\Workspaces\MyEclipse 10" 所有".java" 文件, 扩展名改成 ".txt" 复制到 "D:\newText"

现在遇到问题, windows 路径直接拿来使用的话java提示 "Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )"  , 如果是用户 肯定也希望 复制地址 直接粘贴, 不可能让用户挨个修改 "\" "/" 吧. 百度了也没找到答案. :(
作者: 罗林军    时间: 2014-10-19 01:01
看了楼主的问题,觉得有两种方案楼主可以参考一下:
一:
方法中传入windows路径之后,通过字符串的split方法按照"\",进行切割,切割完之后可以得到一个字符串数组,然后通过循环遍历数组,在每一个数组元素后面通过concat加上“\\”这样的字符串后再按顺序连接起来就成了新的java里面可以用的地址啦。
二、
方法中传入windows路径之后,通过String类的replaceAll方法,将所有的"\"替换成"\\"即可。这种方法相较于第一种方法要更为简便。
作者: 香草芭芙    时间: 2014-10-19 06:19
罗林军 发表于 2014-10-19 01:01
看了楼主的问题,觉得有两种方案楼主可以参考一下:
一:
方法中传入windows路径之后,通过字符串的split方 ...

关键他不是字符串, 要是字符串就好办了,
String s = "C:\Users\Dell\Workspaces\MyEclipse 10";
编译阶段提示 : "Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )" 错误.
作者: 罗林军    时间: 2014-10-19 08:27
香草芭芙 发表于 2014-10-19 06:19
关键他不是字符串, 要是字符串就好办了,
String s = "C:\Users\Dell\Workspaces\MyEclipse 10";
编译阶 ...

楼主,你在表示路径的时候不就是用字符串形式表示的吗?s就是字符串类型的啊?你也没封装成File类型啊?
作者: zhappy    时间: 2014-10-19 08:38
java中路径用\或者/都行,就是注意转义字符就行
作者: 想飞的鱼    时间: 2014-10-19 20:10
可以用\\或/,如果接收的源和目的为File类型也可以啊,看楼主需要了
作者: 想飞的鱼    时间: 2014-10-19 20:45
sorry,刚才理解错你的意思了,如果用户复制windows的路径操作的话,可以进行路径的替换操作,下面代码是我的解决方案,希望可以帮到你
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.FilenameFilter;
  8. import java.io.IOException;

  9. /*
  10. * 需求:
  11. *     搜索 "C:\Users\Dell\Workspaces\MyEclipse 10" 所有".java" 文件, 扩展名改成 ".txt"
  12. *     复制到 "D:\newText"
  13. *     
  14. *  需解决问题: 如果是用户 肯定也希望 复制地址 直接粘贴, 不可能让用户挨个修改 "\" "/" 吧.
  15. */
  16. public class Test2 {
  17.         public static void main(String[] args) throws IOException {
  18.                 // 这里没有判断运行时是否传入了参数
  19.                 // 记得一定传入两个参数
  20.                 String srcPath = args[0];// "C:\Users\Dell\Workspaces\MyEclipse 10"
  21.                 String desPath = args[1];// "D:\newText"

  22.                 // 解决方案,替换Java识别的路径
  23.                 srcPath = srcPath.replaceAll("\\\\", "/");
  24.                 desPath = desPath.replaceAll("\\\\", "/");

  25.                 File srcDir = new File(srcPath);
  26.                 File desDir = new File(desPath);
  27.                 if (!desDir.exists()) {
  28.                         desDir.mkdirs();
  29.                 }

  30.                 copy(srcDir, desDir);
  31.         }

  32.         public static void copy(File srcDir, File desDir) throws IOException {
  33.                 // 获取源目录下所有.java文件
  34.                 File[] javaFiles = srcDir.listFiles(new FilenameFilter() {
  35.                         @Override
  36.                         public boolean accept(File dir, String name) {
  37.                                 return new File(dir, name).isFile() && name.endsWith(".java");
  38.                         }
  39.                 });

  40.                 // 遍历数组
  41.                 for (File javaFile : javaFiles) {
  42.                         String fileName = javaFile.getName();
  43.                         String newFileName = fileName.replace(".java", ".txt");

  44.                         File desFile = new File(desDir, newFileName);

  45.                         BufferedReader bufr = new BufferedReader(new FileReader(javaFile));
  46.                         BufferedWriter bufw = new BufferedWriter(new FileWriter(desFile));

  47.                         String line = null;
  48.                         while ((line = bufr.readLine()) != null) {
  49.                                 bufw.write(line);
  50.                                 bufw.newLine();
  51.                                 bufw.flush();
  52.                         }

  53.                         bufw.close();
  54.                         bufr.close();
  55.                 }

  56.                 System.out.println("复制并改名成功");
  57.         }
  58. }
复制代码

作者: 香草芭芙    时间: 2014-10-19 23:43
想飞的鱼 发表于 2014-10-19 20:45
sorry,刚才理解错你的意思了,如果用户复制windows的路径操作的话,可以进行路径的替换操作,下面代码是我 ...
  1. package com.itheima.test;

  2. import java.io.*;

  3. /*
  4. * 需求:
  5. *     搜索 "C:\Users\Dell\Workspaces\MyEclipse 10" 所有".java" 文件, 扩展名改成 ".txt"
  6. *     复制到 "D:\newText"
  7. *     
  8. *  需解决问题: 如果是用户 肯定也希望 复制地址 直接粘贴, 不可能让用户挨个修改 "\" "/" 吧.
  9. */
  10. public class Test12
  11. {
  12.         public static void main(String[] args) throws IOException
  13.         {
  14.                 String srcPath = args[0];//原来有传参数的方法啊!!!,学习!!!
  15.                 String desPath = args[1];
  16.                 srcPath = srcPath.replaceAll("\\\\", "/"); // 求解释...为什么是\\\\ 4个?
  17.                                                                          // 2个表示 \ 运行出错,
  18.                 desPath = desPath.replaceAll("\\\\", "/"); // 我觉得是("\\","/")
  19.                                                                          // 为什么是4个呢?2个是错的
  20.                 File srcDir = new File(srcPath);
  21.                 File desDir = new File(desPath);
  22.                 if (!desDir.exists())
  23.                 {
  24.                         desDir.mkdirs();
  25.                 }
  26.                 copy(srcDir, desDir);
  27.         }
  28.         public static void copy(File srcDir, File desDir) throws IOException
  29.         {
  30.                 // ----这个是我不会的--->. <---
  31.                 // -----指定目录下有文件夹,文件夹里也有.java文件,该怎么写呢?除了递归有别的方法吗?--
  32.                 File[] javaFiles = srcDir.listFiles(new FilenameFilter()
  33.                 {
  34.                         public boolean accept(File dir, String name)
  35.                         {
  36.                                 return new File(dir, name).isFile() && name.endsWith(".java");
  37.                         }
  38.                 });
  39.                 // -----------------接口匿名实现 好厉害 ,不懂File过滤器 T. T ---------------------
  40.                 for (File javaFile : javaFiles)
  41.                 {
  42.                         String fileName = javaFile.getName();// 我一般都是取AbsolutePath得,
  43.                                                                          // 你这个方法小巧实用,学习.
  44.                         String newFileName = fileName.replace(".java", ".txt");
  45.                         File desFile = new File(desDir, newFileName);
  46.                         BufferedReader bufr = new BufferedReader(new FileReader(javaFile));
  47.                         BufferedWriter bufw = new BufferedWriter(new FileWriter(desFile));
  48.                         String line = null;
  49.                         while ((line = bufr.readLine()) != null)
  50.                         {
  51.                                 bufw.write(line);
  52.                                 bufw.newLine();
  53.                                 bufw.flush();
  54.                         }
  55.                         bufw.close();
  56.                         bufr.close();
  57.                 }
  58.                 System.out.println("复制并改名成功");
  59.         }
  60. }
复制代码

谢谢, 代码整洁, 效率; :)
作者: 想飞的鱼    时间: 2014-10-20 01:25
本帖最后由 想飞的鱼 于 2014-10-20 01:31 编辑
香草芭芙 发表于 2014-10-19 23:43
谢谢, 代码整洁, 效率;
  1. <blockquote>package com.itheima;
复制代码

作者: 想飞的鱼    时间: 2014-10-20 01:31
香草芭芙 发表于 2014-10-19 23:43
谢谢, 代码整洁, 效率;
  1. package com.itheima;

  2. public class Test6 {
  3.         public static void main(String[] args) {

  4.                 // 直接在程序里这样写路径会报错
  5.                 // String str = "D:\testdir\java";
  6.                 // System.out.println(str);

  7.                 /*
  8.                  * 但是在程序运行时将路径作为参数传进来,却不会报错。 也就是说,jvm可能在底层有处理
  9.                  * 而且,将传进来的参数输出,是"D:\testdir\java"这种格式
  10.                  */

  11.                 // 这和在程序内自定义路径字符串,输出的格式是一样的:D:\testdir\java
  12.                 String str = "D:\\testdir\\java";
  13.                 System.out.println(str);// D:\testdir\java

  14.                 // 所以大胆猜测replaceAll替换的时候,用4个\才能满足条件
  15.                 // ps: 其实,jvm它自动处理了,我们不替换都可以,将replaceAll那两句注释后一样可以。只是算一种思路吧。

  16.                 // 另外,关于根目录下还有子目录,子目录下还有.java文件这种情况
  17.                 // 我的第一印象就是递归了,也没尝试过其他是否有可行思路,如果还有更好方法的话,一定要告诉我哦^_^
  18.         }
  19. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2