8

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

换句话说:

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

以下不起作用

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

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

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

4

4 回答 4

6

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

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

于 2013-11-11T17:38:08.017 回答
1

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

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

于 2013-11-11T17:38:44.577 回答
0

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

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

于 2013-11-11T17:46:36.653 回答
0

您也可以发明自己的协议来发送带有文件 Bytes Mine 的信息,如下所示

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

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

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

于 2016-09-11T14:53:45.463 回答