我尝试从url获取图片然后保存到本地,但是图片显示不正常,而且貌似图片大小比原图会大了一点,这是为什么?
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class DownloadImage {
public static void main(String[] args){
BufferedReader bufferedReader = null;
FileOutputStream fileOutputStream = null;
URL imageUrl = null;
String str = null;
URLConnection urlConnection = null;
InputStream urlInputStream = null;
byte[] byteArray = new byte[1024];
File imageFile = null;
try {
bufferedReader = new BufferedReader(new FileReader("resources/imageURL")); //这个文件的内容是url地址
while((str = bufferedReader.readLine()) != null){
imageUrl = new URL(str);
urlConnection = imageUrl.openConnection();
urlConnection.connect();
urlInputStream = urlConnection.getInputStream();
imageFile = new File("resources/image/" + str.substring(str.lastIndexOf("/")+1));
if(!imageFile.exists()) imageFile.createNewFile();
fileOutputStream = new FileOutputStream(imageFile);
while(urlInputStream.read(byteArray) != -1){
fileOutputStream.write(byteArray);
}
fileOutputStream.close();
urlInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Done!");
}
}
}
楼上解释了图片大小的问题,我来说一下可能导致你图片显示不正常的问题。
我看见你的buffer设置的长度是1024,那么会出现什么情况呢?假设一块图片是1028字节,第一次写入buffer是1024全写满,这时你把buffer写入文件是没问题的,但第二次时只读出4个字节,也就是剩下的1020个字节是上次的。可是你仍然把整个buffer都写进文件里,显然是不妥的。
试试将
while(urlInputStream.read(byteArray) != -1){
fileOutputStream.write(byteArray);
}
改成
int ch = 0;
while((ch = urlInputStream.read(byteArray)) != -1){
fileOutputStream.write(byteArray,0,ch);
}
看看如何
网站在加载或显示这个图片的时候可能会对图片大小进行处理,所以不一定是原图的大小,你取到得图片才是真正的原图
byte[] byteArray = new byte[这个数字暂时改成大一点的试试,比一张图片稍大即可
]
你说图片比原来图片大一点,你直接点图片url 右键另存为,然后跟你代码爬下来的比较一下看看。
如果不一样的话我觉得很可能是因为二进制没写好的问题。