how2j.cn

步骤 1 : 练习-复制文件   
步骤 2 : 答案-复制文件   
步骤 3 : 练习-复制文件夹   
步骤 4 : 答案-复制文件夹   
步骤 5 : 练习-查找文件内容   
步骤 6 : 答案-查找文件内容   

步骤 1 :

练习-复制文件

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
复制文件是常见的IO操作,设计如下方法,实现复制源文件srcFile到目标文件destFile

public static void copyFile(String srcFile, String destFile){
}
步骤 2 :

答案-复制文件

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分49秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


需要留意的是,read会返回实际的读取数量,有可能实际的读取数量小于缓冲的大小,那么把缓冲中的数据写出到目标文件的时候,就只应该写出部分数据。
package stream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class TestStream { /** * * @param srcPath 源文件 * @param destPath 目标文件 */ public static void copyFile(String srcPath, String destPath){ File srcFile = new File(srcPath); File destFile = new File(destPath); //缓存区,一次性读取1024字节 byte[] buffer = new byte[1024]; try ( FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); ){ while(true){ //实际读取的长度是 actuallyReaded,有可能小于1024 int actuallyReaded = fis.read(buffer); //-1表示没有可读的内容了 if(-1==actuallyReaded) break; fos.write(buffer, 0, actuallyReaded); fos.flush(); } } catch (IOException e) { e.printStackTrace(); } } /** * * @param srcPath 源文件夹 * @param destPath 目标文件夹 */ public static void copyFolder(String srcPath, String destPath){ } public static void main(String[] args) { copyFile("d:/lol.txt", "d:/lol2.txt"); } }
步骤 3 :

练习-复制文件夹

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
复制文件夹,实现如下方法,把源文件夹下所有的文件 复制到目标文件夹下(包括子文件夹)

public static void copyFolder(String srcFolder, String destFolder){

}
步骤 4 :

答案-复制文件夹

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分25秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package stream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class TestStream { /** * * @param srcPath 源文件 * @param destPath 目标文件 */ public static void copyFile(String srcPath, String destPath){ File srcFile = new File(srcPath); File destFile = new File(destPath); //缓存区,一次性读取1024字节 byte[] buffer = new byte[1024]; try ( FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); ){ while(true){ //实际读取的长度是 actuallyReaded,有可能小于1024 int actuallyReaded = fis.read(buffer); //-1表示没有可读的内容了 if(-1==actuallyReaded) break; fos.write(buffer, 0, actuallyReaded); fos.flush(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * * @param srcPath 源文件夹 * @param destPath 目标文件夹 */ public static void copyFolder(String srcPath, String destPath){ File srcFolder = new File(srcPath); File destFolder = new File(destPath); //源文件夹不存在 if(!srcFolder.exists()) return; //源文件夹不是一个文件夹 if(!srcFolder.isDirectory()) return; //目标文件夹是一个文件 if(destFolder.isFile()) return; //目标文件夹不存在 if(!destFolder.exists()) destFolder.mkdirs(); //遍历源文件夹 File[] files= srcFolder.listFiles(); for (File srcFile : files) { //如果是文件,就复制 if(srcFile.isFile()){ File newDestFile = new File(destFolder,srcFile.getName()); copyFile(srcFile.getAbsolutePath(), newDestFile.getAbsolutePath()); } //如果是文件夹,就递归 if(srcFile.isDirectory()){ File newDestFolder = new File(destFolder,srcFile.getName()); copyFolder(srcFile.getAbsolutePath(),newDestFolder.getAbsolutePath()); } } } public static void main(String[] args) { copyFolder("d:/LOLFolder", "d:/LOLFolder2"); } }
步骤 5 :

练习-查找文件内容

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势

public static void search(File folder, String search);

假设你的项目目录是 e:/project,遍历这个目录下所有的java文件(包括子文件夹),找出文件内容包括 Magic的那些文件,并打印出来。
练习-查找文件内容
步骤 6 :

答案-查找文件内容

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分6秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


package stream; import java.io.File; import java.io.FileReader; import java.io.IOException; public class TestStream { /** * @param file 查找的目录 * @param search 查找的字符串 */ public static void search(File file, String search) { if (file.isFile()) { if(file.getName().toLowerCase().endsWith(".java")){ String fileContent = readFileConent(file); if(fileContent.contains(search)){ System.out.printf("找到子目标字符串%s,在文件:%s%n",search,file); } } } if (file.isDirectory()) { File[] fs = file.listFiles(); for (File f : fs) { search(f, search); } } } public static String readFileConent(File file){ try (FileReader fr = new FileReader(file)) { char[] all = new char[(int) file.length()]; fr.read(all); return new String(all); } catch (IOException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { File folder =new File("e:\\project"); search(folder,"Magic"); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-03-27 交作业
夜神1997



交作业
package stream;

import java.io.*;

public class Exersices {	//练习:复制粘贴和搜索

	public static void main(String[] args){
		String srcFile = "e:/encode/homework/theone/bootstrap-3.3.5-dist.zip";
		String destFile = "e:/encode/encode/bootstrap-3.3.5-dist.zip";
		copyFile(srcFile, destFile);
		
		String srcFolder = "e:/encode/homework";
		String destFolder = "e:/encode/encode/homework";
		copyFolder(srcFolder, destFolder);
		
		File Folder = new File("e:/encode");
		String Search = "stream";
		search(Folder, Search);
	}
	
	public static void copyFile(String srcFile, String destFile){	//复制文件
		try(
				FileInputStream fis = new FileInputStream(srcFile);
				BufferedInputStream bis = new BufferedInputStream(fis);
				
				FileOutputStream fos = new FileOutputStream(destFile);
				BufferedOutputStream bos = new BufferedOutputStream(fos);
			){
			byte[] b = new byte[(int)new File(srcFile).length()];	//注意,这里scrFile是字符串,而不是文件
			bis.read(b);
			//System.out.println(new String(b));
			bos.write(b);
		}catch(IOException e){
			e.printStackTrace();
		}		
	}
	
	public static void copyFolder(String srcFolder, String destFolder){		//复制文件夹,注意,文件夹大小为0
		File[] fa = new File(srcFolder).listFiles();
		if(null == fa)
			return;
			
		for(int i = 0; i < fa.length; i++){
			if(fa[i].isDirectory()){
				String src = srcFolder + File.separator + fa[i].getName();
				String dest = destFolder + File.separator + fa[i].getName();
				copyFolder(src, dest);
			}
			else{
				byte[] b = new byte[(int)fa[i].length()];
				new File(destFolder).mkdirs();	//创建目标文件父目录
				
				try(
						FileInputStream fis = new FileInputStream(fa[i]);	//流只能操作文件,不能操作文件夹
						BufferedInputStream bis = new BufferedInputStream(fis);
				
						FileOutputStream fos = new FileOutputStream(destFolder + File.separator + fa[i].getName());
						BufferedOutputStream bos = new BufferedOutputStream(fos);
					){
					bis.read(b);
					bos.write(b);
				
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void search(File folder, String search){
		if(null == search){
			System.out.println("输入搜索错误");
			return;
		}
		
		File[] fa = folder.listFiles();
		if(null == fa){
			return;
		}
		
		for(int i = 0; i < fa.length; i++){
			if(fa[i].isDirectory()){
				search(new File(folder.getAbsolutePath() + File.separator + fa[i].getName()), search);
			}
			else{
				try(
						FileInputStream fis = new FileInputStream(fa[i]);
						BufferedInputStream bis = new BufferedInputStream(fis);
					){
					byte[] b = new byte[(int)fa[i].length()];
					bis.read(b);
					
					String str = new String(b);
					if(str.contains(search)){
						System.out.println("找到子目标字符串" + search + "在文件" +fa[i]);
					}
					
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}
	
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-03-23 每个月不应该送点积分吗,恩?
Danny



没钱买,没分看。=-=
package com.file.danny;
import java.io.*;
public class how2_copyFile {
	public static void main(String[] args) throws IOException {
		copyFile("a.txt", "d.txt");
		copyFolder(new File("G:\\工作日志"), new File("G:\\1"));
		System.out.println("文件夹拷贝完成。");
		search(new File("G:\\测试专用"),"who");
		System.out.println("查找完成。");
	}
	/** 拷贝文件
	 * @param srcFile 源文件
	 * @param destFile	目标文件
	 * @throws IOException 抛出异常
	 */
	public static void copyFile(String srcFile, String destFile) throws IOException{
		File src = new File(srcFile);
		File dest = new File(destFile);
		if(src.exists() && src.isFile()) {
			BufferedReader br = new BufferedReader(new FileReader(src));
			BufferedWriter bw = new BufferedWriter(new FileWriter(dest));
			String str = "";
			while((str=br.readLine())!=null) {
				bw.write(str);
				bw.newLine();
			}
			br.close();
			bw.close();
			System.out.println("文件拷贝完成。");
		}else {
			System.out.println("文件名错误。");
		}
	}
	/**
	 * 拷贝文件夹
	 * @param srcFolder 要拷贝的文件夹
	 * @param destFolder 目的地文件夹
	 * @throws IOException 
	 */
	public static void copyFolder(File srcFolder, File destFolder) throws IOException{
		File newDir = new File(destFolder,srcFolder.getName());
		if(!destFolder.exists()) {
			destFolder.mkdir();
		}
		if(!newDir.exists()) {
			newDir.mkdir();
		}
		//遍历源文件夹;
		File[] files = srcFolder.listFiles();
		for(File listfile : files) {
			if(listfile.isFile()) {
				FileInputStream fis = new FileInputStream(listfile);
				File newf = new File(newDir,listfile.getName());
				FileOutputStream fos = new FileOutputStream(newf);
				int len = 0;
				//速度缓慢
				/*while((len=fis.read())!=-1) {
				 * fos.write(len);
				}*/
				//瞬间完成
				byte[] by = new byte[1024*10];
				while((len=fis.read(by))!=-1) {
					fos.write(by, 0, len);
				}
				fis.close();
				fos.close();
				//缓存流拷贝文件夹,拷贝后的文档,图片都打不开。
				/*BufferedReader br = new BufferedReader(new FileReader(listfile));
				File newfile = new File(newDir,listfile.getName());
				BufferedWriter bw = new BufferedWriter(new FileWriter(newfile));
				String str="";
				while((str=br.readLine())!=null) {
					bw.write(str);
				}
				br.close();
				bw.close();*/
			}else {
				copyFolder(listfile, newDir);
			}
		}	
	}
	/**
	 *查找包含字符串的文档。
	 * @param folder 要查找的文件夹
	 * @param search 查找的文档所包含的字符串
	 * @throws IOException 抛出异常
	 */
	public static void search(File folder, String search) throws IOException {
		if(folder.exists()) {
			File[] files = folder.listFiles();
			for(File listfile : files) {
				if(listfile.isFile()) {
					FileReader fr = new FileReader(listfile);
					int len = 0;
					char[] ch = new char[1024];
					while((len=fr.read(ch))!=-1) {
						String str = String.valueOf(ch);
						if(str.contains(search)) {
							System.out.println("找到子目标字符串"+search+",在文件:"+listfile.getAbsolutePath());
						}
					}
					fr.close();
				}else {
					search(listfile,search);
				}
			}
		}else
			System.out.println("文件错误。");		
	}
}

							


2 个答案

51555 答案时间:2018-04-12
白嫖还有理,真恶心

iJava_evey 答案时间:2018-04-05
这个想法好




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-02-01 拒绝访问???
2017-12-03 复制文件夹的时候可能出现无限递归
2017-11-19 复制文件用了缓存流可以吗
2017-10-19 关于递归的那个return,为什么我有加没加效果都一样?
2017-09-25 查找目标文件过大
2017-08-15 另一个程序已锁定文件的一部分,进程无法访问。
2017-08-15 站长什么时候讲讲nio啊
2017-08-14 bufferinputstream
2017-06-29 如题
2017-04-13 什么时候用什么样的流有没有一个总结?感觉经常就想不起来用啥
2017-03-26 复制文件为什么要设置缓存区呢
2017-03-15 练习一:复制文件后与源文件内存大小不一致问题




提问之前请登陆
关于 JAVA 中级-I/O-综合练习 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图