java - 使用 java.nio 时抛出 IllegalArgumentException

标签 java android nio

尝试通过 url 下载文件。为此,使用 java.nio 库。上面的代码适用于 sdk 24 及以上版本,但对于 android sdk 23 及以下版本会出现 IllegalArgumentException。我在尝试传输数据时收到错误。亲爱的 friend ,请您澄清一下问题所在。

    private void downloadFile(final String itemUrl) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                ReadableByteChannel readableByteChannel = null;
                FileOutputStream fOutStream = null;

                String root = 
                getApplicationContext().getApplicationInfo().dataDir;
                File myDir = new File(root + "/downloadedSongs");
                if (!myDir.exists()) {
                myDir.mkdirs();
                }

                File file = new File(myDir, itemTitle);
                if (file.exists()) {
                    file.delete();
                }

                try {
                    URL url = new URL(itemUrl);
                    readableByteChannel = 
                    Channels.newChannel(url.openStream());
                    fOutStream = new FileOutputStream(file);
      fOutStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);

                } catch (IOException e) {
                    orderAction = Enums.OrderAction.Delete;
                } catch (IllegalArgumentException e) {
                    orderAction = Enums.OrderAction.Delete;
                    Crashlytics.logException(e);
                } finally {
                    try {
                        if (fOutStream != null) {
                            fOutStream.close();
                        }
                        if (readableByteChannel != null) {
                           readableByteChannel.close();
                        }
                    } catch (IOException ioExObj) {
                        orderAction = Enums.OrderAction.Delete;
                    }
                    closeNotification(orderAction);
                }
            }
    }).start();
}

enter image description here

致命异常:java.lang.IllegalArgumentException:position=0 count=9223372036854775807 at java.nio.FileChannelImpl.transferFrom(FileChannelImpl.java:370) at am.itsoft.youtomp3.services.DnlService$1.run(DnlService.java :169) 在 java.lang.Thread.run(Thread.java:818)

最佳答案

原因就在这个参数中:Long.MAX_VALUE

正确代码:

FileChannel destChannel = fOutStream.getChannel();
long blockSize;
if (Build.VERSION.SDK_INT > 23) {
  long blockSize = Long.MAX_VALUE;
} else {
  long blockSize = 8*1024;
}
long position = 0;
long loaded;
while ((loaded = destChannel.transferFrom(readableByteChannel, position, blockSize)) > 0) {
   position += loaded;
}

关于java - 使用 java.nio 时抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696035/

相关文章:

java - 获取 Java 中 Enum 常量的所有值? (是否有内置方法可以做到这一点,或者我需要编写自己的 setter/getter ?)

java - android - 计时器不从零开始

java - java中2个(可能很大)文件的快速模块化加法

java - Jetty 将错误的 NIO 参数传递给 Java(或 JVM 错误)

java - 如何使日历根据优先级列出事件

java - WebDriver 等待 JQuery 完成

java - AlertDialog.Builder 无法解析为类型

android - Android 4.3 上的系统跟踪

android - 应用程序在收到广播时自动打开

java - 当SelectableChannel注册方法时会得到CancelledKeyException