如何从文件的字节数组中获取文件名?

时间:2013-11-11 17:26:19

标签: java arrays apache file apache-commons

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

换句话说:

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

    1. (文件)字节 - >不转换
    2. ((File)((Object)bytes))) - >不转换
    3. 我真的不想在filesytem上创建一个新的临时文件,虽然我知道有可用的静态File.createTemp。我更喜欢将它保存在内存中,从byte []数组构造一个新的File对象,获取我需要的信息并完成。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

如果您需要名称,则需要单独转移。

答案 2 :(得分:0)

正如其他人已正确说明的那样,FileUtils会为您提供该文件的内容。

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

答案 3 :(得分:0)

您还可以创建自己的协议,以便使用文件字节发送信息 我的如下

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

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

deassemble 在接收客户端时以相反的顺序反汇编字节并提取已发送的信息。