Вы используете Writer
и Reader
классы и текстовые ориентированные методы:
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(returnMessage + "\n");
и
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
byte[] bytes = message.getBytes();
Это означает, что вы обрабатываете данные как текст.Одного этого достаточно, чтобы повредить двоичные данные, например, файлы PDF.
Всякий раз, когда вы обрабатываете двоичные данные как текст, предполагается, что байты данных кодируются в виде текста в соответствии с некоторой кодировкой символов, например Latin-1 или UTF.-8.Но не все последовательности байтов могут быть должным образом преобразованы в текст, существуют последовательности байтов, для которых нет текста, который бы кодировал эти последовательности, в частности, в соответствии с UTF-8.Затем такие байтовые последовательности обычно преобразуются в символ замены , поэтому исходные последовательности теряются при трансляции.Когда строка снова обрабатывается как байтовый массив, вместо этих последовательностей вы получаете код символа заменяющего символа и файл поврежден.
Более того, вы, скорее всего, рано обрежете прочитанные данные.
BufferedReader.readLine()
считывает только символы до следующего символа, который можно интерпретировать как разделитель строк.Поскольку байты, представляющие разделители строк в соответствии с базовой кодировкой, могут находиться в произвольных позициях в двоичных файлах, readLine()
, скорее всего, даже не прочитал весь (уже поврежденный) PDF-документ.
На основеНа этих подсказках вы изменили свой код, чтобы он не обрабатывал PDF как текст:
Сервер:
File f = new File("Path_to_PDF");
byte[] pdf = new byte [(int)f.length()];
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(pdf,0,pdf.length);
OutputStream os = s.getOutputStream();
os.write(pdf, 0, pdf.length);
os.flush();
Клиент:
int FILE_SIZE = 60000000; //just a large size
int current = 0;
byte[] pdf = new byte[FILE_SIZE];
InputStream is = s.getInputStream();
File someFile = new File(getCacheDir() + "/file.pdf");
FileOutputStream fos = new FileOutputStream(someFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = 0;
int b;
while ((b = is.read()) != -1) {
bos.write(b);
bytesRead++;
}
bos.flush();
bos.close();
fos.close();
С этими изменениямикод работает для вас.