彦舜原创,CSDN首发:完善版:文件工具类File,字节流Input/OutStream综合运用,文件间的数据资源复制。(文末有彩蛋)

/**
 * 
 */
package api.io.pratices;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

/**
 * 这个类用来练习测试“文件复制”
 */
public class Test2_FileCopy2 {

	/**
	 * 
	 */
	public Test2_FileCopy2() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 日常小黄线:The value of the local variable field is not used;
	 * 日常小注解:Add @SuppressWarnings 'unused' to main()/method()/field;
	 * 日常小注解:Add @SuppressWarnings 'deprecation' to main()/method()/field;
	 * 日常小注解:Add @SuppressWarnings 'resource' to main()/metod()/field;
	 * 日常小注解:Add @SuppressWarnings 'null' to main()/method()/field;
	 * 日常小注解:@SuppressWarnings("resource") == @SuppressWarnings({ "resource" })
	 * 日常小异常:Exception--API(IO)IOException--FileNotFoundException
	 */
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		//字节流In和Out:以字节流读入写出的方式进行不同文件间的资源复制
		//Test2_FileCopy2.method();
		
		//读取一号文件,写出到二号文件中
		//@SuppressWarnings({ "resource" })
		System.out.println("请输入源文件的路径,即请输入需要进行复制数据的文件路径:");
		String s = new Scanner(System.in).nextLine();
		File f = new File(s);  //封装源文件路径,抽象化为抽象路径名
		
		System.out.println("请输入目标文件的路径,即请输入需要进行粘贴数据的文件路径:");
		String s2 = new Scanner(System.in).nextLine();
		File f2 = new File(s2);  //封装目标文件路径,抽象化为抽象路径名
		
