`
wang371134086
  • 浏览: 128314 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java检查文件夹中含有中文的文件(判断文件编码方式)

    博客分类:
  • java
阅读更多
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.regex.Pattern;
import cpdetector.io.ASCIIDetector;
import cpdetector.io.CodepageDetectorProxy;
import cpdetector.io.JChardetFacade;
import cpdetector.io.ParsingDetector;
import cpdetector.io.UnicodeDetector;


public class CheckCN {
	 
	static int fileCount = 0;//文件总数
	static int wrong = 0 ;//含有中文字符的文件数
	static String regEx = "[\u4e00-\u9fa5]";   
    static Pattern pat = Pattern.compile(regEx);  
    static FileOutputStream fos = null;
    static OutputStreamWriter osw = null;

	public static void main(String[] args){
		Scanner sc = null;
		//long a = System.currentTimeMillis();
		
		    try {
		    	//每次重新执行的时候删除上次写入的文件
		    	File file = new File("D:\\cnFile.txt");
		    	file.delete();
		    	

		    	System.out.println("Please input the path as 'E:\\workspace\\jc6' : ");
		        //读取输入的路径
		    	sc = new Scanner(System.in);
		    	String filePath = sc.nextLine();
		    	//打开输出流
		    	fos = new FileOutputStream(new File("D:\\cnFile.txt"),true);
		    	osw = new OutputStreamWriter(fos,"UTF-8");
		    	
				//refreshFileList("E:\\workspace\\jc6");
		    	//开始检查文件
		    	refreshFileList(filePath);
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				 try {
					fos.close();
					osw.close();
					sc.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//refreshFileList("E:\\workspace\\test\\ognl\\enhance");
		
		//System.out.print("运行时间为 ");
		//System.out.println(System.currentTimeMillis() - a);
		//输出检查结果
		System.out.println(fileCount+" files were checked , and "+wrong+" files containing the Chinese ,please check D:\\cnFile.txt");
	}

	//递归查找文件
     private static void refreshFileList(String strPath) throws IOException {
		File dir = new File(strPath);
		File[] files = dir.listFiles();
		
		if (files == null)
			return;
		for (int i = 0; i < files.length; i++) {
			int flag = 0 ;
			if (files[i].isDirectory()) {
				refreshFileList(files[i].getAbsolutePath());
			} else {
				 fileCount++;
				String strFileName = files[i].getAbsolutePath().toLowerCase();
				//System.out.println(getFileEncode(files[i].getAbsolutePath())+" ----" +files[i].getName());
				//截取文件格式
				String  fileName = strFileName.substring(strFileName.lastIndexOf(".")+1,strFileName.length());
				//不知为何  两种方法判断的时候都会吧class文件和jar文件当做是含有中文字符的文件
				//所以此处排除掉这class文件和jar文件不参与判断
				if(!"class".equals(fileName.toLowerCase())){
				//开始输入文件流,检查文件
					String enCode = getFileEncode(files[i].getAbsolutePath());
					if("void".equals(enCode)){
						enCode="UTF-8";
					}if("windows-1252".equals(enCode)){
						enCode="GBK";
					}
				FileInputStream fis = new FileInputStream(files[i].getAbsolutePath());
				InputStreamReader in = new InputStreamReader(fis,enCode);
			    BufferedReader br = new BufferedReader(in);
			    //用于记录行数  确定文件哪一行有中文
			    int lineCount = 0 ;
			    String line = null;
			    //逐行检查文件
			    while((line = br.readLine())!=null){
			    	 /////使用正则表达式进行判断
			    	lineCount++ ;
			    	/*Matcher matcher = pat.matcher(line);     
			        if (matcher.find())    {    
			        	//将含有中文的文件名称和中文所在行数写入文件夹
			        	osw.write(files[i].getAbsolutePath()+" ------- containing the Chinese at line "+lineCount+"\r\n");
			        	osw.flush();
			        	//System.out.println(files[i].getAbsolutePath()+"have china");
			        	 flag ++ ;
	    	            
			        }  */ 
			    	//////不适用正则表达式判断   两种判断方法在效率上不相上下
			    	     char[] charArray = line.toCharArray();  
			    	        for (int k = 0; k < charArray.length; k ++) {  
			    	          if ((charArray[k] >= 0x4e00) && (charArray[k] <= 0x9fbb)) {  
			    	            	//将含有中文的文件名称和中文所在行数写入文件夹
			    	            	osw.write(files[i].getAbsolutePath()+" ------- containing the Chinese at line "+lineCount+"\r\n");
			        	            osw.flush();
			    	                flag ++ ;
			    	                //wrong++;
			    	                if(flag!=0) k =charArray.length ;
			    	            }  
			    	       /*    byte[] bytes=(""+charArray[k]).getBytes(); 
			    	            if(bytes.length==2){ 
			    	            	int[] ints=new int[2]; 
			    	            	ints[0]=bytes[0]& 0xff; 
			    	            	ints[1]=bytes[1]& 0xff; 
			    	            	if(ints[0]>=0x81 && ints[0]<=0xFE && ints[1]>=0x40 && ints[1]<=0xFE){ 
			    	            		// isGB2312=true; 
			    	            		//将含有中文的文件名称和中文所在行数写入文件夹
				    	            	osw.write(files[i].getAbsolutePath()+" ------- containing the Chinese at line "+lineCount+"\r\n");
				        	            osw.flush();
				    	                flag ++ ;
			    	            	} 
			    	            	  if(flag!=0) k =charArray.length ;
			    	       }*/
				    } 
			    	        
			    	 
			    }
			    //flag!=0 说明该文件中含有中文
			    if(flag!=0) wrong++ ;
			    br.close();
			    in.close();
			    fis.close();
				}
			}
		}
	}
     //检查文件类型
     public static String getFileEncode(String path) {
 		/*
 		 * detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
 		 * cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
 		 * JChardetFacade、ASCIIDetector、UnicodeDetector。
 		 * detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
 		 * 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
 		 * cpDetector是基于统计学原理的,不保证完全正确。
 		 */
 		CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
 		/*
 		 * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
 		 * 指示是否显示探测过程的详细信息,为false不显示。
 		 */
 		detector.add(new ParsingDetector(false));
 		/*
 		 * JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
 		 * 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
 		 * 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
 		 */
 		detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
 		// ASCIIDetector用于ASCII编码测定
 		detector.add(ASCIIDetector.getInstance());
 		// UnicodeDetector用于Unicode家族编码的测定
 		detector.add(UnicodeDetector.getInstance());
 		java.nio.charset.Charset charset = null;
 		File f = new File(path);
 		try {
 			charset = detector.detectCodepage(f.toURI().toURL());
 		} catch (Exception ex) {
 			ex.printStackTrace();
 		}
 		if (charset != null)
 			return charset.name();
 		else
 			return null;
 	}
}

 

分享到:
评论

相关推荐

    java创建和删除文件夹、文件

    通过以上介绍可以看出,在Java中,利用`java.io.File`类可以轻松地完成创建和删除文件及文件夹的操作。需要注意的是,对于删除文件夹的操作,如果文件夹非空,则需要先递归删除其中的所有文件和子文件夹后才能删除该...

    java判断文件或文件夹

    Java语言中判断文件或文件夹的存在性是一种基础操作,开发者在编写Java程序时经常需要判断文件或文件夹是否存在,以便进行相应的操作。在本文中,我们将详细介绍如何使用Java语言判断文件或文件夹的存在性。 一、...

    java创建和删除文件夹、文件.doc

    ### Java创建和删除文件夹与文件的知识点 #### 一、引言 在Java编程语言中,对文件系统的操作是一项非常基础且重要的功能。本文档将详细介绍如何使用Java来创建和删除文件夹以及文件,包括具体的实现代码和注意事项...

    Java判断文件的编码

    ### Java判断文件编码的方法 在Java开发中,经常会遇到需要处理不同编码格式的文件的情况。为了确保程序能够正确解析文件内容,必须先判断文件的编码格式。本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK...

    Java代码 可以压缩文件夹到指定目录和指定名称,将文件或者文件夹中的文件转成base64格式

    同时,将文件或文件夹中的文件转换为Base64编码是一种在内存中传输和存储二进制数据的有效方式,特别是在网络通信中。Base64是一种编码机制,它可以将任何二进制数据转换为ASCII字符串,确保数据在不支持二进制传输...

    Java判断文件编码格式 - 明明是悟空 - 博客园1

    总的来说,Java中判断文件编码格式的方法包括简单的字节匹配和使用更复杂的库如cpdetector。在实际开发中,应根据项目的具体需求选择合适的方法,确保能正确处理各种编码格式的文件,避免因为编码问题导致的乱码现象...

    java删除某个文件夹

    java递归删除整个文件夹,可以文件夹中所有的文件和子文件夹

    java 创建文件夹或文件

    根据提供的文件信息,本文将详细解释Java中如何利用文件流动态创建文件夹或文件的关键知识点。主要内容包括: 1. Java创建文件的基本原理。 2. 如何使用`java.io.File`类来创建文件与目录。 3. 代码示例分析:创建...

    java删除文件夹(删除文件)

    用JAVA 实现的删除文件(夹)程序,运行的时候,输入正确的文件夹路径,然后确定删除,文件夹路径不正确的时候不会做任何事情。

    java压缩文件以及文件夹

    在Java编程中,压缩和解压缩文件是常见的任务,特别是在处理大量数据或传输文件时。本文将深入探讨如何使用Java来处理压缩文件,特别是针对标题提及的“java压缩文件以及文件夹”。我们将主要关注`ZipCompressor....

    java-文件工具,可以查看文件类型,文件魔数,可以判断是否是视频文件,音乐文件,图片文件等等

    java文件的工具类,封装了常用的操作,尤其针对文件的实际类型,通过获取文件的byte,来查看文件起始字节的魔数值,通过魔数值来判断文件的类型,工具集合了常用的文件类型对应的魔数,也封装了文件类型的判断方法

    Java获取文件夹大小、文件大小,文件个数

    Java 获取文件夹大小、文件大小、文件个数是 Java 编程中常见的-operational tasks。下面我们将详细介绍如何使用 Java 实现获取文件夹大小、文件大小、文件个数。 获取文件大小 在 Java 中,可以使用 File 类的 ...

    Java文件、文件夹权限修改的两种方法

    在Java中,文件和文件夹权限的修改是非常重要的,特别是在Linux和Unix系统下。今天,我们将介绍两种修改文件和文件夹权限的方法,即使用File类和NIO方式。 使用File类 File类是Java中最基本的文件操作类,可以用来...

    java 删除文件夹内指定前缀名字的所有文件

    在Java编程语言中,删除文件或文件夹是一项常见的任务,特别是在进行文件系统操作时。这里我们将深入探讨如何在Java中删除文件夹内指定前缀名字的所有文件。首先,我们需要了解`java.io.File`类,它是Java标准库中的...

    读取创建CSV文件并自动解析文件编码方式

    在Java中,`java.nio.charset.Charset`类用于表示字符编码,但默认情况下,Java文件读取操作通常假设文件为UTF-8编码。对于其他编码,我们需要借助第三方库如`jcconf`或`ICU4J`来检测编码。 ```java import ...

    java实现根据关键字查找所在文件夹的文件

    在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见的任务,尤其在数据处理、日志分析或者文件管理系统中。这个功能可以帮助用户快速定位到含有特定信息的文件,提高工作效率。以下是一个...

    java项目实现远程UbuntuFTP下载文件和文件夹

    在Java编程环境中,实现远程Ubuntu FTP(文件传输协议)下载文件和文件夹是一项常见的任务,尤其是在构建跨平台的系统集成或者自动化运维方案时。FTP允许客户端与服务器之间进行高效的数据交换,而Java提供了多种库...

    java,判断ftp中文件是否存在

    java,判断ftp中文件是否存在

    java文件夹按时间、大小等排序

    在Java编程中,对文件夹中的文件进行排序是一项常见的任务,尤其在处理大量数据或进行自动化操作时。这里我们将深入探讨如何使用Java实现文件按时间、大小等属性进行排序的功能。 首先,我们要引入`java.io.File`类...

    java删除文件夹的代码

    在Java编程中,删除文件或文件夹是一项常见的操作。这里我们将深入探讨如何使用Java的`java.io.File`类来实现这一功能,特别是不使用递归而采用循环的方式。首先,让我们了解一下`File`类的基本概念。 `java.io....

Global site tag (gtag.js) - Google Analytics