【问题标题】:android, libaums: java.io.IOException: Could not write to deviceandroid,libaums:java.io.IOException:无法写入设备
【发布时间】:2017-07-26 14:10:45
【问题描述】:

我正在使用libaums 库将一些文件写入 USB 设备:

private class CopyToUsbTask extends AsyncTask<CopyToUsbTaskParam, Integer, Void> {


    List<CopyToUsbTaskParam.SingleToUsbParam> paramList;
    private CopyToUsbTaskParam.SingleToUsbParam param;

    public CopyToUsbTask() {
        Log.e(TAG, "CopyToUsbTask: Constructor");       
    }

    @Override
    protected Void doInBackground(CopyToUsbTaskParam... params) {
        paramList = params[0].paramList;
        while(!paramList.isEmpty() ){
            param = paramList.remove(0);
        long time = System.currentTimeMillis();

        queryUriMetaData(param.from);

        try {
            UsbFile root = currentFs.getRootDirectory();
            UsbFile dirTo = null;
            for(UsbFile usbFile : root.listFiles()){
                if(usbFile.getName().endsWith(param.toDir)){
                    dirTo = usbFile;
                }
            }

            UsbFile file = dirTo.createFile(param.name);  

            InputStream inputStream = activity.getContentResolver().openInputStream(param.from);
            OutputStream outputStream = UsbFileStreamFactory.createBufferedOutputStream(file, currentFs);

            byte[] bytes = new byte[1337];
            int count;
            long total = 0;

            while ((count = inputStream.read(bytes)) != -1){
                outputStream.write(bytes, 0, count);                 
            }

            outputStream.close();
            inputStream.close();
            file.close();

        } catch (IOException e) {
            Log.e(TAG, "error copying!", e);
        }
        Log.e(TAG, "copy time: " + (System.currentTimeMillis() - time));

    }return null;
    }
    @Override
    protected void onPostExecute(Void result) {

        int mid = Integer.valueOf(param.name.split("_")[0]);
        Log.e(TAG, "onPostExecute, mid= " + mid);
        Helper.deleteBookOrder(mid);        
    }
}

有时(尤其是当 paramList.size() > 1 时)我会收到如下错误消息:

java.io.IOException: 无法写入设备,结果 == -1 errno 88 非套接字上的套接字操作

找不到此错误消息的含义。 感谢您的帮助!

【问题讨论】:

    标签: android sockets


    【解决方案1】:

    我在使用这个库时遇到了类似的错误。 FileSystem.java 中有一个名为 getChunkSize() 的方法,而不是使用 1337 的静态缓冲区大小。您可以使用该方法设置缓冲区大小。这似乎为我解决了这个问题。

    我还就此问题向该库的开发人员发送了电子邮件,这是他的回复:

    “所以这是每个人有时都会遇到的奇怪错误。通常拔下并重新插入即可。 我做了一些研究,发现 -1 仅表示存在某种错误。但实际的错误在 Linux 内核的 errno 变量中。我不知道如何从 Android/Java 获取这个值。

    我还发现了这个:Android bulkTransfer return -1 when read data but there is really some data in the buffer 他解释说,他发现端点停止了,这也可能是这种情况。不幸的是,我真的不知道如何重置这个摊位状态,他也没有真正解释它。”

    希望这会有所帮助!

    【讨论】:

    • 在我设置 file.setLength 值后,错误似乎没有再次出现,如上面的链接所述。
    • 它又出现了。不那么频繁。
    • 您能否提供一些解决问题的代码,因为我遇到了同样的问题并且无法找到解决方法。你能告诉我 getChunkSize() 的用法吗?
    • 你应该可以在 libaums 的sample code 中看到这个。
    • byte[] bytes = new byte[currentFs.getChunkSize()];
    【解决方案2】:

    调用 inputStream.read(bytes) 时出现类似错误 错误:“java.io.IOException:无法写入设备,结果 == -1 errno 2 没有这样的文件或目录”。

    使用 InputStream 的 FileInputStream 类解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      相关资源
      最近更新 更多