Выбор файлов по маске. Проблема с русской кодировкой

Решил написать программу на Java, которая должна отбирать файлы по маске и копировать их в специальную папку(путь заранее известен). Однако столкнулся с трудностями.
Читаю файл, смотрю является ли он директорией, если да то начинаю смотреть его внутреннюю структуру, если нет, проверяю удовлетворяет ли он моей маске.
.indexOf — метод который проверяет входит ли маска в имя директории или файла.
Когда тестировал на каталогах с файлами и папками названными на английском языке — проблем не было, однако когда перешел на русские — возникли проблемы. Считывая название файла(на русском) компьютер выпадает что-то вроде:
«DirList=” Єг«мвҐв ЎЁ§­Ґб  Ё ¬Ґ­Ґ¤¦¬Ґ­в 
DirList=” Єг«мвҐв Јг¬ ­Ёв а­ле ­ гЄ
DirList=Programmnew
DirList=Њ®ЎЁ«м­®бвм а Ў®в­ЁЄ®ў
DirList=Њ®ЎЁ«м­®бвм бв㤥­в®ў»

Вопрос, как это можно решить?

package com.javarush.test.ac;

/**
 * Created by ac on 15.07.2015.
 */
import java.io.*;
//import java.util.*;

public class main1_3 {
    public static void main(String[] args){

        String paramKatalog = "C:\\test\\";
        String paramMask = "а";
        //Scanner sc = new Scanner(System.in);

        if(args.length > 0)
        {
            paramKatalog = args[0];
            paramMask = args[1];
        }

        File f = new File(paramKatalog);
        if(!f.exists()) // проверка существования директории
            System.out.println("Not folder.");
        if (!f.isDirectory()) // является ли файл директорией
            System.out.println("Not directory.");

        list(paramKatalog, paramMask);
    }

    static void list(String str, String msc)
    {
        try {
            System.setOut(new PrintStream(System.out, true, "Cp866"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        File f = new File(str);
        String[] DirList = f.list();
        String[] FileMask = f.list(new MaskF(msc));

        if (DirList.length > 0)
            for (int j = 0; j < DirList.length; j++)
                System.out.println("DirList="+DirList[j]);

        if (FileMask.length > 0)
            for (int j = 0; j < FileMask.length; j++)
                System.out.println(FileMask[j]);

        for (int i = 0; i < DirList.length; i++)
        {
            File f1 = new File(str + "/" + DirList[i]);
            if (!f1.isFile())
            {
                list(str + "/" + DirList[i], msc);
            }
        }
    }
}

class MaskF implements FilenameFilter {
    String mask;

    MaskF(String Mask)
    {
        mask = Mask;
    }

    public boolean accept(File f, String name)
    {
        if (name.indexOf(mask) >= 0)
        {   return true;}
        else
            return false;
    }
}

3 комментария

vonrims
с кодировкой решил проблему следующем образом:
поставил строчки

try {
            System.setOut(new PrintStream(System.out, true, "Cp1251"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


но все-равно indexOf не хочет нормально обрабатывать русские буквы. Цифры и английские символы нормально распознает, а вот русские символы — нет
vonrims
  • vonrims
  • 0
  • Комментарий отредактирован 2015-07-17 19:44:59 пользователем vonrims
Странно, названия файлов теперь выводит нормально, однако если создать переменную типа String в программе и вывести на экран, то будет выдано на печать только вопросики ???

UPD: решение найдено! Кодировкасправа внизу экрана в idea в классе который запускаете была cp1251, изменил на UTF-8, подтвердил конвертирование всей проги и все заработало.
vonrims
Итоговый рабочий код:
package com.javarush.test.ac;

/**
 * Created by ac on 15.07.2015.
 */
import java.io.*;
import java.util.*;

public class main1_3 {
    public static void main(String[] args){

        String paramKatalog = "C:\\test\\";
        String paramMask = "Мобильность студентов";

        File f = new File(paramKatalog);
        if(!f.exists()) // проверка существования директории
            System.out.println("Not folder.");
        if (!f.isDirectory()) // является ли файл директорией
            System.out.println("Not directory.");

        list(paramKatalog, paramMask);
    }

    static void list(String str, String msc)
    {
        File f = new File(str);
        String[] DirList = f.list();
        String[] FileMask = f.list(new MaskF(msc));

        if (FileMask.length > 0)
            for (int j = 0; j < FileMask.length; j++)
                System.out.println(FileMask[j]);

        for (int i = 0; i < DirList.length; i++)
        {
            //System.out.println("DirList.["+i+"] = "+DirList[i]);
            //System.out.println(DirList[i].indexOf("Фа"));
            File f1 = new File(str + "/" + DirList[i]);
            if (!f1.isFile())
            {
                list(str + "/" + DirList[i], msc);
            }
        }
    }
}

class MaskF implements FilenameFilter {
    String mask;

    MaskF(String Mask)
    {
        mask = Mask;
    }

    public boolean accept(File f, String name)
    {
        if (name.indexOf(mask) >= 0)
            return true;
        else
            return false;
    }
}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.