【问题标题】:How to get a file name from a file's byte array?如何从文件的字节数组中获取文件名?
【发布时间】:2013-11-23 14:29:30
【问题描述】:

我有代表我通过网络传输的文件的字节。除了在文件系统上手动重构文件外,如何从文件中获取getName()、getPath()等信息?

换句话说:

  1. 我从机器 A 上的文件开始
  2. 我使用 FileUtils 将文件转成字节数组
  3. 我通过网络将该文件传输到机器 B
  4. 在机器 B 上,我想将该字节 [] 重构为文件并运行 getName() 等方法

以下不起作用

  1. (文件)字节 --> 不转换
  2. ((File) ((Object) bytes))) --> 也不转换

我真的不想在文件系统上创建一个新的临时文件,尽管我知道有可用的静态 File.createTemp 可以做到这一点。我宁愿把它保存在内存中,从 byte[] 数组构造一个新的 File 对象,获取我需要的信息并完成。

实际上,更好的是一个 API,它将获取 byte[] 并从中通过解析位直接获取文件名。

【问题讨论】:

  • FileUtils 是否输出有关文件和/或文件内容的数据?
  • FileUtils 会将字节[] 转储到文件系统本身上的实际文件中。但是,我只想从内存中访问文件。即,只需获取 .getName() 内容。见 FileUtils.writeByteArrayToFile(file, data);
  • 您必须发送名称/路径/等。与字节一起通过网络。
  • @Kevin 不是存储在 byte[] 中的文件名信息吗?
  • 没有。 byte[] 包含文件的内容,不多也不少。好吧,如果阅读有问题,可能会更少。它与任何其他 byte[] 没有什么不同。

标签: java arrays apache file apache-commons


【解决方案1】:

FileUtils.readFileToByteArray返回的byte[]只是文件内容,没有别的。

您应该创建自己的可序列化类,其中包括两个字段:byte[] 用于文件内容,java.io.File 包含您需要的所有其他内容。然后您将您的类序列化/反序列化为byte[],然后传输。

【讨论】:

    【解决方案2】:

    文件内容和文件名是两个独立的东西。虽然特定的文件格式可以有元数据来存储内容中的名称(类似于例如 MP3 的 ID3 标签),但在典型的文件中,无法从byte [] contents 中知道名称。即使它是来自远程机器的名称,也可能在目标平台上无效。

    如果你想要名字,你需要单独转移它。

    【讨论】:

      【解决方案3】:

      正如其他人所说的那样,FileUtils 正在为您提供文件的内容。

      除了文件内容之外,您还想传输文件元数据(文件名/路径名、创建/修改/访问时间、所有权、权限、大小和(可能)校验和)。您可以这样做的一种方法是将文件放入容器(tar、shar、zip 等)中,该容器提供文件元数据以及文件内容。或者您可以使用文件传输协议来传输此元数据。

      【讨论】:

        【解决方案4】:

        您也可以发明自己的协议来使用文件字节发送信息 我的如下

        file Name 然后是分隔符,然后是 file Path,然后是分隔符,然后是 file bytes

        separator 应该是不能用作文件路径的文件名的字符(即 |、:、& ...)

        deassemble 在接收客户端以相反的顺序分解字节并提取发送的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-03
          • 2019-09-23
          • 2013-10-14
          • 2012-04-19
          • 2019-12-22
          • 1970-01-01
          • 2017-09-09
          • 2012-08-13
          相关资源
          最近更新 更多