Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Чтение файлов с кириличным именем  [new]
Виктория_00
Member

Откуда: Украина
Сообщений: 5
Здравствуйте.
есть метод, который должен считать файлы с диска (jpg, jpeg || png), и переписать их в другое место изменив размер
сам метод:
    static File[] tempBuilder(ArrayList<String> files) {
        File[] f = new File[files.size()];
        for(int i = 0; i < files.size(); i++){
            File ft = new File("res\\temp\\" + getTempId() + ".jpg");
            try {
                BufferedImage image = ImageIO.read(new File(files.get(i)));
                BufferedImage resImage = resize(image,100,100);
                ImageIO.write(resImage, "jpg", ft);
                f[i] = ft;
            } catch (IOException ex) {
                Logger.getLogger(Out.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return f;
    }

метод resize
    public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
        Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
        BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_RGB);
 
        Graphics2D g2d = dimg.createGraphics();
        g2d.drawImage(tmp, 0, 0, null);
        g2d.dispose();
 
        return dimg;
    }

виборка файлов с диска
                File[] item = new File(dir).listFiles();
                ArrayList<String> dirs = new ArrayList<String>();
                ArrayList<String> files = new ArrayList<String>();
                ArrayList<String> filesPath = new ArrayList<String>();
                for(int i = 0; i < item.length; i++){
                    if(item[i].isDirectory()){
                        dirs.add(item[i].getName());
                    }
                    else{
                        String s = item[i].getName();
                        int tach = s.lastIndexOf(".");
                        String roz = s.substring(tach + 1);
                        if((roz.equals("jpg") || roz.equals("jpeg") || roz.equals("png")) /*&& s.indexOf("-") == -1// сия часть была добавлена
                                мной как костыль, ибо раньше висло все на первом же файле с дефисом, теперь виснет только на файлах с 
                                кириличным именем, а файлы с дефисом не попадают в обработку, что тоже по-сути не правильно*/){
                            files.add(item[i].getName());
                            filesPath.add(item[i].getAbsolutePath());
                        }
                    }
                }

Когда цикл доходит до кирилически-обозваного файла строка g2d.drawImage(tmp, 0, 0, null); виснет, и дебагер дальше не проваливается.
Может кто знает как исправить сие положение?
Спасибо
throw new AchtungProgramistGirlException(true);
15 май 19, 08:27    [21884930]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 3751
try {
  ...
} catch (AchtungProgramistGirlException ex){
   Logger.getLogger("Don't use cyrillic symbols in filenames!");
}
15 май 19, 09:59    [21885002]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 3751
А если серьезно, то по идее должно валиться на
BufferedImage image = ImageIO.read(new File(files.get(i)));


Вы точно уверены, что виснет именно на
g2d.drawImage(tmp, 0, 0, null);

?
15 май 19, 10:03    [21885004]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
Виктория_00
Member

Откуда: Украина
Сообщений: 5
Точно, пять раз дебагером уже проганяла, все время там валится. считку файта проходит
15 май 19, 10:23    [21885021]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
Виктория_00
Member

Откуда: Украина
Сообщений: 5
а если избавится от киличных файлов
File[] item = new File(dir).listFiles();
                ArrayList<String> dirs = new ArrayList<String>();
                ArrayList<String> files = new ArrayList<String>();
                ArrayList<String> filesPath = new ArrayList<String>();
                for(int i = 0; i < item.length; i++){
                    if(item[i].isDirectory()){
                        dirs.add(item[i].getName());
                    }
                    else{
                        String s = item[i].getName();
                        int tach = s.lastIndexOf(".");
                        String roz = s.substring(tach + 1);
                        Pattern ptr = Pattern.compile("[а-яА-Я]");
                        if((roz.equals("jpg") || roz.equals("jpeg") || roz.equals("png")) && s.indexOf("-") == -1){
                            Matcher m = ptr.matcher(s);
                            if(!m.find()){
                                files.add(item[i].getName());
                                filesPath.add(item[i].getAbsolutePath());
                            }
                        }
                    }
                }

все прекрасно работает
[img=]

К сообщению приложен файл. Размер - 20Kb
15 май 19, 10:29    [21885030]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
mayton
Member

Откуда: loopback
Сообщений: 40440
На флешках отформатированных под FAT32 могут быть проблемы с представлением кодовой страницы.

По тексту кода и по вашим сообщениям так и не ясно точно где это.

Замените

BufferedImage image = ImageIO.read(new File(files.get(i)));


на

InputStream inputStream = new FileInputStream("res\\temp\\" + getTempId() + ".jpg");
IOUtils.copy(inputStream, new NullOutputStream);


и два брейк поинта на каждую строку.
15 май 19, 10:48    [21885058]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
Виктория_00
Member

Откуда: Украина
Сообщений: 5
спасибо, попробую
15 май 19, 11:01    [21885066]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
Виктория_00
Member

Откуда: Украина
Сообщений: 5
автор
Замените

BufferedImage image = ImageIO.read(new File(files.get(i)));


на

InputStream inputStream = new FileInputStream("res\\temp\\" + getTempId() + ".jpg");
IOUtils.copy(inputStream, new NullOutputStream);

Шото тут не то.
BufferedImage image = ImageIO.read(new File(files.get(i)));

Считывает файл (!уже существующий) из листа путей.
FileInputStream("res\\temp\\" + getTempId() + ".jpg");

а ви предлагаете стриму считать файл, которого еще нет, ибо метод getTempId() генерирует новое имя (это раз), а каталог res\\temp\\ является целевым, в который будет произведена запись файла, и значит по умолчание такого файла там быть просто не может, физически (это двас).
ПС. :(
15 май 19, 11:13    [21885077]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
mayton
Member

Откуда: loopback
Сообщений: 40440
Я хочу увидеть IOException с поясняющим текстом в фазе конструктора FileInputStream.
Предположительно там оно и падает.

Сделайте любезность. Кстати стектрейс ошибки здесь важнее всего. Странно что вы его не показали.
15 май 19, 11:24    [21885090]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
Dmitry.
Member

Откуда: Львів
Сообщений: 827
скопировал код - все работает, картинка создается
java 1.8

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.Graphics2D;
import java.awt.Image;

public BufferedImage resize(BufferedImage img, int newW, int newH) { 
    Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
    BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = dimg.createGraphics();
    g2d.drawImage(tmp, 0, 0, null);
    g2d.dispose();
    return dimg;
}


BufferedImage image = ImageIO.read(new File("Привіт.jpg"));
BufferedImage resImage = resize(image,100,100);
ImageIO.write(resImage, "jpg", new File("Пaпа.jpg"));
15 май 19, 12:10    [21885146]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
mayton
Member

Откуда: loopback
Сообщений: 40440
Дьявол - в деталях.
15 май 19, 12:45    [21885170]     Ответить | Цитировать Сообщить модератору
 Re: Чтение файлов с кириличным именем  [new]
alex55555
Member

Откуда:
Сообщений: 2082
Виктория_00
Здравствуйте

Ну привет.

В общем файлы читаются осью в дефолтной кодировке, дефолт определяет сама ось, каков он - надо выяснить. Но даже не суть с дефолтом, суть в отсутствии простейшей проверки.

Кто мешает в том же дебаггере посмотреть, что за хрень там суётся в конструктор нового файла?

Кроме того, давать конструктору просто имя файла, без пути - это действительно женская логика.

В общем - по замечаниям треба отчёт дать.
15 май 19, 17:23    [21885607]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить