Nano Hash - криптовалюты, майнинг, программирование

FindBugs — может не закрыть поток при использовании ObjectOutputStream

У меня есть этот фрагмент кода, который должен записать Ojbect в поток массива байтов:

     static byte[] toBytes(MyTokens tokens) throws IOException {
        ByteArrayOutputStream out = null;
        ObjectOutput s = null;
        try {
            out = new ByteArrayOutputStream();
            try {
                s = new ObjectOutputStream(out);
                s.writeObject(tokens);
            } finally {
                try {
                    s.close();
                } catch (Exception e) {
                    throw new CSBRuntimeException(e);
                }             
            }
        } catch (Exception e) {
            throw new CSBRuntimeException(e);
        } finally {
            IOUtils.closeQuietly(out);
        }
        return out.toByteArray();
    }

Однако FindBugs продолжает жаловаться на строку:

s = new ObjectOutputStream(out);

что «может не закрыться поток» — BAD_PRACTICE — OS_OPEN_STREAM. Кто-нибудь может помочь?



Ответы:


1

Я думаю, что FindBugs не понимает, что IOUtils.closeQuietly(out) закрывается.

В любом случае достаточно закрыть ObjectOutputStream, и он закроет базовый ByteArrayOutputStream. Это реализация ObjectOutputStream.close

public void close() throws IOException {
    flush();
    clear();
    bout.close();
}

так что вы можете упростить свой код

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream s = new ObjectOutputStream(out);
    try {
        s.writeObject(1);
    } finally {
        IOUtils.closeQuietly(s);
    }

или если вы находитесь в Java 7

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try (ObjectOutputStream s = new ObjectOutputStream(out)) {
        s.writeObject(1);
    }
21.01.2013
  • Я уже пробовал это, но IOUtils.closeQuietly() просто не работает с ObjectOutput, поэтому не может закрыть s. Разрешить только OutputStream... 21.01.2013
  • Попробуйте снова. Оно работает. ObjectOutputStream расширяет OutputStream, поэтому он является OutputStream 21.01.2013
  • Я так не думаю: не удается найти символ: метод closeQuietly (java.io.ObjectOutput) расположение: класс org.apache.commons.io.IOUtils 21.01.2013
  • Возможно, s определен как тип ObjectOutput, вызывающий это 21.01.2013
  • правильно, используйте ObjectOutputStream напрямую, ObjectOutput — это интерфейс 21.01.2013
  • У нас есть Java 8, но мы не можем использовать try с ресурсами из-за ошибки Sonar, но IOUtils.closeQuietly(s); помогло, спасибо. 17.02.2017

  • 2

    Это означает, что s.close() попытается закрыть базовый поток, но может не сделать этого. Поэтому, чтобы быть уверенным, вы также должны закрыть его самостоятельно. Попробуйте добавить out.close() и посмотрите, исчезнет ли предупреждение.

    21.01.2013
  • Конечно, FindBugs выделит строку out = new ByteArrayOutputStream();? 21.01.2013
  • Он выделяет строку s = new ObjectOutputStream(out);, потому что внутри нее находится out.close(). Это просто предупреждение о том, что это может привести к ошибкам. Если бы этой строки не существовало, он не увидел бы никаких предупреждений. 21.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..