`
MouseLearnJava
  • 浏览: 467459 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

空文件判断方法分析

    博客分类:
  • Java
阅读更多

本文结合File,FileInputStream,FileRedaer以及BufferedReader的方法,将给出四个判断文件是否为空的方法:




本文包括如下三个部分:
1. 贴出File,FileInputStream,FileRedaer以及BufferedReader相应方法的源代码,了解一下。
2. 给出自己的实现。
3. 测试并给出分析结论。

File,FileInputStream,FileRedaer以及BufferedReader相应方法的源代码

/**
     * Returns the length of the file denoted by this abstract pathname.
     * The return value is unspecified if this pathname denotes a directory.
     *
     * @return  The length, in bytes, of the file denoted by this abstract
     *          pathname, or <code>0L</code> if the file does not exist
     *
     * @throws  SecurityException
     *          If a security manager exists and its <code>{@link
     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
     *          method denies read access to the file
     */
    public long length() {
	SecurityManager security = System.getSecurityManager();
	if (security != null) {
	    security.checkRead(path);
	}
	return fs.getLength(this);
    }


public
class FileInputStream extends InputStream
{
    /**
     * Returns the number of bytes that can be read from this file input
     * stream without blocking.
     *
     * @return     the number of bytes that can be read from this file input
     *             stream without blocking.
     * @exception  IOException  if an I/O error occurs.
     */
public native int available() throws IOException;
}


public class InputStreamReader extends Reader {
/**
     * Tell whether this stream is ready to be read.  An InputStreamReader is
     * ready if its input buffer is not empty, or if bytes are available to be
     * read from the underlying byte stream.
     *
     * @exception  IOException  If an I/O error occurs
     */
    public boolean ready() throws IOException {
	return sd.ready();
    }
}


public class FileReader extends InputStreamReader {

}


public class BufferedReader extends Reader {

/**
     * Tell whether this stream is ready to be read.  A buffered character
     * stream is ready if the buffer is not empty, or if the underlying
     * character stream is ready.
     *
     * @exception  IOException  If an I/O error occurs
     */
    public boolean ready() throws IOException {
	synchronized (lock) {
	    ensureOpen();

	    /* 
	     * If newline needs to be skipped and the next char to be read
	     * is a newline character, then just skip it right away.
	     */
	    if (skipLF) {
		/* Note that in.ready() will return true if and only if the next 
		 * read on the stream will not block.
		 */
		if (nextChar >= nChars && in.ready()) {
		    fill();
		}
		if (nextChar < nChars) {
		    if (cb[nextChar] == '\n') 
			nextChar++;
		    skipLF = false;
		} 
	    }
	    return (nextChar < nChars) || in.ready();
	}
}
}



给出自己的实现类


package my.tool.file.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class EmptyFileChecker {

	public static boolean isFileEmpty1(File file) {
		FileInputStream fis = null;
		boolean flag = true;
		try {
			fis = new FileInputStream(file);
			if (fis.available() != 0) {
				flag = false;
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (null != fis) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					fis = null;
				}
			}
		}

		return flag;
	}

	public static boolean isFileEmpty2(File file) {
		boolean flag = true;
		FileReader fr = null;
		try {
			fr = new FileReader(file);

			if (fr.ready()) {
				flag = false;
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (null != fr) {
				try {
					fr.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					fr = null;
				}
			}
		}
		return flag;
	}

	public static boolean isFileEmpty3(File file) {
		boolean flag = true;

		BufferedReader br = null;

		try {
			br = new BufferedReader(new FileReader(file));

			if (br.ready()) {
				flag = false;
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (null != br) {
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					br = null;
				}
			}
		}

		return flag;
	}
	
	public static boolean isFileEmpty4(File file) {
		return file.length() ==0L;
	}
 }


为了测试文件是否为空,新建多种文件类型的文件。



Note: 新建文件后,像zip文件它们的大小都不是0KB。

编写一个测试类:
package my.tool.file.util;

import java.io.File;

public class Main {
	public static void main(String[] args) {
		for(File file: new File("D: \\EmptyFileFolder").listFiles())
		{
			System.out.print(file.getName());
			System.out.print(" ");
			System.out.print(" is empty ? ");
			System.out.println();
			
			System.out.println("Call method available in FileInputStream -->" + EmptyFileChecker.isFileEmpty1(file));
			
			System.out.println("Call method ready in FileReader -->" + EmptyFileChecker.isFileEmpty2(file));
			
			System.out.println("Call method ready in BufferedReader -->" + EmptyFileChecker.isFileEmpty3(file));
			
			System.out.println("Call method length in File -->" + EmptyFileChecker.isFileEmpty4(file));
			
			System.out.println();
		}
	}
	
}


输出的结果如下:

新建 BMP 图像.bmp  is empty ?
Call method available in FileInputStream -->true
Call method ready in FileReader -->true
Call method ready in BufferedReader -->true
Call method length in File -->true

新建 Microsoft Office Access 2007 Database.accdb  is empty ?
Call method available in FileInputStream -->false
Call method ready in FileReader -->false
Call method ready in BufferedReader -->false
Call method length in File -->false

新建 Microsoft Office Word Document.docx  is empty ?
Call method available in FileInputStream -->true
Call method ready in FileReader -->true
Call method ready in BufferedReader -->true
Call method length in File -->true

新建 OpenDocument Drawing.odg  is empty ?
Call method available in FileInputStream -->false
Call method ready in FileReader -->false
Call method ready in BufferedReader -->false
Call method length in File -->false

新建 OpenDocument Spreadsheet.ods  is empty ?
Call method available in FileInputStream -->false
Call method ready in FileReader -->false
Call method ready in BufferedReader -->false
Call method length in File -->false

新建 压缩(zipped)文件夹.zip  is empty ?
Call method available in FileInputStream -->false
Call method ready in FileReader -->false
Call method ready in BufferedReader -->false
Call method length in File -->false

新建 文本文档.txt  is empty ?
Call method available in FileInputStream -->true
Call method ready in FileReader -->true
Call method ready in BufferedReader -->true
Call method length in File -->true

新建 波形声音.wav  is empty ?
Call method available in FileInputStream -->false
Call method ready in FileReader -->false
Call method ready in BufferedReader -->false
Call method length in File -->false




结论: 通过File的length方法,FileInputStream的available方法或者是FileReader以及BufferedReader的ready方法,只有当新建的文件是0KB的时候,才能正确判断文件是否为空如果新建后的文件有一定的大小,比如zip文件有1KB,这样的文件,如果想要知道文件里面有没有内容,只能采用其它方式来做
  • 大小: 19.7 KB
  • 大小: 21.9 KB
  • 大小: 96.8 KB
0
3
分享到:
评论

相关推荐

    js 判断文件时候为空

    一个空文件的大小通常为0字节。因此,我们可以通过检查File对象的size属性来确定文件是否为空。下面是一个简单的示例: ```javascript // 假设files是来自的FileList对象 let file = files[0]; // 检查文件大小 if...

    易语言创建大空白文件模块

    文件大小可以通过传入的数值参数设定,生成的文件内容默认为空。 2. **内存缓冲区**:由于直接向大文件写入大量零字节可能会效率低下,因此通常会先在内存中创建一个缓冲区,一次性填充零字节,然后再将缓冲区写入...

    判断文件是文本文件还是二进制文件

    判断文件类型的常见方法是通过检查文件的前几个字节,这些字节通常包含了文件的“魔数”或“签名”,它们是特定文件格式的标识。例如,JPEG图像文件通常以FF D8 FF E0或FF D8 FF E1开始,PDF文件以%PDF-开头,而ZIP...

    一个RESTful的文件下载方法

    本文将深入探讨一个具体的RESTful文件下载方法,并详细分析其实现原理。 #### 二、方法描述 根据提供的代码片段,我们可以看到这是一个基于Java的RESTful服务端点,用于处理文件下载请求。该方法定义在一个类中,...

    基于JavaParser的代码调用链分析,可以用于分析Java代码的方法调用链.zip

    - **性能分析**:识别可能导致性能瓶颈的方法调用链,如深度递归或者频繁调用的耗时方法。 - **重构建议**:提供自动化重构的建议,如提取重复代码,简化调用链,优化接口设计等。 JavaParser库还提供了其他功能,...

    Vue前端判断数据对象是否为空的实例

    Vue提供了强大的前端开发架构,很多时候我们需要判断数据对象是否为空,使用typeof判断是个不错选择,具体代码见图。 补充知识:vue打包后 history模式 跟子目录 静态文件路径 分析 history 根目录 路由mode变为...

    Java判断文件的编码

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

    C#读取导入Excel值为空解决方法

    ### C#读取导入Excel值为空的解决方法 在日常工作中,我们经常需要处理Excel文件,尤其是在企业级应用中,Excel文件的导入导出是非常常见的需求之一。而在使用C#进行Excel数据读取时,可能会遇到一些单元格值为空的...

    java 导入及判断的Excel 使用方法

    本文将深入探讨Java中导入和判断Excel的使用方法,结合实例分析,帮助你全面理解这一技术。 首先,Java与Excel的交互通常依赖于第三方库,如Apache POI或JExcelAPI。Apache POI是目前最常用的一个,它提供了丰富的...

    C#判断一个文件夹内是否存在子文件夹或文件

    通过以上分析,我们不仅了解了如何使用C#来判断一个文件夹内是否存在子文件夹或文件,还深入探讨了目录拷贝与删除的具体实现方式。这些知识点对于处理文件系统相关的任务非常有用,能够帮助开发者更加高效地管理文件...

    遍历hfds列出所有空目录和文件及大小.rar

    在这个场景中,开发者编写了一个Java程序,能够遍历HDFS中的所有文件和目录,并且能够识别并标记出空目录。以下是关于这些主题的详细解释: 1. **HDFS(Hadoop Distributed File System)**: HDFS是Apache Hadoop...

    生成任意大小和格式文件的工具

    例如,对于文本文件,你可以决定是空文件、包含特定文字的文件,或者是随机字符生成的文件。对于图像文件,你可以指定分辨率、色彩深度等参数。对于音视频文件,可能需要设置编码参数,如比特率、帧率等。 此外,...

    LL(1)语法分析器

    首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意...

    修复Apply不了DBC文件

    如果在操作过程中遇到任何识别不准确的情况,应根据实际操作环境和软件提示进行判断和修正,确保操作步骤的正确性。 最后,进行以上步骤后,DBC文件应该已经修复并能够被PCAN工具所应用,从而使用户能够进行正常的...

    有空分析一下这个 Gerber 为什么不识别板框-2235.zip

    针对标题中提到的 "有空分析一下这个 Gerber 为什么不识别板框-2235.zip",我们可以深入探讨一些常见的原因以及解决办法。 1. **文件格式问题**:Gerber 文件必须遵循特定的规范,如 RS-274X 或者 X3.2。如果文件...

    简单的词法分析器 可生成一个output文件

    在这个项目中,我们有一个简单的词法分析器,其功能是接收输入的语言源代码,并生成一个名为“output”的文件,展示词法分析的结果。 词法分析器的工作原理通常是通过识别源代码中的模式,如关键字、标识符、常量、...

    PHP文件上传判断file是否己选择上传文件的方法

    除了判断`$_FILES['file']['tmp_name']`不为空外,还应通过前端JavaScript增加用户体验,并在后端进行详细的文件类型检查、文件大小限制、病毒扫描等安全性检测。正确的做法是在整个文件上传流程中实施多重验证,以...

    PIX4D空三引入流程

    PIX4D空三引入流程是将使用PIX4D软件进行的空中三角测量(Aerial Triangulation,简称空三)成果导入其他GIS或测绘软件,以便进行后续的三维建模、地形测绘等工作的过程。这一流程包括了一系列严谨的步骤,确保数据...

    使用flex编写一个词法分析器

    flex语言是lex语言的实现,它提供了一种生成词法分析器的方法。我们可以使用flex语言编写一个词法分析器,然后使用flex.exe对其进行编译,得到一个C语言的源代码文件,该文件可以被编译成一个可执行文件,以便进行...

Global site tag (gtag.js) - Google Analytics