`
wang371134086
  • 浏览: 128439 次
  • 性别: 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程序时经常需要判断文件或文件夹是否存在,以便进行相应的操作。在本文中,我们将详细介绍如何使用Java语言判断文件或文件夹的存在性。 一、...

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

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

    Java判断文件的编码

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

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

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

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

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

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

    在Java编程中,获取文件或文件夹的大小以及文件个数是常见的操作,尤其是在处理文件上传、存储管理和性能监控等场景。以下将详细介绍如何通过Java实现这些功能。 首先,我们来探讨如何获取单个文件的大小。在Java中...

    java删除某个文件夹

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

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

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

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

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

    java判断文件编码

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

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

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

    JAVA创建文件夹文件.doc

    在Java编程中,创建文件夹和文件是一项常见的任务,尤其在处理Web应用时,如上传和下载文件。下面将详细解释如何使用Java来创建文件夹、文件以及删除文件。 首先,要创建一个文件夹,Java提供了`java.io.File`类。...

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

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

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

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

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

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

    java 删除文件或文件夹

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

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

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

    java管理hdfs文件和文件夹项目hadoop2.4

    本文将深入探讨使用Java管理HDFS文件和文件夹的关键知识点,特别是基于Hadoop 2.4版本。 首先,理解HDFS的基础概念至关重要。HDFS是一种分布式文件系统,设计用于跨大量廉价硬件节点存储和处理大数据。它遵循主从...

    文件夹传输 java文件夹传输 文件传输

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出以下关于Java文件夹传输的知识点: ### 1. 文件传输概述 文件传输是计算机网络中一个常见的功能,它允许用户在网络中的不同设备之间发送和接收文件。...

Global site tag (gtag.js) - Google Analytics