我使用以下代码使用socket而不是url.openconnection()从指定的url下载文件; 下载后我检查它不工作...当我用编辑器打开文件时它是完全空白的文件内没有数据(空文件)需要建议??? ... ...
try {
String address="http://tineye.com/images/widgets/mona.jpg";
URL url_of_file=new URL(addres);
String hostaddress=url_of_file.getHost();
Socket mysocket=new Socket(hostaddress, 80);
System.out.println("Socket opened to " + hostaddress + "\n");
String file=url_of_file.getFile();
System.out.println(" file = "+file);
OutputStreamWriter osw=new OutputStreamWriter(mysocket.getOutputStream());
osw.write("GET " + file + " HTTP/1.0\r\n\n");
osw.flush();
dis = new DataInputStream(mysocket.getInputStream());
fileData = new byte[7850];
for (int x = 0; fileData[x] > 0; x++){
fileData[x] = (byte) dis.read();
}
// close the data input stream
fos = new FileOutputStream(new File("C:\\Users\\down-to\\filedownloaded.jgp")); //create an object representing the file we want to save
fos.write(fileData); // write out the file we want to save.
dis.close();
fos.close();
} catch (UnknownHostException ex) {
Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
}
答案 0 :(得分:5)
这是:
for(int x=0;fileData[x]>0;x++){
对吗?看起来你正试图根据流的内容进行破解。正如Flavio所指出的那样,由于新创建了数组,因此该语句立即失效。
我认为您更有可能阅读指定的内容长度,或者直到达到流的末尾。
事实上,我更倾向于使用现有的HttpClient并绕过上述所有内容。编写可靠的HTTP代码并不像第一次出现那样简单,第三方库会为您带来很多悲伤。
答案 1 :(得分:1)
你做错了一些事。首先,它重新发明了轮子,因为已经存在许多HTTP库。
然后你正在制作一个无效的HTTP请求。就像HTTP 1.1一样,此类请求的标头应以\r\n
结束,而您只发送\n
:
osw.write("GET " + file + " HTTP/1.0\r\n\n");
服务器可能会等到你完成请求(它仍然在等待完整的请求,以双\r\n
结束)或抛出错误,因为它不期望第二个\n
。
然后你没有读取响应头,这可能表明预期会有多少数据。很有趣的是你初始化一个足够大的字节数组(你要下载的文件是7850字节大),但是你不能对网络上的每个文件进行硬编码,因为你很快就会耗尽磁盘存储空间他们。
因此,要么读取并解析Content-length
标头,要么等待服务器在发送所有数据后关闭连接(这是HTTP 1.0中的两个选项)。
最后,你没有正确地阅读答案,正如其他人所指出的那样。请修复这些基础知识,然后您可以尝试存储响应。现在你的文件被零填充。
答案 2 :(得分:0)
for
条件的含义是什么?
for(int x=0;fileData[x]>0;x++){
刚刚创建了fileData数组,所以它填充了零。 fileData[x]>0
立刻就是假的。
答案 3 :(得分:0)
通过修改你的代码,我能够用数据填充文件,这就是我得到的:
错误:访问被拒绝
错误
访问被拒绝
- 访问权限 安全策略拒绝
安全策略 您的网络目前无法允许您的请求被允许。 如果您认为不正确,请与您的管理员联系。
try {
String address = "http://tineye.com/images/widgets/mona.jpg";
URL url_of_file = new URL(address);
String hostaddress = url_of_file.getHost();
Socket mysocket = new Socket(hostaddress, 80);
System.out.println("Socket opened to " + hostaddress + "\n");
String file = url_of_file.getFile();
System.out.println(" file = " + file);
OutputStreamWriter osw = new OutputStreamWriter(mysocket.getOutputStream());
osw.write("GET " + file + " HTTP/1.0\r\n\n");
osw.flush();
DataInputStream dis = new DataInputStream(mysocket.getInputStream());
byte[] fileData = new byte[7850];
FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\aboutros\\Desktop\\filedownloaded.jgp")); // create an object representing the file we want to save
while (dis.read(fileData) >= 0) {
fos.write(fileData); // write out the file we want to save.
}
dis.close();
fos.close();
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
答案 4 :(得分:0)
这个条件是否正确?如果是,这个条件背后的意义是什么?
for(int x=0;fileData[x]>0;x++)