2016-01-28 2 views
2

Я написал программу Java, чтобы напечатать длину файлов в JavaJava не может читать файлы с некоторыми «специальными» символами

import java.io.File; 
    import java.io.IOException; 
    import java.nio.charset.Charset; 
    import java.nio.file.Files; 

    public class FTPTest { 
      public static void main(String args[]) throws IOException { 
        File dirFile = new File("/home/chandakv/Desktop/test/vishal"); 
        File[] ab = dirFile.listFiles(); 
        for (int i = 0; i < ab.length; i++) { 
          System.out.println(ab[i].getName() + "\t" + ab[i].length()); 
        } 
      } 
    } 

Он отлично работает с обычными файлами, но с один файлом, имеющим имя файла:

bjliretimessitb_u.'192.168.200.38 '? Ïμ? ? Ú² ????? (Y) .lnk

Невозможно прочитать этот файл. Если я переименовываю этот файл (даже удаляя любые допустимые символы), он работает как ожидалось. До сих пор я могу понять, что .lnk не является проблемой, и при переименовании файла исследователь Linux преобразует кодировку в ASCII, чтобы файл обрабатывался.

Но как нормально обрабатывать файл, не изменяя его имя.

FYI, на запуск выше программы

file.isFile() -> Returns false 
file.isReadable() -> Returns false 
file.length() -> Returns 0 

И на Linux "LS -l" показывает размер файла, как 207 байт.

+0

.LNK? Является ли файл ярлыком Windows на share Samba? – Dave

+0

Файл .lnk обычно связан с окнами. так как вы получаете эти .lnk-файлы? –

+0

LNK - это расширение файла для файла ярлыков, используемого Windows, для указания на exe. – bluelurker

ответ

0

вы должны написать имя файла символ в Юникоде \ ихххх

в вашем коде все Юникода символы преобразуются в знак вопроса, то файл не существует

0

Попробуйте создать новый PrintStream (не используйте по умолчанию System.outPrintStream) с использованием кодировки UTF8.

PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
out.println(unicodeText); 

Ваш код будет выглядеть следующим образом:

import java.io.PrintStream; 

File dirFile = new File("/home/chandakv/Desktop/test/vishal"); 
File[] ab = dirFile.listFiles(); 
PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
for (int i = 0; i < ab.length; i++) { 
    out.println(ab[i].getName() + "\t" + ab[i].length()); 
} 
Смежные вопросы