с проблемами с DataInputStream.readInt () [duplicate]

Я создал простую в использовании библиотеку для изменения размера изображения. Здесь можно найти здесь, на Github .

Пример использования библиотеки:

// Include PHP Image Magician library
require_once('php_image_magician.php');

// Open JPG image
$magicianObj = new imageLib('racecar.jpg');

// Resize to best fit then crop (check out the other options)
$magicianObj -> resizeImage(100, 200, 'crop');

// Save resized image as a PNG (or jpg, bmp, etc)
$magicianObj -> saveImage('racecar_small.png');

Другие функции, если они вам понадобятся, :

  • Быстрое и простое изменение размера - изменение размера на пейзаж, портрет или авто
  • Легкая обрезка
  • Добавить текст
  • Качество настройка
  • Водяные знаки
  • Тени и отражения
  • Поддержка прозрачности
  • Чтение метаданных EXIF ​​
  • Границы, закругленные углы, Вращение
  • Фильтры и эффекты
  • Заточка изображения
  • Преобразование типа изображения
  • Поддержка BMP

20
задан Tom 5 28 April 2012 в 22:35
поделиться

2 ответа

Вы читаете сокет до тех пор, пока read() не вернет -1. Это условие конца потока (EOS). EOS происходит, когда партнер завершает соединение. Не когда он заканчивает запись одного файла.

Вам нужно отправить размер файла перед каждым файлом. Вы уже делаете подобное с количеством файлов. Затем убедитесь, что вы прочитали точно столько байтов для этого файла:

String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1)
{
  fos.write(buf,0,n);
  fileSize -= n;
}
fos.close();

Вы можете заключить все это в цикл, который завершается, когда readUTF() выбрасывает EOFException. Наоборот, вы должны вызывать writeUTF(filename) и writeLong(filesize) у отправителя перед отправкой данных.

23
ответ дан user207421 25 August 2018 в 20:46
поделиться

Я сделал это так, он работает отлично, вы можете взглянуть:

send

byte[] done = new byte[3];
String str = "done";  //randomly anything
done = str.getBytes();
for(int i =0; i < files.size(); i++){
    System.out.println(files.get(i).getName());
    FileInputStream fis = new FileInputStream(files.get(i));
    while((n =fis.read(buf)) != -1){
        dos.write(buf,0,n);
        System.out.println(n);
        dos.flush();
    }
 //should i close the dataoutputstream here and make a new one each time?                 
    dos.write(done,0,3);
    dos.flush();
}
        //or is this good?
        dos.close();

recieve

for(int i = 0; i < files.size();i++){
    System.out.println("Receiving file: " + files.get(i).getName());
 //create a new fileoutputstream for each new file
fos = new FileOutputStream("C:\\users\\tom5\\desktop\\salestools\\" +files.get(i).getName());
//read file
while((n = dis.read(buf)) != -1 && n!=3 ){
        fos.write(buf,0,n);
        fos.flush();
        }
            fos.close();
        }
1
ответ дан Nikhar 25 August 2018 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: