不下载文件

时间:2012-07-26 09:01:35

标签: java sockets inputstream

我使用以下代码使用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);
} 

5 个答案:

答案 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++)