Лучший способ закрыть поток во время массовой загрузки - PullRequest
0 голосов
/ 15 января 2019

Я загружаю массовые файлы (скажем, 50000) в Box через API Java Box. Для этого мы вызываем метод uploadFile 50000 раз. Метод также создает и закрывает поток ввода файла.

Есть ли способ сохранить поток открытым до полной загрузки? Даже если я закрою поток в блоке finally, он будет закрывать его каждый раз, когда я вызываю метод.

private static String uploadFile(String pathFileName, BoxAPIConnection api, BoxFolder folder) {
    boolean fileExists = false;
    String fileId = null;
    FileInputStream stream = null;
    log.debug("Invoked uploadFileAsBoxAppUser-uploadFile :" + pathFileName + ":" + api + ":" + folder);
    try {
        String fileName = pathFileName.substring(pathFileName.lastIndexOf("\\") + 1, pathFileName.length());
        log.debug("fileName :" + fileName);

        for (BoxItem.Info itemInfo : folder) {
            if (itemInfo instanceof BoxFile.Info) {
                BoxFile.Info fileInfo = (BoxFile.Info) itemInfo;
                if (fileName.equals(fileInfo.getName())) {
                    fileExists = true;
                    fileId = fileInfo.getID();
                    log.debug("fileExists in Destination box Folder fileID " + fileId);
                }
            }
        }

        if (!fileExists) {
            log.debug("uploading new file: " + fileName);
            stream = new FileInputStream(pathFileName);
            BoxFile.Info boxInfo = folder.uploadFile(stream, pathFileName);
            fileId = boxInfo.getID();
        } else {
            log.debug("uploading new version of file: " + fileName);
            BoxFile file = new BoxFile(api, fileId);
            stream = new FileInputStream(pathFileName);
            file.uploadVersion(stream);
        }
    } catch (IOException e) {
        log.debug("Exception in uploadFileAsBoxAppUser :" + e);
    }
    finally {
        if (stream != null)
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    return fileId;
}
...