android,libaums:java.io.IOException:无法写入设备

时间:2017-07-26 14:10:45

标签: android sockets

我正在使用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()&gt; 1)我收到如下错误消息:

  

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

无法找到此错误消息的含义。 谢谢你的帮助!

2 个答案:

答案 0 :(得分: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 他解释说他发现端点停滞不前,情况也是如此。不幸的是,我真的不知道如何重置这个失速状态,他也没有真正解释它。“

希望这有帮助!

答案 1 :(得分:0)

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

使用FileInputStream类为InputStream解析。