1

我正在尝试将文件的内容作为字节数组获取。

public static void main(String[] args) {

    final IServiceClient client = StorageConsumerProvider.getStorageServiceClient("dev");

    String name = new File("C:\\Storage\\Model-1.0.0.jar").getName();

    StorageObjectIdentifier objIdentifier = new StorageObjectIdentifier("Model", "1.0.0", name);

// I need to pass the bytes here
    client.createObject(objIdentifier, name.getBytes());

}

界面是这样的——

public void createObject(StorageObjectIdentifier objIdentifier, byte[] obj)

createObject方法接受两个参数,其中一个是 -文件内容作为字节数组

我不确定我应该如何将它作为字节数组传递?有人可以帮我吗?在我的情况下,该文件是一个 jar 文件。

4

4 回答 4

1

您必须使用以下函数手动加载 bytearray 中的所有文件内容:

public final static byte[] load(FileInputStream fin) throws Exception
{
      ByteArrayOutputStream baos = new ByteArrayOutputStream();

      int readCnt = fin.read(readBuf);
      while (0 < readCnt) {
        baos.write(readBuf, 0, readCnt);
        readCnt = fin.read(readBuf);
      }

      fin.close();

      return bout.toByteArray();
  }

但如果文件很小,则可以使用,对于大文件,您将运行到 NPE。
更好的选择是改变你的接口传递InputStream而不是byte[]让 intf 实现者决定如何操作。

于 2013-08-21T21:05:47.240 回答
1

好吧,目前您只是传递文件名称的字节数组表示形式。您需要打开文件并阅读它。您可以使用FileInputStreametc 来做到这一点,但如果您乐于使用Guava,那么通过以下方式可以轻松实现Files.toByteArray()

File file = new File("C:\\Storage\\Model-1.0.0.jar");
byte[] data = Files.toByteArray(file);
StorageObjectIdentifier objIdentifier =
    new StorageObjectIdentifier("Model", "1.0.0", name);

client.createObject(objIdentifier, data);
于 2013-08-21T21:06:00.447 回答
1

您正在将一个包含文件名称的字节数组传递给您的 createObject 方法。要首先传递包含文件内容的字节数组,您必须将文件读入字节数组。

使用 FileReader 或 FileInputStream,创建一个传递文件名或 File 对象的实例,然后使用其中一种 read() 方法将字节读入数组。

于 2013-08-21T21:15:18.697 回答
1

您可以使用BufferedInputStream缓冲将文件加载为字节流。

File iFile = new File("C:\\Storage\\Model-1.0.0.jar");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(iFile));

int read = 0;
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; // buffer size
while ((read = bis.read(buffer)) != -1) {
    os.write(buffer, 0, read);
}
bis.close();

StorageObjectIdentifier objIdentifier =
                        new StorageObjectIdentifier("Model", "1.0.0", iFile.getName());
client.createObject(objIdentifier, os.toByteArray());

或者,使用来自Apache Commons IO的FileUtils

client.createObject(objIdentifier, FileUtils.readFileToByteArray(iFile));
于 2013-08-21T21:17:16.413 回答