java.io.FileNotFoundException: (доступ запрещен) преобразовать массив байтов в файл изображения

У меня есть массив байтов, я хочу создать файл изображения (файл bmp) массива байтов. Я создаю папку с изображениями в src (мой путь — src/images/test.bmp). мой код находится ниже, в

Поток OutputStream = новый FileOutputStream (файл);

я получаю ошибку. в чем моя проблема? Как я могу это решить?

public static void saveImage() {
    String s="........................";
    byte[] dataCustImg = Base64.decode(s.getBytes());

    File file = new File("/images/test.bmp");
    if (file.exists()) {
        file.delete();
    }
    file = new File("/images/test.bmp");
    file.mkdirs();
    try {
        OutputStream stream = new FileOutputStream(file);

        stream.write(dataCustImg);
        stream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

Ошибка:

java.io.FileNotFoundException: \images\test.bmp (Access is denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)

person Fahim    schedule 23.05.2016    source источник
comment
Я могу решить свою проблему с помощью этого stackoverflow.com/questions/6142901/. но теперь я хочу знать, как решить мой код с помощью ответа @EJP. Я имею в виду, как создать файл и назначить параметру fileoutputStream?   -  person Fahim    schedule 23.05.2016


Ответы (4)


File file = new File("/images/test.bmp");

OK.

if (file.exists()) {
    file.delete();
}

Избыточный. Удалять. new FileOutputStream() создаст новый файл.

file = new File("/images/test.bmp");

Избыточный. Удалять. Это уже File с таким именем.

file.mkdirs();

Проблема здесь. Изменить на

file.getParentFile().mkdirs();

Вы создаете каталог с именем "/images/test.bmp", а не просто проверяете существование "/images". Это приведет к сбою new FileOutputStream() с правами доступа, поскольку вы не можете перезаписать каталог файлом.

try {
    OutputStream stream = new FileOutputStream(file);

Теперь продолжайте. Обратите внимание, что сначала вам придется удалить каталог "/images/test.bmp" вручную.

person user207421    schedule 23.05.2016
comment
Спасибо за ответ, но когда у меня есть папка с изображениями в пути src, теперь я хочу сохранить test.bmp в папке с изображениями, я должен создать файл с файлом файл = новый файл (/ изображения /), это правда? если да, то как сохранить в test.bmp? как установить это в файле outputstream? Извините, если мой английский плохой - person Fahim; 23.05.2016
comment
пожалуйста, ответьте на мои вопросы. Большое спасибо - person Fahim; 23.05.2016
comment
Вам не нужно делать ничего, кроме того, что я указал выше. Я ничего не говорил о new File("/images"). Я не знаю, откуда вы это взяли или какую часть моего ответа вы не понимаете. - person user207421; 24.05.2016

Здесь, когда вы вызываете mkdir, он создает test.bmp как каталог, а не как файл, поэтому вам нужно сначала создать каталог, а затем вы можете создать файл. см. приведенный ниже код.

        File dir = new File("/images/");
        dir.mkdirs();
        file = new File("/images/test.bmp");
        file.createNewFile();
person Naveen Ramawat    schedule 23.05.2016
comment
Вызов createNewFile() является избыточным. new FileOutputStream() сделает это. - person user207421; 23.05.2016

Причина исключения в том, что вы фактически создаете каталог с путем /images/test.bmp

file = new File("/images/test.bmp");
file.mkdirs();

а позже вы хотите открыть файл

OutputStream stream = new FileOutputStream(file);

Если вы хотите убедиться, что каталог /images существует, прежде чем создавать файл, который вы должны использовать

File dir = new File("/images/");
dir.mkdirs();

Явное удаление перед записью в файл не требуется, поскольку по умолчанию файл будет перезаписан.

Найдите небольшой рабочий фрагмент ниже.

// create the directory if not exist
File dir = new File("/images/");
dir.mkdirs();
// create a new file or overwrite an existing one
File file = new File("/images/test.bmp");
try (OutputStream os = new FileOutputStream(file)) {
    os.write((int) System.currentTimeMillis());
}
person SubOptimal    schedule 23.05.2016

person    schedule
comment
@Fahim, я отредактировал приведенный выше код и проверил его. Это работает на моем компьютере. Предложите использовать File.separator вместо / и \. - person kgym; 24.05.2016
comment
Блок exists()/createNewFile() — это пустая трата времени. Операционная система должна делать именно это при вызове new FileOutputStream(). Вы заставляете его делать это дважды. Проверка существования родительского каталога также бессмысленна и расточительна, так как mkdirs() уже делает это внутри ОС. - person user207421; 24.05.2016
comment
@EJP Теперь понятно. Благодарю вас! - person kgym; 24.05.2016