		//完成文件间的交互:复制与粘贴
		copy(f, f2); 
		System.out.println("复制成功!!!");
	}
	
	private static void copy(File f, File f2) {
		/** 文件复制开发思路:
		  
			1、创建电脑磁盘文件与程序的数据连接流动通道,实际文件路径名抽象化为抽象路径名
			
			2、字节流读取,将电脑磁盘中的指定文件的数据资源,通过数据连接流动通道,读入程序
			
			3、字节流写入,将程序中从上一个文件读取的数据资源,通过数据连接流动通道,写入与该文件路径相同的另一个文件中,完成文件之间的数据资源复制
			
			4、关闭释放资源 
			
				程序充当两个文件间交互中介,数据的读入与写出,通过程序完成,进而完成两个文件间数据资源交互。
			*/
		//1.2文件读写,都存在诸多IO类异常,通常直接catch大异常:捕捉处理异常Unhandled exception type FileNotFoundException
		try {
			//1.1创建读取流对象is,即建立程序与磁盘文件进行交互的数据连接流动通道is,将磁盘文件f的数据资源,读入程序
			InputStream is = new FileInputStream(f);
			
			/**第2步开发总思路,并分步解析该思路:当程序读取完指定文件的所有数据,需要将程序中读取到的所有资源,写入/写出到目标路径下的目标文件中,最终完成所谓的文件复制*/
			//2.1当程序读取完指定文件f的所有数据,建立需要将程序所读取的上一个文件f中的所有数据,写入到目标文件f2的通道os(水管)
			OutputStream os = new FileOutputStream(f2);
			
			//1.4将磁盘文件的数据资源,读入程序。while循环循环读取磁盘文件中的所有数组资源,直至将文件中的数据全部读取完毕,read()返回-1:is.read()
			//1.5定义一个变量,记录程序每读取文件中的一个数据,它的字节。并在程序中打印显示出来,以核对程序所读数据是否与文件中数据正确一致
			int i;
			while((i = is.read()) != -1) {
				//1.6并在程序中打印显示出来,以核对程序所读数据是否与文件中数据正确一致
				System.out.println(i);
				
				//2.3通过程序,程序读取指定磁盘文件f中所有数据的同时,再通过程序,将这些数据写入到目标磁盘文件f2中去。最终,在此步,完成两个不同文件间的数据资源复制
				os.write(i);
			}
			
			//1.3创建字节输入流通道is的同时,应当同时创建水龙头,防止程序读取磁盘文件资源完毕后,数据泄露缺失不完整
			is.close();  //字节流通道(水管)水龙头
			os.close();  //2.2与1.3同理
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	
	//@SuppressWarnings({ /**"unused"*/ })  == @SuppressWarnings()  ==  @SuppressWarnings({})
	@SuppressWarnings({ "unused" })
	private static void method() {
		/** 文件复制开发思路:
		  
			1、创建电脑磁盘文件与程序的数据连接流动通道,实际文件路径名抽象化为抽象路径名
			
			2、字节流读取,将电脑磁盘中的指定文件的数据资源,通过数据连接流动通道,读入程序
			
			3、字节流写入,将程序中从上一个文件读取的数据资源,通过数据连接流动通道,写入与该文件路径相同的另一个文件中,完成文件之间的数据资源复制
			
			4、关闭释放资源 */
		//1.2、文件读写,都存在诸多异常,通常直接catch大异常:捕捉处理异常try/catch
		try {
			//1.1建立程序与电脑磁盘的文件之间的数据连接流动通道is,进行程序与磁盘文件的交互,将磁盘文件的数据读入程序
			//普通字节流读入
			InputStream is = new FileInputStream(new File("E:\\JavaDevelopmentEngineer\\java\\JDK\\Jdk1.8\\Temps\\Tmooc2002\\Workspaces\\bin\\io\\IONewFile()_2.txt"));
			
			//2.1创建字节写入流工具父类OutputStream实例对象,即建立将程序中存取自上一个文件的数据资源传输到,与上一个文件同意路径下的另一个文件中,的数据连接流动通道
			//普通字节写入流,append默认false,默认覆盖该文件中的原有数据
			OutputStream os = new FileOutputStream(new File("E:\\JavaDevelopmentEngineer\\java\\JDK\\Jdk1.8\\Temps\\Tmooc2002\\Workspaces\\bin\\io\\IONewFile()_3.txt"));
			
			//1.4通过数据连接流动通道is,将磁盘文件的数据资源读入程序:is.read();
			//1.6创建一个变量,记录每读取一次文件数据,得到的字节,直至读完该文件中所有数据资源
			int i;
			while((i = is.read()) != -1) {  //1.5while循环读取文件中所有数据资源到程序中。while循环判断条件:当文件中没有数据资源可读仍读时,返回-1,反之,不等于-1
				//1.7将程序从磁盘文件中读到的数据,打印并显示,核查读到的所有数据与文件中的数据是否一致、正确
				System.out.print(i);
				
				//2.3通过此写入流通道os,将程序中的数据资源写入文件
//				os.write(is.read());
				//os.write(i + "");The method write(int) in the type OutputStream is not applicable for the arguments (String)
				os.write(i);
			}
			//1.3程序读取磁盘文件数据资源,通过数据连接流动通道时,应当同时设置水龙头开关,防止数据传输完毕后数据继续在通道中流动传输造成泄露流失
			is.close();
			//2.2通过数据写入连接流动通道,程序数据读入磁盘文件时,应当同时设置水龙头开关,防止数据传输完毕后数据继续在通道中流动传输造成泄露流失
			os.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
		//彦舜:https://mp.weixin.qq.com/s?__biz=MzU4ODkxMzYyMw==&mid=2247483731&idx=1&sn=67b332ea70fc43d57d5bcc61b3d91236&chksm=fdd4cfebcaa346fdc18e8d8753319886f32ccf0826cbd0e8fa7081a40196172940f44498e97f&sessionid=0&scene=126&subscene=0&clicktime=1598950811&enterid=1598950811&ascene=3&devicetype=android-28&version=2700113f&nettype=cmnet&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AS%2BWRvMS3wHhOl%2BeRJoI68U%3D&pass_ticket=TvK%2BFPKj%2BXRAnIWw%2BIHia37FmGWhsU2e4uQ65a2BCga0YyuUuai8WzowCgxvfhIT&wx_header=1
	}
}

彦舜原创,CSDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值