我有一个解码的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();
任何帮助是极大的赞赏!
您可以使用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文件。
无论何时把二进制数据文本,数据字节被假定根据一些字符编码为文本进行编码,例如拉丁文-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();
随着这些变化的代码为你工作。