为啥文件中没有写入数据?

Posted

技术标签:

【中文标题】为啥文件中没有写入数据?【英文标题】:Why no data is being written in the file?为什么文件中没有写入数据? 【发布时间】:2021-09-08 16:44:58 【问题描述】:

我创建了一个从 url 下载图像文件的应用程序,但文件中没有任何数据

图片网址:https://instagram.fidr1-1.fna.fbcdn.net/v/t51.2885-15/e35/190664842_184685183538740_5039921250568173600_n.jpg?tp=1&_nc_ht=instagram.fidr1-1.fna.fbcdn.net&_nc_cat=108&_nc_ohc=RrEU4lTwYCwAX-vgVQ4&edm=AABBvjUBAAAA&ccb=7-4&oh=3ac34be54793fa59134380fd9e0bd617&oe=60DCB7E6&_nc_sid=83d603

代码:

@Override
protected Void doInBackground(String... strings) 

    try 
        URL url = new URL(strings[0]);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestProperty("User-Agent", "Mozilla/5.0 
        (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) 
        Gecko/20100316 Firefox/3.6.2");
        con.setRequestMethod("GET");
        con.setDoOutput(true);
        con.connect();

        File file = Environment.getExternalStorageDirectory();
        File f1 = new File(file, "_Url download");
        if(!f1.exists())
            f1.mkdir();
        

        fileName = System.currentTimeMillis() + ".jpg";

        File f2 = new File(f1, fileName);
        f2.createNewFile();

        InputStream er = con.getErrorStream();
        Log.i("ErrorCode", con.getResponseCode()+"");
        Log.i("ErrorMessage", con.getResponseMessage());
        Log.i("ErrorStream", er+"");

        InputStream in = con.getInputStream();
        FileOutputStream out = new FileOutputStream(f2);

        byte[] buffer = new byte[1024];
        int len;

        System.out.println(Arrays.toString(buffer));

        while((len = in.read(buffer, 0, 1024)) > 0) 
            out.write(buffer, 0, len);
        

        out.close();
        in.close();

     catch (MalformedURLException e) 
        e.printStackTrace();
     catch (ProtocolException e) 
        e.printStackTrace();
     catch (IOException e) 
        Log.i("IOException", e.toString());
    
    return null;

结果:

Image of file path where the file is being saved

编辑

下载按钮:

downloadButton.setOnClickListener(v -> 
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)  != PackageManager.PERMISSION_GRANTED) 
                ActivityCompat.requestPermissions(this, new String[]Manifest.permission.READ_EXTERNAL_STORAGE, 101);
            
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)  != PackageManager.PERMISSION_GRANTED) 
                ActivityCompat.requestPermissions(this, new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE, 102);
            
            else if(ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET)  != PackageManager.PERMISSION_GRANTED) 
                ActivityCompat.requestPermissions(this, new String[]Manifest.permission.INTERNET, 103);
            
            else 
                BackgroundTask task = new BackgroundTask(this);
                task.execute(et.getText().toString());
            
        );

清单权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

EDIT2

日志:

2021-06-26 09:26:25.532 26760-26890/com.example.urldownload I/ErrorCode: 400

2021-06-26 09:26:25.533 26760-26890/com.example.urldownload I/ErrorMessage: Bad Request

2021-06-26 09:26:25.533 26760-26890/com.example.urldownload I/Errorstream: buffer(com.android.okhttp.internal.http.Http1xStream$FixedLengthSource@fbb2c70).inputStream()

2021-06-26 09:26:25.534 26760-26890/com.example.urldownload I/IOException: java.io.FileNotFoundException: https://instagram.fidr1-1.fna.fbcdn.net/v/t51.2885-15/e35/190664842_184685183538740_5039921250568173600_n.jpg?tp=1&_nc_ht=instagram.fidr1-1.fna.fbcdn.net&_nc_cat=108&_nc_ohc=RrEU4lTwYCwAX-vgVQ4&edm=AABBvjUBAAAA&ccb=7-4&oh=3ac34be54793fa59134380fd9e0bd617&oe=60DCB7E6&_nc_sid=83d603

【问题讨论】:

首先,您的文件名中有一个空格。可能不是你想要的。 System.currentTimeMillis() + " .jpg" 也许您没有写入外部存储的权限?检查权限 按原样使用您的代码,我可以下载图像文件。你能确保后台任务按预期运行吗?此外,你正在吃掉所有的例外。如果有任何错误,您将不会知道它们。可能会将它们翻译给调用者,以便您可以看到后台线程。 @Maverick 为什么会为正常工作的 url 抛出 java.io.FileNotFound 异常。 抱歉,没看懂您的评论。是在后台线程中抛出 FileNotFound 吗? 【参考方案1】:

看看这个SO answer。 setDoOutput(true) 似乎将请求方法更改为 POST。

【讨论】:

那是什么?请分享! 我将 setDoOutput(true) 更改为 setDoOutput(false),并且成功了。 如果有帮助,您能否将答案标记为已接受?

以上是关于为啥文件中没有写入数据?的主要内容,如果未能解决你的问题,请参考以下文章

php fwrite() 没有完成将字符串数据写入文件,为啥?

数据库异常信息为啥没有写入log4j日志文件中

为啥用C#在磁盘上写入文件后内存没有释放

python处理完CSV数据后重新写入新CSV文件,为啥新文件用记事本打开没有双引号?该怎么解决?谢谢

为啥我的网站没有加载,而是出现此错误 - “Smarty:无法写入文件”?

JAVA write为啥无法写入数据?