|
|
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Добрый день. Имеется код. На вход ZIP архив из базы, на выход разархивированные файлы. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. При данном размере буфера размер (и содержимое) выходного файла отличается (стал больше) от файла в архиве новые 161 480 704 байт против 160 776 000 байт старых. Если размер буфера уменьшить до 256 например, то размеры совпадают, но конец файла чуть-чуть искажается. При размере буфера 64 файлы совпадают. Вопрос, почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 15:06:00 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Во-первых Reader и Writer предназначены для текстовых данных. Для того чтобы вычитать двоичный файл из архива и сохранить в файл на диске, они не нужны. Тем более вы не знаете кодировку текстового файла (UTF8, CP1251, etc) и пытаетесь использовать текущую. Во-вторых когда используется Buffered Reader/Writer/Stream нет необходимости добавлять свой буфер char[] bytes = new char[n]; Можно читать по одному символу или байту. Buffered класс уже реализует такой буфер внутри. И в-третих переменная cnt содержит значение, которое вам нужно использовать для записи, а вы его игнорируете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 15:12:48 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВо-первых Reader и Writer предназначены для текстовых данных. Для того чтобы вычитать двоичный файл из архива и сохранить в файл на диске, они не нужны Я знаю, что там текстовые файлы. BlazkowiczТем более вы не знаете кодировку текстового файла (UTF8, CP1251, etc) и пытаетесь использовать текущую. Очень долго мучался с кодировкой, особенно не хотелись создаваться файлы с русскими именами. Сделал System.setProperty("file.encoding", "Cp1251"); и стало хорошо везде. BlazkowiczВо-вторых когда используется Buffered Reader/Writer/Stream нет необходимости добавлять свой буфер char[] bytes = new char[n]; Можно читать по одному символу или байту. Buffered класс уже реализует такой буфер внутри. А зачем же тогда метод read(char[] cbuf) ? BlazkowiczИ в-третих переменная cnt содержит значение, которое вам нужно использовать для записи, а вы его игнорируете. В cnt содержится значение для записи, если использовать read без входных параметров. Если с входными там количество считанных байт, исли оно =-1, то выход из цикла.\ Вы говорите, read лучше чем read(char[]) ? Но он вроде дольше отрабатывает. Даже когда я уменьшаю буфер свой до 64, оно дольше идет примерно на 50% (15 сек против 10 сек, но это файлы еще маленькие), хотя по-разному бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 15:40:28 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
GustlyЯ знаю, что там текстовые файлы. Тогда стоило писать вот так: Код: java 1. 2. GustlySystem.setProperty("file.encoding", "Cp1251"); И не дай бог нужно что-то кроме латиницы и кириллицы? А вдруг кто-то в этой же JVM надется на UTF-8? Так вы текст анализируете ещё параллельно или нет? Потому что код, который я вижу тупо заменяется одной строкой: Код: java 1. И никакого гемороя с кодировками и буферами. GustlyА зачем же тогда метод read(char[] cbuf) ? Это метод класса Reader. Reader может быть не буферизированым. BlazkowiczИ в-третих переменная cnt содержит значение, которое вам нужно использовать для записи, а вы его игнорируете. В cnt содержится значение для записи, если использовать read без входных параметров. Если с входными там количество считанных байт, исли оно =-1, то выход из цикла. Правильно. И каждый раз когда cnt < bytes.length() вы записываете больше символов чем прочитали. GustlyВы говорите, read лучше чем read(char[]) ? Нет. Я так не говорил. Вы меня перевираете. Я говорю что буфер уже есть в BufferedReader и в BufferedWriter. Поэтому ваш собственный уже не нужен. GustlyНо он вроде дольше отрабатывает. Даже когда я уменьшаю буфер свой до 64, оно дольше идет примерно на 50% (15 сек против 10 сек, но это файлы еще маленькие), хотя по-разному бывает. Это ещё раз показывает что JavaDoc ни одного из используемых классов вы не открывали. Сделайте так: Код: java 1. 2. И производительность уравняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 15:53:53 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
А как на счет изначального вопроса? Почему файл коверкается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:05:50 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
GustlyА как на счет изначального вопроса? Почему файл коверкается? Потому что вы читаете cnt символов, а записываете 1024*1024. cnt != 1024*1024 и это не только признак конца файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:07:33 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
IOUtils у меня нету такого пакета. Видимо его отдельно надо ставить, а в библиотеки оракла не хотелось бы чего стороннего пихать, да и не пробовал ни разу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:09:43 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.copyLarge(java.io.InputStream,java.io.OutputStream) Можете скопипастить себе. Там ничего военного: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:13:21 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В этом примере тоже массив для буфера используется, но нету BufferedReader. Как лучше-то? Как пользоваться read() из BufferedReader. Он читает инт, а когда пишешь его он пишет символы @. Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:20:26 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Gustly Код: java 1. 2. Для вас это вообще непонятный набор букв и вы его переставляете как вам нравится, пока что-то не получится? bytes - данные cnt - количество прочитаных данных writer.write(cnt) - пишем количество прочитаных данных как текст А ожидаем почему-то данные, которые не пишем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:22:26 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGustly Код: java 1. 2. Для вас это вообще непонятный набор букв и вы его переставляете как вам нравится, пока что-то не получится? bytes - данные cnt - количество прочитаных данных writer.write(cnt) - пишем количество прочитаных данных как текст А ожидаем почему-то данные, которые не пишем? Слово bytes не стер, имелось в виду Код: java 1. 2. В примере, который вы кидали используется массив, но без BufferedWriter, стоит ли его вообще тогда использовать? В доках написано, что он необходим, ибо быстрее и не напряжнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:31:53 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
GustlyВ примере, который вы кидали используется массив, но без BufferedWriter, стоит ли его вообще тогда использовать? В доках написано, что он необходим, ибо быстрее и не напряжнее. Buffered классы можно читать и писать по символьно\побайтно, это проще. Если писать через свой byte[] или char[], то проще накосячить, что вы уже и показали. Но если написать без ошибок, то Buffered классы не нужны. Есть буфер - быстро Нет буфера - медленно. Два буфера медленнее чем один, а три буфера медленнее чем два. У вас изначально 3 буфера: BufferedWriter, BufferedReader и char[] bytes. IOUtils.copy -> один буфер. Что тут не понятного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:37:01 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGustlyВ примере, который вы кидали используется массив, но без BufferedWriter, стоит ли его вообще тогда использовать? В доках написано, что он необходим, ибо быстрее и не напряжнее. Buffered классы можно читать и писать по символьно\побайтно, это проще. Если писать через свой byte[] или char[], то проще накосячить, что вы уже и показали. Но если написать без ошибок, то Buffered классы не нужны. Есть буфер - быстро Нет буфера - медленно. Два буфера медленнее чем один, а три буфера медленнее чем два. У вас изначально 3 буфера: BufferedWriter, BufferedReader и char[] bytes. IOUtils.copy -> один буфер. Что тут не понятного? Как пользоваться методом read() от BufferedReader и потом его писать. Я думал буферед должно быть в обе стороны чтения и записи. Как лучше поступить с именами файлов (они искажаются при вытаскивание из архива)? Оставить System.setProperty("file.encoding", "Cp1251"), а файлы считывать в UTF8 или еще как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:42:50 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Gustly, Я вам уже весь код привел. Нужно только два блока соединить Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Непосильная задача? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:46:43 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Blazkowicz[/src] Непосильная задача? Это все понятно, спасибо. Искажение убралось строкой (buffer, 0, n), надо было окончание буфера указать. Ну и плюс с вашей помощью убраны ненужные BufferedWriter, хотя тогда она зачем они нужны, когда есть read(bufer). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 16:59:57 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Gustlyубраны ненужные BufferedWriter, хотя тогда она зачем они нужны, когда есть read(bufer) Потому что такой код Код: java 1. 2. 3. 4. 5. 6. Проще чем такой. Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 17:08:20 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGustlyубраны ненужные BufferedWriter, хотя тогда она зачем они нужны, когда есть read(bufer) Потому что такой код Код: java 1. 2. 3. 4. 5. 6. Проще чем такой. Код: java 1. 2. 3. 4. 5. 6. 7. Я не понимаю как писать в файл, если читать через с = read(). Там число от 0 до 65к. Что потом? Writer.write(chr(c)) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 17:40:46 |
|
||
|
BufferedReader и размер буфера
|
|||
|---|---|---|---|
|
#18+
Gustly, Я не врубаюсь куда вы смотрите. Читаем int http://docs.oracle.com/javase/6/docs/api/java/io/Reader.html#read() Пишем int http://docs.oracle.com/javase/6/docs/api/java/io/Writer.html#write(int) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 21:39:35 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38322181&tid=2129040]: |
0ms |
get settings: |
12ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 344ms |
| total: | 523ms |

| 0 / 0 |
