`
wang371134086
  • 浏览: 128624 次
  • 性别: 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 编程中常见的-operational tasks。下面我们将详细介绍如何使用 Java 实现获取文件夹大小、文件大小、文件个数。 获取文件大小 在 Java 中,可以使用 File 类的 ...

    java删除指定文件夹下文件

    在JDK 7及以上版本中,Java提供了一种更加高效且灵活的方式来删除文件,包括递归删除整个文件夹及其子文件,这主要通过`java.nio.file`包中的`Files`类和`SimpleFileVisitor`类来实现。下面我们将详细探讨如何实现这...

    java判断文件或文件夹

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

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

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

    读取文件夹中所有文件中的内容

    ### 读取文件夹中所有文件中的内容 #### 背景介绍 在日常的软件开发工作中,我们经常需要处理大量的文件数据。例如,在进行数据分析、日志处理或批量文件操作时,可能需要读取一个文件夹下所有的文件内容并对这些...

    java读取某个文件夹下的所有文件

    java读取某个文件夹下的所有文件 很不错可以看看 不要分

    java删除某个文件夹

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

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

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

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

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

    java 解析csv文件例子,csv文件 中文乱码问题

    总结来说,处理包含中文字符的CSV文件,关键在于正确设置文件的编码,选择合适的读取方式,并确保与文件的实际编码匹配。此外,合理利用第三方库可以提高效率和代码质量。在实际开发中,根据项目需求选择合适的方法...

    java判断文件编码

    在Java编程中,判断文件编码是一项重要的任务,尤其是在处理用户上传的文件或处理不同系统间的文件传输时。本文将深入探讨如何使用Java进行文件编码的检测,并基于提供的资源——`cpdetector_1.0.5.jar`、`chardet....

    java批量修改指定文件夹下多级文件编码格式

    经常碰到文件编码格式不一致...在FileEncodeTranslate类中,修改一下源文件夹路径,以及转码完成后的文件存放路径、编码方式即可。 可以修改指定文件夹下的多级文件目录中的文件,并且生成的文件夹目录结构不会改变。

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

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

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

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

    java通过文件头内容判断文件类型

    在Java编程中,判断文件类型通常不是通过文件扩展名,而是通过读取文件的头部字节来识别。这是因为有些文件可能没有明确的扩展名,或者扩展名被恶意篡改。文件头内容通常包含特定的标识符,这些标识符是文件格式的...

    java 删除文件或文件夹

    在Java中,经常需要对文件系统进行操作,比如创建、删除文件或文件夹等。本篇文章将基于提供的代码示例,详细讲解如何使用Java来动态地删除文件和文件夹。 #### 一、基础知识准备 在深入探讨之前,我们需要了解几...

    Java获取文件夹大小、文件大小,文件个数[文].pdf

    Java 获取文件夹大小、文件大小和文件个数 Java 是一种流行的编程语言,广泛应用于软件开发领域。在文件操作方面,Java 提供了多种方法来获取文件夹大小、文件大小和文件个数。下面将对 Java 获取文件夹大小、文件...

    java获取文件编码(判断有无BOM)

    本文将详细介绍如何在Java中获取文件的编码并判断文件是否带有BOM。 首先,让我们了解一下什么是BOM。BOM是UTF-8、UTF-16和UTF-32等编码格式中的一个可选标记,用于告知解析器文件的编码类型。例如,UTF-8的BOM是三...

    遍历文件夹中的路径复制目录文件.rar

    在Java编程中,遍历文件夹中的路径并复制文件是一项常见的任务,特别是在处理大量数据或者进行文件系统操作时。这个“遍历文件夹中的路径复制目录文件.rar”压缩包可能包含了一个Java应用程序,用于实现这样的功能。...

Global site tag (gtag.js) - Google Analytics