2012-05-06 1 views
7

Я пытаюсь сохранить изображение с помощью JFileChooser. Я хочу, чтобы пользователь мог сохранить изображение в формате jpg. Однако, если они не печатают .jpg это не будет сохранено как изображение. Возможно ли каким-либо образом добавить «.jpg» в конец файла?Добавление типа файла в файл на Java с помощью JFileChooser

File file = chooser.getSelectedFile() + ".jpg"; 

Не работает, так как я добавляю строку в файл.

ответ

9

Почему бы не преобразовать File в String и создать новый File, когда вы закончите?

File f = chooser.getSelectedFile(); 
String filePath = f.getAbsolutePath(); 
if(!filePath.endsWith(".jpg")) { 
    f = new File(filePath + ".jpg"); 
} 

Помните, что вам не нужно, чтобы добавить .jpg, если он уже есть.

+0

Этот ответ будет выполнен. Однако filePath.concat (". Jpg"), чтобы избежать ненужной конструкции StringBuilder. – Justin

+0

@Justin Накладные расходы на создание нового 'StringBuilder' должны быть незначительными, поскольку он выполняет одно действие только один раз. – Jeffrey

+0

Спасибо Джеффри :) К сожалению, я пока не могу проголосовать. Знаете ли вы, почему \t \t \t \t \t здесь требуется имя формата: ImageIO.write (изображение, «jpg», файл); это, похоже, не имеет значения? Если вы все равно должны иметь формат в файле? – Kingteeb

1

Лучшим подходом было бы проверить приемлемую запись. Если вы не нашли, замените файл exention вместо того, чтобы писать поверх него.

File f = chooser.getSelectedFile().getAbsolutePath(); 
String path = f.getAbsolutePath(); 
if (!path.matches(".*\\.(jpg|jpeg)")) { 
    // If the extension isn't there. We need to replace it 
    path = path.substring(0, path.lastIndexOf(".") + 1).concat("jpg"); 
    f = new File(path); 
} 
+1

Хорошее решение для покрытия всех расширений с помощью одного 'if', но нужно добавить' (? I) ', чтобы сделать регистр нечувствительным (catch JPG, а также jpg):' if (! Path.matches ("(?. я) * \\ (JPG |. JPEG) "))'.Также необходимо учитывать случай, когда выбранное (или типизированное) имя файла не имеет расширения, где 'path.lastIndexOf (". ")' Возвращает -1 (например, при вводе 'test', код изменит его на 'jpg', а не' test.jpg'. – chr

+0

Согласны еще одна вещь, которую вы можете сделать, это пропустить регулярное выражение, если хотите скорость. – Justin

+0

Код собирается читать или записывать на диск, регулярное выражение будет бледным по сравнению с Мне понравилось, как вы использовали регулярное выражение, чтобы поймать все возможные расширения. – chr

4

Это работает, если вы будете делать в два этапа: добавить расширение к выбранному файлу, а затем создать File объект с расширением, приложенном к нему.

String withExtension = chooser.getSelectedFile().getAbsolutePath() + ".jpg"; 
File file = new File(withExtension) 

Содержится в вашем вопросе, но только, чтобы охватить все основания: нужно проверить, если расширение не уже есть первый, например:

String withExtension = chooser.getSelectedFile().getAbsolutePath(); 
if(!withExtension.toLowerCase().endsWith(".jpg")) 
    withExtension += ".jpg"; 

[Вы можете добавить».jpeg "на if выше - это допустимое расширение для файлов JPEG]

Код может работать или не работать. File имеет toString(), который позволит ему скомпилировать, но я предпочел бы использовать метод выше, где я могу контролировать точное имя пути, которое я получаю. Документация toString() для объекта File немного неясна для меня, что именно оно возвращает. В таких случаях, как этот, я предпочитаю вызывать функцию, которая, как я знаю, возвращает то, что мне нужно.

File file = new File(chooser.getSelectedFile() + ".jpg");