2012-04-18 3 views
0

Что мне нужно сделать, это отправить несколько файлов с помощью DataStreams. Я делаю это, отправив имя файла, а затем байты файла. Однако мне нужно отправить неопределенное количество файлов. Вот код DataOutputStream.Чтение нескольких байт [] из DataInputStream

  out.writeUTF(path); 
      out.write(Files.readAllBytes(file.toPath())); 

Он делает это для каждого файла, который необходимо отправить. Но я не знаю, как правильно это прочитать с DataInputStream. Это то, что у меня есть до сих пор.

while (in.available() != 0) { 
     String path = in.readUTF(); 
     byte bytes = in.readByte(); 
    } 

Очевидно, что это не сработает, так как это только чтение одного байта. Но я не знаю, как заставить его прочитать все байты. Поскольку отправляется несколько файлов, available() будет равняться только 0, когда, конечно, читается конец всех файлов. Любая помощь приветствуется.

Что-то я совсем забыл упомянуть, я хочу, чтобы иметь возможность отправлять большой файл без исчерпания памяти, и я не думаю, что это сработает. Я думаю, что мне нужно будет использовать буфер, но я не знаю, какой класс поддерживает это с файлами.

+0

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

+0

@JonSkeet Нет особых причин. Было бы лучше сделать так? – Stripies

+0

Как вы начали свой DataInputStream. Вы уверены, что он инициализирован правильно? Прошли ли вы и решили, что он читает только один раз и умирает? Это то, что вы действительно читаете в содержании файла, или вы ничего не читаете, потому что init был неправильным? – Churk

ответ

2

В любое время, когда вы отправляете сообщения переменной длины, вам нужно каким-либо образом отметить начало и конец каждого метода.

List<File> files = someListOfFilesYouWantToSend; 
out.writeInt(files.size()); 
for(File file : files){ 
    out.writeUTF(path); 
    out.writeLong(file.getTotalSpace()); 
    out.write(Files.readAllBytes(file.toPath())); 
} 

Тогда читать его вы могли бы сделать что-то вроде этого

int filesToRead = in.readInt();  
for(int i = 0; i < filesToRead; i++){ 
    String path = in.readUTF(); 
    long bytesToRead = in.readLong();  
    FileOutputSteam fos = new FileOutputStream(path); 

    byte[] buffer = new byte[1024]; 
    while(bytesToRead > 0){ 
    bytesRead = in.read(buffer,0,bytesToRead > buffer.length ? buffer.length : bytesToRead); 
    bytesToRead -= bytesRead; 
    fos.write(buffer); 
    } 
} 
0

Это не способ сделать это ... Почему бы вам просто не архивировать все файлы, которые вы хотите отправить в архив (например, JAR или ZIP)? На принимающей стороне вы можете извлечь архив. Java имеет встроенную реализацию JAR (в пакете java.util.jar), которую вы можете использовать.

+1

Это всего лишь мнение о реализации, и, возможно, что-то не может быть поставлено под сомнение. Старайтесь указывать «Это не способ сделать это», если вы не экспортируете в поле. – Churk

+0

Ну, очевидно, я предлагаю реализацию вопроса, заданного здесь. Почему это не вариант? Я думаю, например, что GMail передает несколько файлов вложений в архив. – smichak

+0

Что Gmail делает, не означает его лучшей практики, и gmail позволяет вам загружать по одному, так что вы думаете?Говорить кому-то - это не способ сделать что-то, потому что ваше мнение более справедливо? Вы не предлагаете какое-либо действительное решение технического вопроса, вы просматриваете другую реализацию, в которой вы не предлагаете рабочий код для поддержки своей претензии. Попробуем посмотреть, что автор пытается исправить, а затем добавить к его проблеме больше. – Churk

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