Tôi đang cố gắng tìm ra lý do tại sao đoạn mã đặc biệt này không hoạt động đối với tôi. Tôi đã có một applet đó là nghĩa vụ phải đọc một pdf. Và hiển thị nó với một thư viện pdf renderer, nhưng đối với một số lý do khi tôi đọc trong các tập tin .pdf mà ngồi trên máy chủ của tôi, họ sẽ bị hỏng. Tôi đã thử nghiệm nó bằng cách viết các tập tin trở lại một lần nữa.Java: Đọc một tệp pdf từ URL vào Byte array/ByteBuffer trong applet
Tôi đã thử xem applet trong cả IE và Firefox và các tệp bị hỏng xảy ra. Điều thú vị là, khi tôi cố gắng xem applet trong Safari (đối với Windows), tập tin thực sự là tốt! Tôi hiểu JVM có thể khác, nhưng tôi vẫn bị mất. Tôi đã biên soạn trong Java 1.5. Các JVM là 1,6. Đoạn trích đọc tệp dưới đây.
public static ByteBuffer getAsByteArray(URL url) throws IOException {
ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
URLConnection connection = url.openConnection();
int contentLength = connection.getContentLength();
InputStream in = url.openStream();
byte[] buf = new byte[512];
int len;
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
tmpOut.write(buf, 0, len);
}
tmpOut.close();
ByteBuffer bb = ByteBuffer.wrap(tmpOut.toByteArray(), 0,
tmpOut.size());
//Lines below used to test if file is corrupt
//FileOutputStream fos = new FileOutputStream("C:\\abc.pdf");
//fos.write(tmpOut.toByteArray());
return bb;
}
Tôi phải thiếu thứ gì đó và tôi đã đập đầu để cố gắng tìm ra. Bất kỳ trợ giúp nào cũng được đánh giá rất cao. Cảm ơn.
Edit: Để làm rõ thêm hoàn cảnh của tôi, sự khác biệt trong các tập tin trước khi tôi đọc sau đó với đoạn và sau đó, là những cái tôi ra sau khi đọc nhỏ hơn đáng kể so với ban đầu là. Khi mở chúng, chúng không được nhận dạng dưới dạng tệp .pdf. Không có ngoại lệ được ném mà tôi bỏ qua, và tôi đã cố gắng đỏ bừng vô ích.
Đoạn mã này hoạt động trong Safari, nghĩa là các tệp được đọc toàn bộ, không có sự khác biệt về kích thước và có thể được mở bằng bất kỳ trình đọc .pdf nào. Trong IE và Firefox, các tệp luôn bị hỏng, luôn có cùng kích thước nhỏ hơn.
Tôi đã theo dõi biến len (khi đọc tệp 59kb), hy vọng xem có bao nhiêu byte được đọc tại mỗi vòng lặp. Trong IE và Firefox, tại 18kb, in.read (buf) trả về -1 như thể tệp đã kết thúc. Safari không làm điều này.
Tôi sẽ tiếp tục và tôi đánh giá cao tất cả các đề xuất từ trước tới nay.
Khi bạn nói tệp bị hỏng, bạn có ý nghĩa gì? Nếu bạn so sánh với bản gốc, điều gì khác biệt? – Eddie
Vui lòng trả lời câu hỏi thứ hai của Eddie. Ngoài ra, giá trị của contentLength có chính xác không? – jdigital