【Java学习笔记】I/O实例

-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java I/O 初学,实例讲解
一、简介:
上篇博文介绍了Java中常用的I/O操作,本篇博文是对上篇的补充,主要列举以下实例,帮助大家更好的理解I/O操作:

1、磁盘操作。包括:
文件夹的创建,删除,重命名等

2、文件读写。 包括:
2.1、txt文档的读取,复制。
 2.2、java文件的读取,复制。(字节流)
 2.3、图片的读取和复制。(字节流)
二、实例讲解
2.1、磁盘操作实例
/**
	 * 创建目录
	 * @param folderpath 待创建的目录路径
	 */
	private static void FolderCreate(String folderpath){
		File folder = new File(folderpath);
		boolean IsWork = true;
		if(!folder.exists()){
			IsWork = folder.mkdirs();
			
		}
		
		if(IsWork)
			System.out.println("文件夹已经创建!");
		else
			System.out.println("文件夹创建失败!");
	}
程序运行截图

/**
	 * 目录重命名
	 * @param fromDir 原目录路径
	 * @param toDir 重命名后的目录路径
	 */
	private static void FolderRename(String fromDir,String toDir){
		File from = new File(fromDir);
		if(!from.exists()){
			System.out.println(fromDir+" 目录不存在!");
		}else{
			File to = new File(toDir);
			if(from.renameTo(to)){
				from.delete();//删除原文件
				System.out.println("重命名成功!");
				}
			else
				System.out.println("重命名失败!");
		}
	}

运行结果:


2.2、文件读写实例
2.2.1、txt文档的读取,复制
/**
	 * 读取并统计文本文件中字符串出现的次数,结果保存至其他文件里
	 * 
	 * @param FilePath 待统计的文本文件
	 * @param CopyPath 统计后的结果
	 * @throws IOException 
	 */
	private static void ReadAndWriteTxtFile(String FilePath,String CopyPath) throws IOException{
		File f = new File(FilePath);
		if(!f.exists()){
			System.out.println(FilePath+" 文件不存在!");
		}else{
			FileReader fr = new FileReader(f);
			BufferedReader br = new BufferedReader(fr);//使用BufferedReader可以高效的读取
			HashSet<String> MySet = new HashSet<String>();//存储城市名称(不重复)
			ArrayList<String> MyArr = new ArrayList<String>();//存储读取的城市数据
			String str;
			while((str = br.readLine())!= null){
				MyArr.add(str);
				MySet.add(str);//每个城市的名称只存储一次
			}
			fr.close();
			HashMap<String,Integer> MyMap = new HashMap<String,Integer>();//使用map记录对应的城市出现的次数
			for(String s:MySet){
				MyMap.put(s, 0);//初始化
				for(String arr:MyArr){
					if(s.equals(arr)){//将HashSet中的城市名称与ArrayList里的数据对比
						MyMap.put(s, MyMap.get(s)+1);//如果相等,则修改Map中的数据
					}
				}
			}
			
			f = new File(CopyPath);//保存统计结果的文件
			if(!f.exists()){//如果不存在则创建新文件
				f.createNewFile();
			}
			FileWriter fw = new FileWriter(f);
			BufferedWriter bw = new BufferedWriter(fw);
			Iterator it = MyMap.entrySet().iterator();
			while(it.hasNext()){//使用迭代器遍历HashMap
				Entry entry = (Entry) it.next();
				bw.write(entry.getKey()+"("+entry.getValue()+")");
				bw.newLine();
			}
			bw.close();
		}
	}
	
执行代码:
ReadAndWriteTxtFile("F://city.txt","F://Test_Rename//copy_city.txt");


2.2.2、 java文档的读取,复制

/**
	 * 读取指定目录下的java文件,输出结果的同时,将java文件复制到指定目录下
	 * 
	 * @param FilePath 要读取的java文件
	 * @param CopyPath 保存读取结果
	 * @throws IOException
	 */
	private static void ReadAndWriteJavaFile(String FilePath,String CopyPath) throws IOException{
		File f = new File(FilePath);
		if(!f.exists()){
			System.out.println(FilePath+" 文件不存在!");
		}else{
			FileInputStream  fis = new FileInputStream(f);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			byte[] data = new byte[1024];
			int IsEnd;
			System.out.println(GetFileName(FilePath)+"的内容:");
			System.out.print("--------------------");
			while((IsEnd = fis.read(data)) != -1){//读取文件
				bos.write(data, 0, IsEnd);
				System.out.print(new String(data));//打印读取的结果
			}
			System.out.println("\n--------------------");
			fis.close();
			
			File file = new File(CopyPath);
			if(!file.exists()){
				file.createNewFile();
			}
			
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(bos.toByteArray(), 0, bos.size());//复制文件
			fos.close();
			System.out.println(GetFileName(FilePath)+" 文件已经复制!");
		}
	}
	
