Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileChannel копирую файл, методы read() и write() 
:(
    Опции темы
cube
Дата 17.11.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 11.4.2007

Репутация: 2
Всего: 3



Привет всем, у меня вопрос, я копирую файл Main.java в Main2.txt, но в Main2.txt получаю квадраты,  что я неправильно делаю?

Код

  private void run() throws Exception
  {
    FileInputStream f = new FileInputStream("./src/filetest/Main.java");
    FileChannel ch = f.getChannel();
    int buffSize= 25;
    ByteBuffer bb = ByteBuffer.allocate(buffSize);
    ByteBuffer[] data = new ByteBuffer[(int)(ch.size()/(long)buffSize) + 1];
    System.out.println((int)(ch.size()/(long)buffSize));
    int nRead = 0;
    int counter =0;
    while ((nRead=ch.read(bb)) != -1 )
    {
      data[counter++] = bb.duplicate();
      bb.clear();
    }
    ch.close();
    f.close();
    createNewFile(data);
  }
  
  private void createNewFile(ByteBuffer[]data) throws Exception
  {
    FileOutputStream f = new FileOutputStream("./src/filetest/Main2.txt");
    FileChannel ch = f.getChannel();
    ch.write(data);
    ch.close();
    f.close();
  }



Это сообщение отредактировал(а) cube - 17.11.2008, 14:45
PM MAIL   Вверх
ivg
Дата 17.11.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Зачем вам эта чехарда с буферами. ByteBuffer#duplicate() хоть и создаёт новый объект, но само содержимое массива байтов общее - в этом то и проблема в вашем коде. Если вы всё содержимое всё равно в память копируете используйте один ByteBuffer. Ну и в конце концов можно вообще без них обойтись:
Код

    private void run() throws Exception {
        FileInputStream fin = new FileInputStream("./src/filetest/Main.java");
        FileChannel from = fin.getChannel();
        FileOutputStream fout = new FileOutputStream("./src/filetest/Main2.txt");
        FileChannel to = fout.getChannel();
        long size = from.size();
        long pos = 0L;
        try {
            while (pos < size) {
                pos += from.transferTo(pos, size - pos, to);
            }
        } finally {
            to.close();
            from.close();
        }
    }


PM MAIL   Вверх
cube
Дата 17.11.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 11.4.2007

Репутация: 2
Всего: 3



спасибо я уже это понял про dublicate(), мне нужно это в разных методах (чтение файла и запись) чтение файла будет вызываться на сервере, запись на клиенте, по сети я могу передавать массив например каких-то объектов, и записать их на клиенте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.