损坏的PDF解码,并在Java服务器套接字发送

问题描述 投票:0回答:1

我有一个解码的PDF和通过套接字发送它的程序。我看到了很多关于堆栈溢出代码,但一直没能找到的东西,修复该问题。 Android客户端读取文本,将其转换成字节码和文件写入到应该由一个PDF查看器加载缓存。在PDF浏览器的任何测试工作,以及所传达给客户的信息,但是当通过套接字发送过来的文件时,PDF已损坏。该文件是在创建事实,并且会返回一个错误,该PDF是空的,如果没有字节写入。我排除错误捕获和其他信息,因为代码的其余部分是不相关的:

服务器:

File f = new File(PATH_TO_PDF);
FileInputStream is = new FileInputStream(f);
byte[] pdf = new byte[(int)(f.length())];

int a;
int count = 0;
while ((a=is.read())!= -1){
       pdf[count] = (byte)a;
       count++;
       }

is.close();
String result = "";

for (int i = 0; i < pdf.length; i++) {
     returnMessage.append(pdf[i]);
     }

OutputStream os = s.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(returnMessage + "\n");
System.out.println("Message sent to the client is "+ returnMessage);
bw.flush();

//rest is closing socket stuff


客户:

 InputStream is = s.getInputStream();
 InputStreamReader isr = new InputStreamReader(is);
 BufferedReader br = new BufferedReader(isr);
 String message = br.readLine();
 s.close();

 byte[] bytes = message.getBytes();

 File someFile = new File(getCacheDir() + "/file.pdf");
 FileOutputStream fos = new FileOutputStream(someFile);
 fos.write(bytes);
 fos.flush();
 fos.close();

任何帮助是极大的赞赏!

java android sockets pdf networking
1个回答
0
投票

您可以使用WriterReader类和文本行导向的方法:

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文件。

无论何时把二进制数据文本,数据字节被假定根据一些字符编码为文本进行编码,例如拉丁文-1或UTF-8。但是,并非所有的字节序列能够适当地转换为文本,存在用于其中不存在文本这将根据UTF-8编码的那些序列,特别的字节序列。这样的字节序列然后通常是转化到一个replacement character,所以原来的序列在翻译丢失。当字符串作为字节数组再次处理,而不是这些序列你替换字符的字符代码,并且文件被损坏。

此外,你最有可能切断读取数据早。

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();

随着这些变化的代码为你工作。

© www.soinside.com 2019 - 2024. All rights reserved.