gpt4 book ai didi

java - 从 URL 读取奇怪的 byte[] 行为

转载 作者:可可西里 更新时间:2023-11-01 16:52:21 25 4
gpt4 key购买 nike

最后,我的终极目标是:

  • 从 URL 读取(这个问题是关于什么的)
  • 将检索到的 [PDF] 内容保存到数据库中的 BLOB 字段(已经确定)
  • 读取 BLOB 字段并将该内容附加到电子邮件中
  • 无需访问文件系统

以下方法的目标是获取一个 byte[] 可以在下游用作电子邮件附件(避免写入磁盘):

public byte[] retrievePDF() {

HttpClient httpClient = new HttpClient();

GetMethod httpGet = new GetMethod("http://website/document.pdf");
httpClient.executeMethod(httpGet);
InputStream is = httpGet.getResponseBodyAsStream();

byte[] byteArray = new byte[(int) httpGet.getResponseContentLength()];

is.read(byteArray, 0, byteArray.length);

return byteArray;
}

对于特定的 PDF,getResponseContentLength() 方法返回 101,689 作为长度。 奇怪 部分是,如果我设置一个断点并询问 byteArray 变量,它有 101,689 个字节元素,但是,在字节 #3744 之后数组的剩余字节全为零 (0)。 生成的 PDF 无法被 PDF 阅读器客户端(如 Adob​​e Reader)读取。

为什么会这样?

通过浏览器检索相同的 PDF 并保存到磁盘,或使用类似以下的方法(我在 answer to this StackOverflow post 之后设计),生成可读的 PDF:

public void retrievePDF() {
FileOutputStream fos = null;
URL url;
ReadableByteChannel rbc = null;

url = new URL("http://website/document.pdf");

DataSource urlDataSource = new URLDataSource(url);

/* Open a connection, then set appropriate time-out values */
URLConnection conn = url.openConnection();
conn.setConnectTimeout(120000);
conn.setReadTimeout(120000);

rbc = Channels.newChannel(conn.getInputStream());

String filePath = "C:\\temp\\";
String fileName = "testing1234.pdf";
String tempFileName = filePath + fileName;

fos = new FileOutputStream(tempFileName);
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
fos.flush();

/* Clean-up everything */
fos.close();
rbc.close();
}

对于这两种方法,在 Windows 中执行右键单击 > 属性... 时生成的 PDF 的大小为 101,689 字节。

为什么字节数组实际上会在中途“停止”?

最佳答案

InputStream.read 最多读取 byteArray.length 个字节,但可能不会读取那么多。它返回读取的字节数。您应该重复调用它以完全读取数据,如下所示:

int bytesRead = 0;
while (true) {
int n = is.read(byteArray, bytesRead, byteArray.length);
if (n == -1) break;
bytesRead += n;
}

关于java - 从 URL 读取奇怪的 byte[] 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com