晚上心血来潮,想要换一换电脑桌面,并且想自己用Java写网络代码来下载,权当练一练手感:
很快打完代码(当然你也可以不用线程):
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Main {
public static void main(String[] args) {
new Thread(() -> {
try {
URL url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1595353623093&di=772aafbd60f0cfc4ecdc8eaa4c5a1143&imgtype=0&src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2Fd%2F571ec93e032e3.jpg");
InputStream in = url.openStream();
byte[] b = new byte[1024];
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("C://Users//xxx//Desktop//" + System.currentTimeMillis() + ".jpg"));
while (in.read(b) != -1) {
out.write(b);
}
in.close();
out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
非常简单的一份代码,就是获得一个网络输入流和一个输出文件流,将输入的字节输出到outputStream,就可以得到jpg,然而,却发现jpg与原来的jpg发生了色彩和位置上的变化:
后来将代码改成如下形式,神奇地发现图片竟然正常了:
知其然还要知其所以然,当然还是先从官方文档入手:
Java的OutputStream一共有三个重载的write方法:
这里我们可以看出一些蛛丝马迹,划红线文字就是说:write (byte[] b) 和 write(byte[] b, 0, b.length)是等效的,但是我们现在开的byte数组长是1024,write进去的时候,就可能写入了多余的0数据,这样就会导致写入数据问题。
对Java还在逐渐热身,力争通过这个暑假能做到娴熟使用Java编程,加油!