java.io.IOException:无效的参数和太多打开的文件

时间:2011-05-19 23:55:45

标签: java exception io

我使用下载种子的库。但今天发生了一些错误(日志):

Could not create temp files
java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l104.zip (Too many open files)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.(RandomAccessFile.java:212)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/Degrassi.Junior.High.S01-S03.INTERNAL.DVDRip.XviD-FFNDVD/Degrassi.Junior.High.S01.INTERNAL.DVDRip.XviD-FFNDVDDegrassi.Junior.High.S01E10.INTERNAL.DVDRip.XviD-FFNDVDdegrassi.junior.high.s01e10.internal.dvdrip.xvid-ffndvd.r10 (Too many open files)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.(RandomAccessFile.java:212)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l108.zip (Too many open files)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.(RandomAccessFile.java:212)
    at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
    at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
    at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
等等,日志继续。我发现这个文件存在,这里是发生错误的代码的一部分:
    /**
     * Check the existence of the files specified in the torrent and if necessary,
     * create them
     *
     * @return int
     * @todo Should return an integer representing some error message...
     */
    public synchronized int checkTempFiles() {
        String saveas = Constants.SAVEPATH; // Should be configurable
        if (this.nbOfFiles > 1)
            saveas += this.torrent.saveAs + "/";
        else
        {
            this.torrent.saveAs = this.torrent.name.get(0).toString();
        }
        new File(saveas).mkdirs();
        for (int i = 0; i < this.nbOfFiles; i++) {
            File temp = new File(saveas + ((String) (this.torrent.name.get(i))));
            try {
                this.output_files[i] = new RandomAccessFile(temp, "rw");
                this.output_files[i].setLength((Integer)this.torrent.length.get(
                        i));
            } catch (IOException ioe) {
                System.err.println("Could not create temp files");
                ioe.printStackTrace();
            }
        }
        return 0;
    }
在这里打电话:
        // запуск закачки
        dm.startListening(49152, 65535);
        dm.startTrackerUpdate();

    while(true)
    {
        if(dm.isComplete())
        {
            break;
        }

        try
        {
            Thread.sleep(100);
        }
        catch(InterruptedException ex)
        {
            Logger.getLogger(DownloadTorrent.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    dm.stopTrackerUpdate();
    dm.closeTempFiles();</code></pre>

And upper code called here: ex = Executors.newFixedThreadPool(3);

for(String torrentFile : torrentFiles) { ex.submit(new DownloadTorrent("/root/TorrentStealer/torrents/" + torrentFile)); } // ожидание завершения потоков загрузки файлов торрентов ex.shutdown(); try { ex.awaitTermination(30, TimeUnit.MINUTES); } catch(InterruptedException ex1) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex1); } ex.shutdownNow();</code></pre>

以下是修复«太多打开文件»的说明: http://wiki.magnolia-cms.com/display/WIKI/Too+Many+Open+Files

我设置了999999个最大文件,修复了一段时间的错误,然后设置了9999999进行测试,并没有真正起作用,所有时间错误都发生了。服务器重启后,在运行后的一刻不能打开9999999个文件!

所以男人我不知道该怎么办。你能救我吗?

以下是发生异常时打开的文件数: T217:〜#lsof | wc -l 结果是:2708

2 个答案:

答案 0 :(得分:1)

stacktrace指示java.io.RandomAccessFile.setLength()接受long数据类型时出错。在您的代码中,您将this.torrent.length.get(i)的结果转换为Integer。

does this.torrent.length.get(i)返回什么?

当您将数据从返回转换为Integer时,可能会出现缩小规模的问题,可能会返回导致RandomAccessFile.setLength()错误输出的负数。

答案 1 :(得分:1)

java.io.IOException: Invalid argument
    at java.io.RandomAccessFile.setLength(Native Method)

您传递的是负值。将值转换为long而不是Integer。

java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l104.zip (Too many open files)

您没有关闭文件。您打开的每个需要关闭的资源必须在finally块中关闭,以确保无法逃脱。