为了账号安全,请及时绑定邮箱和手机立即绑定

损坏的 pdf 解码并通过 Java 服务器套接字发送

损坏的 pdf 解码并通过 Java 服务器套接字发送

当年话下 2022-06-04 09:22:42
我有一个程序可以解码 pdf 并通过套接字发送它。我查看了很多关于堆栈溢出的代码,但无法找到解决问题的方法。android 客户端读取文本,将其转换为字节码并将文件写入应该由 pdfViewer 加载的缓存。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();任何帮助是极大的赞赏!
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

您使用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();

通过这些更改,代码可以为您工作。


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信