运行结果:


 2.2.3、图片的读取和复制
/**
	 * 读取并复制图片
	 * 
	 * @param path 原图片所在的路径
	 * @param copy 复制图片的存储路径
	 * @throws IOException
	 */
	private static void CopyImage(String path,String copy) throws IOException{

		FileInputStream fis = new FileInputStream(new File(path));//读取原图片
		ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
		byte[] img = new byte[1024];
		int len = 0;
		while((len = fis.read(img)) != -1){//每次读取1024字节,直到文件尾
			byteArr.write(img, 0,len);//将读入的二进制字节存储
		}
		fis.close();
		
		File file = new File(copy);
		if(!file.exists()){//如果要复制的图片不存在
			file.createNewFile();//创建对应图片
		}
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(byteArr.toByteArray(),0,byteArr.size());//将存储的二进制字节写入对应文件
		fos.close();
		System.out.println(GetFileName(path)+" 已经拷贝!");
		
	}
	
运行结果:




下面是完整的程序代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;

/**
 * Java I/O实例
 * 
 * @author VisionDo
 *
 */
public class FileExample {

	
	public static void main(String[] args) {
		FolderCreate("F://Test");//创建目录
		FolderRename("F://Test","F://Test_Rename");//目录重命名
		
		 try {
			
			//文本文件的读取与复制
			ReadAndWriteTxtFile("F://city.txt","F://Test_Rename//copy_city.txt");
			
			//Java文件读取与复制
		    ReadAndWriteJavaFile("F://test.java","F://Test_Rename//copy_test.java");
			
			//图片读取与复制
			CopyImage("F://test.jpg","F://Test_Rename//copy_img.jpg");
			
			FolderDelete("F://Test_Rename");//删除目录
			
			} catch (IOException e) {
			System.out.print("出错了!");
		}
		
		
	}

	/**
	 * 创建目录
	 * @param folderpath 待创建的目录路径
	 */
	private static void FolderCreate(String folderpath){
		File folder = new File(folderpath);
		boolean IsWork = true;
		if(!folder.exists()){
			IsWork = folder.mkdirs();
			
		}
		
		if(IsWork)
			System.out.println("文件夹已经创建!");
		else
			System.out.println("文件夹创建失败!");
	}
	
	/**
	 * 目录重命名
	 * @param fromDir 原目录路径
	 * @param toDir 重命名后的目录路径
	 */
	private static void FolderRename(String fromDir,String toDir){
		File from = new File(fromDir);
		if(!from.exists()){
			System.out.println(fromDir+" 目录不存在!");
		}else{
			File to = new File(toDir);
			if(from.renameTo(to)){
				from.delete();//删除原文件
				System.out.println("重命名成功!");
				}
			else
				System.out.println("重命名失败!");
		}
	}
	
	/**
	 * 删除目录
	 * 	  如果目录下有子文件或者子目录,则删除目录里的文件,之后删除目录
	 * @param folderPath 目录路径
	 */
	private static void FolderDelete(String folderPath){
		File f = new File(folderPath);
		boolean IsDelete = false;
		if(!f.exists()){//目录不存在
			System.out.println("目录:"+GetFileName(folderPath)+"不存在,无法执行删除操作!");
		}else{
			DeleteFile(folderPath);//先删除目录里的子文件和子目录
			f = new File(folderPath);
			IsDelete = f.delete();//删除空目录	
			}
		if(IsDelete)
			System.out.println("目录:"+GetFileName(folderPath)+"已经删除!");
		else
			System.out.println("目录:"+GetFileName(folderPath)+"删除操作失败!");	
			
		}
	
