这是有效的整个功能:
public static void downloadPDF(String link) {
try {
System.out.println("opening connection");
URL url = new URL(link);
InputStream in = url.openStream();
File f = new File("Resume.pdf");
FileOutputStream fos = new FileOutputStream(f);
System.out.println("reading from resource and writing to file...");
int length = -1;
byte[] buffer = new byte[1024];// buffer for portion of data from connection
while ((length = in.read(buffer)) > -1) {
fos.write(buffer, 0, length);
}
System.out.println(f.getName());
Desktop.getDesktop().open(f);
fos.close();
in.close();
System.out.println("File downloaded");
} catch (IOException e) {
e.printStackTrace();
}
}
问题:请向我解释下面的代码。我想了解它。它一行一行。谢谢。
FileOutputStream fos = new FileOutputStream(f);
System.out.println("reading from resource and writing to file...");
int length = -1;
byte[] buffer = new byte[1024];// buffer for portion of data from connection
while ((length = in.read(buffer)) > -1) {
fos.write(buffer, 0, length);
}
谢谢!如果您有任何提示可以提供更好的方法,那将会很有帮助。我尝试使用apache pdfbox,但在某些方面并不成功。我会再试一次,但同时这对我很感兴趣。
答案 0 :(得分:0)
我不完全确定你究竟在问什么,所以我只能用超级基本术语来解释它
打开输出流 - 这基本上是一个文件的“连接”,允许您将信息放入其中。
FileOutputStream fos = new FileOutputStream(f);
计算机不喜欢一次读取大量内容。相反,大多数程序将分批阅读,有点像你一次从技术上阅读一本书的一页,而不是一次阅读所有页面。这里缓冲区是1024字节,这意味着文件读取长度为1024字节。因此,如果文件是2048字节,那么我们将从中读取两次。
int length = -1;
byte[] buffer = new byte[1024];
所以在这里我们将文件读入缓冲区。这仅限于缓冲区大小,但如果没有足够的时间来完全填充它就可以了。如果没有什么可以阅读,那么read
将返回-1
,我们就会完成阅读。
while ((length = in.read(buffer)) > -1) {
现在我们从文件中读取的内容(当前位于buffer
数组中)将其写入输出流。 0, length
表示我们从索引0
写入缓冲区中的索引length
,并将该信息发送到我们正在创建的文件中。
fos.write(buffer, 0, length);
}