我有字节代表我通过网络传输的文件。除了在文件系统上手动重建文件外,如何从文件中获取信息,如getName(),getPath()等?
换句话说:
以下不起作用
我真的不想在filesytem上创建一个新的临时文件,虽然我知道有可用的静态File.createTemp。我更喜欢将它保存在内存中,从byte []数组构造一个新的File对象,获取我需要的信息并完成。
实际上,更好的是一个将采用byte []的API,并通过解析这些位直接获取文件名。
答案 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
在接收客户端时以相反的顺序反汇编字节并提取已发送的信息。