2016-04-09 3 views
0

Еще разне удается прочитать весь файл в строку в Java

Здравствуйте,

повторения моего вопроса

Я скачал файл из Интернета, а именно это:

jquery.js

Это 94159 байт, и при проверке все кажется прекрасным. Теперь я хотел бы прочитать этот файл в String, манипулировать им, а затем сохранить его. После прочтения файла я печатаю его на консоль, и кажется, что он не читал весь файл (части с конца отсутствуют). После сохранения это всего лишь 91000 байт.

Я пробовал разные методы чтения, так что я не думаю, что это проблема, например:

String fileTo = new String(Files.readAllBytes(Paths.get(fileFullPath)), StandardCharsets.UTF_8); 

(тот же результат с помощью сканера, поток)

Вероятно, что-то делать с файлом сам. Файл на моем mac находится в utf-8, может быть, изначально это не так? Я действительно не знаю, что может быть причиной. Спасибо за помощь.

Edit:

Это, как я скачал его:

try (InputStream fileReader = new BufferedInputStream(
      conn.getInputStream()); 
     OutputStream fileWriter = new BufferedOutputStream(
       new FileOutputStream(fileFullPath))) 
    { 
     int readByte; 
     while ((readByte = fileReader.read()) != -1) 
     { 
      fileWriter.write(readByte); 
     } 
+0

Как сохранить файл «Мое предположение t, три строки кода в этом файле настолько длинны, что ваша консоль усекает их. –

+0

Сохраните вот так: try (PrintStream out = new PrintStream (новый FileOutputStream (fileFullPath))) { out.print (fileTo); } – Jhonny

+0

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

ответ

-1

String не может обрабатывать такие большие файлы хорошо. Используйте StringBuilder вместо:

byte[] bytes = Files.readAllBytes(Paths.get(fileFullPath)) 
StringBuilder sb = new StringBuilder(); 
sb.append(bytes); 
+1

String и StringBuilder могут обрабатывать чуть более 2 миллиардов символов. –

0

Вы сказали, что вы получаете файл из Internet.

Таким образом, вы можете установить кодировку символов набора из ответа HTTP заголовка Content-Type, которые выглядят как:

Content-Type: text/html,text/html;charset='UTF-8' 
0

После загрузки на моей машине, ls -l jquery.js гравюр -rw-r--r-- 1 pi pi 94159 Apr 9 12:25 jquery.js, что подтверждает размер файла 94159 байт.

Тем не менее, в позиции 14566 (внутри .test(" "), существует последовательность Юникода (0xC2, 0xA0), который является UTF-8 "неразрывный пробел" (http://www.unicode.org/charts/PDF/U0080.pdf).

При запуске следующую программу

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.charset.StandardCharsets; 

public class FileSize { 
    static public void main(String[] args) { 
     try { 
      final String fileFullPath = "jquery.js"; 
      String fileTo = new String(Files.readAllBytes(Paths.get(fileFullPath)), StandardCharsets.UTF_8); 
      System.out.println(fileTo.length()); 
     } catch (IOException error) { 

     } 
    } 
} 

печатает 94158. отличие одного байта объясняется «UTF-8» кодирования, но она не может объяснить 91000 байт. объяснение должно быть где-то в другом месте.

+0

Не знаю, я добавил свой метод загрузки, возможно, это тот, который виноват. – Jhonny

+0

В любом случае странно, я делаю то же, что и вы, поэтому я должен иметь тот же результат. Я на OS X, если это имеет значение. – Jhonny

Смежные вопросы