【问题标题】:Obtaining File Format in Java/ DOS-UNIX在 Java/ DOS-UNIX 中获取文件格式
【发布时间】:2010-06-16 17:26:41
【问题描述】:

是否有一种简单的方法可以查看特定文件是否具有 DOS/MAC/UNIX 行结尾?

目前我逐字节读取文件,如果看到 Windows 回车则停止

for (byte thisByte : bytes) {

  if ((!isDos) && (thisByte == 13)) {
      isDos = true;
  }
...

有没有办法在不逐字节读取文件的情况下获得相同的信息?

【问题讨论】:

  • 请注意,在 CR('\r'13)上停止不区分 Mac 和 DOS。您需要查看下一个字符来判断它是 Mac 还是 DOS — 如果是换行符 ('\n'),那么您就是 DOS;如果不是,则为 Mac;如果你在 CR 之前遇到换行符,那么你就有了 Unix。这是最基本的检查。

标签: java unix file format dos


【解决方案1】:

一个可能的优化可能是只查看文件的最后一个或两个字节。由于许多文本文件以行结尾结尾,因此大多数情况下这应该可以工作。如果您没有发现在那里结束的行,那么您将不得不逐字节回退。

顺便说一句,您的示例代码将 isDos 设置为 true,而不检查下一个字符是否为十进制 10。如果不是 10,则可能是 MAC 文件格式。

【讨论】:

  • 这是有效的。在我的小世界里,只有 DOS 或 UNIX 格式可能会出现。我将进行更改以使代码更通用并包含 MAC。感谢您的评论。
【解决方案2】:

假设它是一个文本文件,并且行是“合理”的长度,您可以读取文件的大块(例如 4096 字节)并仅扫描该块以查找 CR 字符。

但除此之外,不,您可以在文件中找到字符的唯一方法是实际读取整个文件并查找该字符。

假设您之所以问这个问题是因为一次读取一个字节的文件时遇到性能问题:请确保使用 BufferedInputStream 包装 FileInputStream

【讨论】:

  • 谢谢。你能提供一个读取文件的一部分的例子吗?或者,您的意思是“在读取 4096 个字节后停止读取?)
【解决方案3】:

如果您知道一个文件只使用一种换行符,那么您可以只扫描第一个换行符,看看它是否是 DOS/UNIX/Mac。

【讨论】:

  • 正确。这就是我目前正在做的,在逐行读取文件之后。我想知道是否有更简单、更优雅的方式来获取相同的信息
  • 从您的代码看来,如果不是 DOS,您就可以读取整个文件。
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多