黑马程序员技术交流社区
标题:
复制文件的问题
[打印本页]
作者:
张雪磊
时间:
2012-7-27 13:37
标题:
复制文件的问题
本帖最后由 张雪磊 于 2012-7-27 20:17 编辑
package com.itheima;
import java.io.*;
/*
需求: 编写一个程序,将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,
并将原来文件的扩展名从.java 改为.jad
*/
public class Test9 {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
File dir=new File("d:\\java");
String[] arr = dir.list(new FilenameFilter(){
public boolean accept(File dir,String name){
return name.endsWith(".java");
}
});
//在这行写了个输出语句 System.out.println(arr.length);结果打印正确,我在那个目录下放了5个java文件,打印的就是5
for(int x=0;x<arr.length;x++){
BufferedReader bufr =
new BufferedReader(new FileReader("d:\\java\\"+arr[x]));
String[] arr1=arr[x].split(".");
//到了这行 System.out.println(arr.length); 打印的结果就是0了,不知道为什么?
BufferedWriter bufw=
new BufferedWriter(new FileWriter("d:\\jad\\"+arr1[0]+".jad"));
//这行报错说数组脚标越界
String line=null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.flush();
}
bufw.close();
bufr.close();
}
}
}
报错:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at com.itheima.Test9.main(Test9.java:30)
不知道什么错的,找半天找不到问题!
作者:
王志明
时间:
2012-7-27 13:46
本帖最后由 王志明 于 2012-7-27 13:49 编辑
我前几天刚写过这道题,我定义了两个工具类,一个复制文件,一个过滤文件,而且灵活性也很好,可以通过参数定制来达到不同的目的:
package com.itheima;
import com.itheima.util.IOUtils;
/**
* 将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
*
* @author mrng
*
*/
public class Test9 {
public static void main(String[] args) throws Exception {
/**
* copyFilesAndChangeExtension(String srcDir, String extension, String
* destDir, String newExtension, boolean searchSubDir)
* 这个方法提供了强大的文件复制功能,通过不同的参数组合,可以达到各种效果
*
* srcDir指定要复制的目录 extension指定要复制的文件的扩展类型,如果不指定(""或null),将会复制指定目录下的所有文件
* 还可以使用排除法(使用"!")过滤文件,比如,extension 的值为"!.java",那么除了".java"文件,其它的文件都将复制
* destDir指定目的地目录
* searchSubDir指定是否对指定目录的子孙目录下的文件也进行复制
*
*/
String srcDir = "src/com/itheima";
String destDir = "src/copyFiles";
//将xxx目录下的所有.java 文件复制到xxx目录下,并将原来文件的扩展名从.java 改为.jad
IOUtils.copyFilesAndChangeExtension(srcDir, ".java",
destDir, ".jad", false);
}
}
复制代码
工具类
package com.itheima.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* IO 工具类
*
* @author mrng
*
*/
public class IOUtils {
/**
* 将指定文件拷贝到目的地 这里采用的是基础流(FileinputStream,FileOutputStream)+byte数组(缓冲区)实现
* 当然也可以使用包装流(Buffered....)
*
* @param src
* 将要拷贝的文件
* @param dest
* 将文件要保存到的目标目录
*
*/
public static void copy(String src, String dest) {
copy(src, dest, null);
}
/**
* copy(String src, String dest)的重载形式,可以更改文件扩展名
*
* @param src
* @param dest
* @param newExtension
*/
public static void copy(String src, String dest, String newExtension) {
File srcFile = new File(src);
// 如果文件不存在或是一个目录,抛出异常
if (!srcFile.exists() || srcFile.isDirectory())
throw new RuntimeException("文件不存在");
File destDir = new File(dest);
// 如果目标目录不存在,则创建
if (!destDir.exists()) {
destDir.mkdirs();
} else {
// 如果是文件,抛出异常
if (destDir.isFile()) {
throw new RuntimeException("您指定的目的地是一个文件,请重新指定目录");
}
}
// 代表目标文件的完整路劲信息的对象
File destFile = null;
System.out.println();
// 判断要不要改变文件的扩展名
if (newExtension == null || newExtension.trim().equals("")) {
// 不改变文件扩展名
destFile = new File(dest + "/" + srcFile.getName());
} else {
// 改变文件扩展名
// 如果文件没有扩展名,直接加上新的扩展名
if (getExtension(srcFile.getPath()).equals("")) {
destFile = new File(dest + "/" + srcFile.getName()
+ newExtension);
} else {
// 如果文件有扩展名,替换为新的扩展名
String newFilename = srcFile.getName();
newFilename = newFilename.substring(0,
newFilename.lastIndexOf("."))
+ newExtension;
destFile = new File(dest + "/" + newFilename);
}
}
InputStream is = null;
OutputStream os = null;
// 存放文件片段的缓冲区
byte[] buf = new byte[1024 * 8];
// 记录每次读取了多少byte数据
int len;
try {
is = new FileInputStream(srcFile);
os = new FileOutputStream(destFile);
// 循环读取数据并写入到输出流
while ((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
System.out.println("拷贝成功!");
System.out.println("文件\"" + srcFile.getName() + "\n\"已从\""
+ srcFile.getAbsolutePath() + "\n拷贝到\""
+ destFile.getAbsolutePath() + "\"");
} catch (IOException e) {
throw new RuntimeException("文件拷贝出现错误,请重试!");
} finally {
// 关闭流
close(is, os);
}
}
/**
* 获得文件的扩展名
*
* @param filePath
* @return
*/
public static String getExtension(String filePath) {
File file = new File(filePath);
// 如果文件不存在,抛出异常
if (!file.exists())
throw new RuntimeException("文件不存在");
// 得到文件名
String fileName = file.getName();
// 找出属于扩展名的那个“.”
int index = fileName.lastIndexOf(".");
// 如果文件没有扩展名,返回""
if (index < 1) {
return "";
}
// 截取扩展名部分
String extension = fileName.substring(index, fileName.length());
return extension;
}
/**
* 将指定目录下的文件(指定扩展名)复制到指定目录(可以更改扩展名)
*
* @param srcDir
* 源目录
* @param extension
* 要复制的文件的扩展名,如果不指定,就代表所有文件
* @param destDir
* 目标目录
* @param newExtension
* 新的扩展名
* @param searchSubDir
* 是否对指定的源目录下的子目录也执行相同的操作
*/
public static void copyFilesAndChangeExtension(String srcDir,
String extension, String destDir, String newExtension,
boolean searchSubDir) {
File srcFile = new File(srcDir);
// 如果目录不存在或不是一个目录,抛出异常
if (!srcFile.exists() || !srcFile.isDirectory())
throw new RuntimeException("目录不存在");
File newDestDir = new File(destDir);
// 如果目标目录不存在,则创建
if (!newDestDir.exists()) {
newDestDir.mkdirs();
} else {
// 如果是文件,抛出异常
if (newDestDir.isFile()) {
throw new RuntimeException("您指定的目的地是一个文件,请重新指定目录");
}
}
// 文件清单
List<File> fileList = new ArrayList<File>();
// 获取指定目录的文件清单
getDirList(fileList, srcFile, extension, searchSubDir,
new MyFilenameFilter());
// 复制文件并更改扩展名
for (File fiel : fileList) {
copy(fiel.getPath(), newDestDir.getPath(), newExtension);
}
}
/**
* 获得指定目录的文件清单
*
* @param fileList
* 保存文件清单的集合
* @param file
* 要获取文件清单的目录
* @param extension
* 扩展名,如果不指定,就代表所有文件
* @param searchSubDir
* 是否查找指定目录的子目录
* @param fileanmeFilter
* 文件名过率器
* @return 返回指定目录的文件清单
*/
public static void getDirList(List<File> fileList, File file,
String extension, boolean searchSubDir,
FilenameFilter fileanmeFilter) {
getDirList(fileList, file, extension, searchSubDir,
new MyFilenameFilter(), 0);
}
/**
* getDirList(List<File> fileList, File file, String extension, boolean
* searchSubDir, FilenameFilter fileanmeFilter) 的重载形式,多了一个功能性参数
*
* @param level
* 记录目录层级
*/
private static void getDirList(List<File> fileList, File file,
String extension, boolean searchSubDir,
FilenameFilter fileanmeFilter, int level) {
//目录层级+1
level ++;
// 如果file是目录就遍历
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files == null || files.length == 0) {
return;
}
// 如果需要查找指定目录的子目录,就递归
if (level == 1 || searchSubDir == true) {
for (File f : files) {
getDirList(fileList, f, extension, searchSubDir,
fileanmeFilter);
}
}
} else if (file.isFile()) {
// 如果是文件并且extension已指定,就对其进行过滤
if (extension != null && !extension.trim().equals("")) {
if (fileanmeFilter.accept(file, extension)) {
fileList.add(file);
}
} else {
// 如果没有指定extension,不进行过滤
fileList.add(file);
}
}
}
/**
* 关闭流
*/
private static void close(InputStream is, OutputStream os) {
// 关闭流,如果关闭不成功,将流对象置为null
if (is != null) {
try {
is.close();
} catch (IOException e) {
is = null;
e.printStackTrace();
}
}
// 关闭流,如果关闭不成功,将流对象置为null
if (os != null) {
try {
is = null;
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
作者:
王志明
时间:
2012-7-27 13:51
代码多,上一楼撑不下了,还差个文件过滤器
文件过滤器
package com.itheima.util;
import java.io.File;
import java.io.FilenameFilter;
/**
* 此类可以根据扩展名过滤文件
*
* @author mrng
*
*/
public class MyFilenameFilter implements FilenameFilter {
/**
* 对指定文件进行过滤
*
* @param file
* 指定的文件
*
* @param extension
* 要过滤的扩展名 此参数有两种用法:
* 1,比如".java",如果文件扩展名为".java",返回true
* 2,比如"!.java",如果文件扩展名不是".java",则返回true
*/
public boolean accept(File file, String extension) {
// file==null直接返回false
// 如果extension为null或"",那么调用这个方法没无意义了,返回false
// 如果file不存在或是一个目录,返回false
if (file == null || extension == null || "".equals(extension.trim())
|| !file.exists() || file.isDirectory()) {
return false;
}
// 获得文件的扩展名
String fileExtension = IOUtils.getExtension(file.getPath());
if (extension.startsWith("!")) {
if (fileExtension.equals(extension.substring(1))) {
return false;
}
return true;
} else {
if (fileExtension.equals(extension)) {
return true;
}
return false;
}
}
}
复制代码
作者:
黑马连家华
时间:
2012-7-27 18:17
那么 我就就题论题
看看你的代码错在哪里
import java.io.*;
/*
需求: 编写一个程序,将d:\java 目录下的所有.java 文件复制到d:\jad 目录下,
并将原来文件的扩展名从.java 改为.jad
*/
public class Help01 {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
File dir=new File("d:\\java");
String[] arr = dir.list(new FilenameFilter(){
public boolean accept(File dir,String name){
return name.endsWith(".java");
}
});
//在这行写了个输出语句 System.out.println(arr.length);结果打印正确,我在那个目录下放了5个java文件,打印的就是5
for(int x=0;x<arr.length;x++){
BufferedReader bufr =
new BufferedReader(new FileReader("d:\\java\\"+arr[x]));
String[] arr1=arr[x].split(
"\\."
);//到了这行 System.out.println(arr.length); 打印的结果就是0了,不知道为什么?
//其实你的错误就出在了这里.没有被转义 至于你说的打印结果变成0了,你是不是把arr.length写成了arr1.length?我想下面那个错误你也应该知道问题出在哪里了
BufferedWriter bufw=
new BufferedWriter(new FileWriter("d:\\jad\\"+arr1[0]+".jad"));//这行报错说数组脚标越界
String line=null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.flush();
}
bufw.close();
bufr.close();
}
}
}
作者:
黑马连家华
时间:
2012-7-27 18:22
忘了解释: "."为什么要被转义呢?
通过查阅API可以知道,String的split方法接收的是一个正则表达式,"."在正则表达式里面代表的是任意字符.单纯的想要使用"."这个字符 就需要被转义
还是...给好评哦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2