从文件的字节数组中获取文件名的方法?

11

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

换句话说:

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

以下内容不起作用

  1. (File) bytes --> 无法转换
  2. ((File) ((Object) bytes))) --> 也无法转换

虽然我知道有可用的静态File.createTemp可以创建临时文件,但我真的不想在文件系统上创建新的临时文件。我更愿意将其保存在内存中,从字节数组构造一个新的File对象,获取我需要的信息,然后完成。

实际上,更好的是,有一个API可以通过解析位直接从字节数组获取文件名。


FileUtils会输出有关文件和/或文件内容的数据吗? - NormR
FileUtils将byte[]转储到实际文件中,在文件系统本身上。但是,我只想从内存中访问该文件。即,只需获取.getName()内容。请参见FileUtils.writeByteArrayToFile(file,data); - E.S.
你必须将名称/路径/等信息与字节一起通过网络发送。 - Kevin
@Kevin,文件名信息不是存储在byte[]中吗? - E.S.
不,byte[] 只包含文件的内容,不多也不少。如果读取时出现问题,则可能会少一些。它与任何其他 byte[] 没有区别。 - Kevin
那我犯错了。出于某种原因,我以为文件名在那里。 感谢大家的澄清,我会编写一个解决方法 :) - E.S.
4个回答

9
FileUtils.readFileToByteArray 返回的 byte[] 只包含文件内容,不含其他信息。
你需要创建自己的可序列化类,其中包括两个字段:一个用于存储文件内容的 byte[],以及一个保存其他必要信息的 java.io.File。然后将你的类序列化/反序列化成 byte[],并传输该数组。

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

0

正如其他人正确指出的那样,FileUtils 给出了文件的内容。

您想要传输文件元数据(文件名/路径名、创建/修改/访问时间、所有权、权限、大小和(可能)校验和),除了文件的内容。您可以通过将文件放入容器(tar、shar、zip 等),该容器提供文件元数据以及文件内容来实现此目的。或者您可以使用文件传输协议来传输此元数据。


0
您也可以发明自己的协议来发送文件字节中的信息,我的如下:
文件名然后是分隔符,然后是文件路径,然后是分隔符,然后是文件字节。
“分隔符”应该是不能用作文件路径的文件名字符(例如 |,:,&等)。
接收客户端时,应以相反的顺序“解构”字节并提取发送的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接