Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Рациональность замены / 10 сообщений из 10, страница 1 из 1
14.09.2005, 13:47
    #33268900
DKrosh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
Всем привет. Столкнулся с ситуацией, когда один кусок кода заменили на другой, но рациональность замены я не понимаю.

Старый код
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}

Новый код
byte[] buf = new byte[(int) file.length()];
is.read(buf);
os.write(buf);


Если кто-нибудь объяснит мне, буду благодарен.
...
Рейтинг: 0 / 0
14.09.2005, 15:24
    #33269294
jdev333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
как-то так себе получилось -
- если данные длинные- то больше памяти истратится
- is.read может не сразу все считать - упс (или нуна знать чего is и os из себя представляют)
...
Рейтинг: 0 / 0
14.09.2005, 16:32
    #33269529
Рациональность замены
DKroshВсем привет. Столкнулся с ситуацией, когда один кусок кода заменили на другой, но рациональность замены я не понимаю.

Старый код
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}

Новый код
byte[] buf = new byte[(int) file.length()];
is.read(buf);
os.write(buf);


Если кто-нибудь объяснит мне, буду благодарен.

Ну как... Потратить больше памяти... Не работать с файлами длиньше чем Integer.MAX_VALUE байт... Но в идеале второй кусок может работать быстрее первого, т.к. меньше происходит обращений к "диску" (и не только, просто вызовы натив и синхронайзд методов по пустякам тоже не хорошее дело).

Я бы предпочёл такой вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 void  copy(File file, InputStream is, OutputStream os) {
   int  MAX_BUFFER_SIZE = сколько душа пожелает, зависит от конкретного приложения.

   byte [] buf =  new   byte [( int )Math.min(MAX_BUFFER_SIZE, file.length())];

   int  len;
   while  ((len = is.read(buf)) >  0 ) {
     os.write(buf,  0 , len);
  }
}

...
Рейтинг: 0 / 0
14.09.2005, 16:39
    #33269555
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
Прыгающая радость wrote:
>
> Я бы предпочёл такой вариант:
> ...skipped...

Я бы еще и уточнил в цикле чтения:
Код: plaintext
1.
    while ((len = is.read(buf)) >=  0 ) {

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
14.09.2005, 17:28
    #33269692
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
XM
Я бы еще и уточнил в цикле чтения:
Код: plaintext
1.
    while ((len = is.read(buf)) >=  0 ) {
Posted via ActualForum NNTP Server 1.3

Зачем? Встречались на практике ошибки с этим связанные? :)
...
Рейтинг: 0 / 0
14.09.2005, 17:31
    #33269703
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
NotGonnaGetUs wrote:
> Зачем? Встречались на практике ошибки с этим связанные? :)

Угу, была такая фигня. Если просто > , то могло не все прочитать :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
14.09.2005, 23:51
    #33270109
DKrosh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
Усем пасиба.
...
Рейтинг: 0 / 0
15.09.2005, 10:16
    #33270427
jdev333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
для убыстрения нуна юзать java.nio - копирование через FileChannel.transferTo
...
Рейтинг: 0 / 0
15.09.2005, 10:17
    #33270431
jdev333
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
(тогда в джаву может вообще ничего не копироваться и не занимать память (используются системные буферы))
...
Рейтинг: 0 / 0
15.09.2005, 11:50
    #33270758
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рациональность замены
Вот так например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  try  {
          FileChannel source =  new  FileInputStream(sourcefile).getChannel();
          FileChannel destination =  new  FileOutputStream(destinationfile).getChannel();

          destination.transferFrom(source,  0 , source.size());
          source.close();
          destination.close();
           return  true;
      }  catch  (IOException e) {
           return  false;
      }
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Рациональность замены / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]