	private static void DeleteFile(String path){
		File f = new File(path);
		if(!f.exists()){//目录不存在
			System.out.println("目录"+GetFileName(path)+"不存在,无法执行删除操作!");
		}else{//先删除目录里的子文件和子目录
			String[] fileList = f.list();//得到目录下的文件名称
			File file = null;
			for(String str:fileList){//遍历目录
				str = path+"//"+str;//得到目录下文件或者子目录的绝对路径
				file = new File(str);//生成新的文件(文件或者目录)
				if(file.isFile()){//如果是文件则直接删除
					if(file.delete())
						System.out.println("文件:"+GetFileName(str)+" 已经删除!");
					else
						System.out.println("文件:"+GetFileName(str)+" 删除操作失败!");
					}
				else{//如果是子目录,则递归遍历
					DeleteFile(str);
					}
				}
			}
	}
	
	
	/**
	 * 读取并统计文本文件中字符串出现的次数,结果保存至其他文件里
	 * 
	 * @param FilePath 待统计的文本文件
	 * @param CopyPath 统计后的结果
	 * @throws IOException 
	 */
	private static void ReadAndWriteTxtFile(String FilePath,String CopyPath) throws IOException{
		File f = new File(FilePath);
		if(!f.exists()){
			System.out.println(FilePath+" 文件不存在!");
		}else{
			FileReader fr = new FileReader(f);
			BufferedReader br = new BufferedReader(fr);//使用BufferedReader可以高效的读取
			HashSet<String> MySet = new HashSet<String>();//存储城市名称(不重复)
			ArrayList<String> MyArr = new ArrayList<String>();//存储读取的城市数据
			String str;
			while((str = br.readLine())!= null){
				MyArr.add(str);
				MySet.add(str);//每个城市的名称只存储一次
			}
			fr.close();
			HashMap<String,Integer> MyMap = new HashMap<String,Integer>();//使用map记录对应的城市出现的次数
			for(String s:MySet){
				MyMap.put(s, 0);//初始化
				for(String arr:MyArr){
					if(s.equals(arr)){//将HashSet中的城市名称与ArrayList里的数据对比
						MyMap.put(s, MyMap.get(s)+1);//如果相等,则修改Map中的数据
					}
				}
			}
			
			f = new File(CopyPath);//保存统计结果的文件
			if(!f.exists()){//如果不存在则创建新文件
				f.createNewFile();
			}
			FileWriter fw = new FileWriter(f);
			BufferedWriter bw = new BufferedWriter(fw);
			Iterator it = MyMap.entrySet().iterator();
			while(it.hasNext()){//使用迭代器遍历HashMap
				Entry entry = (Entry) it.next();
				bw.write(entry.getKey()+"("+entry.getValue()+")");
				bw.newLine();
			}
			bw.close();
			System.out.println(GetFileName(FilePath)+" 文件已经复制!");
		}
	}
	
	
	/**
	 * 读取指定目录下的java文件,输出结果的同时,将java文件复制到指定目录下
	 * 
	 * @param FilePath 要读取的java文件
	 * @param CopyPath 保存读取结果
	 * @throws IOException
	 */
	private static void ReadAndWriteJavaFile(String FilePath,String CopyPath) throws IOException{
		File f = new File(FilePath);
		if(!f.exists()){
			System.out.println(FilePath+" 文件不存在!");
		}else{
			FileInputStream  fis = new FileInputStream(f);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			byte[] data = new byte[1024];
			int IsEnd;
			System.out.println(GetFileName(FilePath)+"的内容:");
			System.out.print("--------------------");
			while((IsEnd = fis.read(data)) != -1){//读取文件
				bos.write(data, 0, IsEnd);
				System.out.print(new String(data));//打印读取的结果
			}
			System.out.println("\n--------------------");
			fis.close();
			
			File file = new File(CopyPath);
			if(!file.exists()){
				file.createNewFile();
			}
			
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(bos.toByteArray(), 0, bos.size());//复制文件
			fos.close();
			System.out.println(GetFileName(FilePath)+" 文件已经复制!");
		}
	}
	
	/**
	 * 读取并复制图片
	 * 
	 * @param path 原图片所在的路径
	 * @param copy 复制图片的存储路径
	 * @throws IOException
	 */
	private static void CopyImage(String path,String copy) throws IOException{

		FileInputStream fis = new FileInputStream(new File(path));//读取原图片
		ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
		byte[] img = new byte[1024];
		int len = 0;
		while((len = fis.read(img)) != -1){//每次读取1024字节,直到文件尾
			byteArr.write(img, 0,len);//将读入的二进制字节存储
		}
		fis.close();
		
		File file = new File(copy);
		if(!file.exists()){//如果要复制的图片不存在
			file.createNewFile();//创建对应图片
		}
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(byteArr.toByteArray(),0,byteArr.size());//将存储的二进制字节写入对应文件
		fos.close();
		System.out.println(GetFileName(path)+" 已经拷贝!");
		
	}
	
	/**
	 * 得到不包含路径的文件名称
	 * @param file 文件路径
	 * @return 文件名
	 */
	private static String GetFileName(String file){
		String[] s = file.split("//");
		
		return s[s.length-1];
		
	}
	
	
}

运行结果:



三、小结
通过今天的编程练习,我对I/O的操作有了一定的了解,不过后续还要加强学习。
文件夹的删除操作,目前只能做到删除单级目录,如果文件夹有子文件夹,我还不懂如何去实现删除。网上说递归操作,可是如果二级目录太多,那么递归的效率就太低了。这个疑问留到以后解决吧,也希望大神看到后能指点一二。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值