3

我有一个过程,在这个过程中,我偶尔会创建文件,但由于我无法弄清楚我得到“java.io.FileNotFoundException:文件不是普通文件”的原因。即使文件出现(在文件管理器和文本编辑器中)完全正常,也会出现异常。因此,我正在尝试重新创建此错误并查看如何处理它,但为此我需要手动创建一个会引发此异常的文件,而且我不知道我可以手动对文件执行什么操作它突然以这种方式“破碎”。

我意识到,无论我对文件做什么,都与抛出异常的文件不同,但为了编写可测试代码以验证我的保护代码是否有效,这无关紧要.. . 我只需要一个损坏的文件。我想我可以在某个随机周期中手动抛出异常,但我希望我能让这个更“现实”。

所有帮助表示赞赏。

4

3 回答 3

2

我认为您可能看错了方式,尤其是根据文本编辑器实际上没有损坏文件时。
您应该已经发布了整个堆栈跟踪。我怀疑问题不在于文件,而在于路径名。
您是否在收到异常时尝试过File#isfile()的结果?来自 javadoc(我的重点)

公共布尔 isFile()

测试此抽象路径名表示的文件是否为 普通文件如果文件不是目录,并且满足其他系统相关标准,则该文件是正常的。Java 应用程序创建的任何非目录文件都保证是普通文件。

我怀疑它File#isfile()false在异常之前返回,你应该查看这个 API 而不是试图破坏文件

于 2012-09-07T20:59:25.530 回答
2

损坏的文件仍然是文件。例如,损坏的 Word 文档仍然是一个文件,但无法使用文字处理器打开,因为它的内容不可读。

此处抛出异常:

public FilePartSource(File file) throws FileNotFoundException {
66          this.file = file;
67          if (file != null) {
68              if (!file.isFile()) {
69                  throw new FileNotFoundException("File is not a normal file.");
70              }
71              if (!file.canRead()) {
72                  throw new FileNotFoundException("File is not readable.");
73              }
74              this.fileName = file.getName();       
75          }
76      }

并且当您的文件不是文件而是其他文件(目录?指向不存在文件的链接?)时发生

于 2012-09-07T21:02:59.583 回答
1

如果要破坏现有文件,只需编写一个打开文件并打乱字节的函数。您也可以使用十六进制编辑器来执行此操作。如果你想生成垃圾文件,你可以创建一个新文件并将 random.nextBytes() 写入其中。

于 2012-09-07T20:56:20.160 回答