将base64编码的字符串存储为文件。

5
我有一个Web服务,它返回一个PDF文件的base64编码字符串。
我想将这个文件保存到SD卡中。但是当我尝试这样做时,Adobe Reader告诉我该文件已损坏。显然,我没有正确地保存它。
byte[] pdfAsBytes = Base64.decode(resultsRequestSOAP.toString(), 0);

File filePath = new File(Environment.getExternalStorageDirectory()+"/braodcasts.pdf");
FileOutputStream os = new FileOutputStream(filePath, true);
os.write(pdfAsBytes);
os.close();

resultsRequestSOAP.toString() 的样子是这样的:

JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1JRSkgPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3VudCAxL0tpZHNbIDMgMCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jlc291cmNlczw8L0ZvbnQ8PC9GMSA1IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3IDAgUi9HUzggOCAwIFI+Pi9YT2JqZWN0PDwvSW1hZ2U5IDkgMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldID4+L01lZGlhQm94WyAwIDAgNTk1LjMyIDQxOS41Ml0gL0NvbnRlbnRzIDQgMCBSL0dyb3VwPDwvVHlwZS9Hcm91cC9TL1RyYW5zcGFyZW5jeS9DUy9EZXZpY2VSR0I+Pi9UYWJzL1M+Pg0KZW5kb2JqDQo0IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE0ND4+DQpzdHJlYW0NCnicLY29CgIxEIT7hX2HKVVw3ewluUsr/qCdGLAQC5HzqlPU9wdjcKaaYZhvmZkWGwfnRD3ynclBix18l6T0TRJ1yGOZbY8thg+TYqip+6ct03mC6QV5z7Quhy+muYpWWWjhLEqKCClIYzBTCRHvnuk0w4PJuyi+Uk07MbRWsWV6+2F343XoE1ZPHJi+nDkiaw0KZW5kc3RyZWFtDQplbmRvYmoNCjUgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjEvQmFzZUZvbnQvQUJDREVFK0NhbGlicmkvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDYgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhc

这只是一小段代码!

谢谢


看起来你正在以追加的方式打开它。你是否已经有一个同名的文件在进行追加操作? - MRAB
我不是以追加的方式打开它,每次都是覆盖文件。 - AhmedW
请在文本编辑器中查看PDF文件。第一行应该是类似于“%PDF-1.4”的内容,而最后一行应该是“%%EOF”。 - MRAB
是的,我只是在写入后没有刷新文件。谢谢你的帮助 :) - AhmedW
我刚刚注意到所有的pdf都以“JVBERi0xLj”开头。而我之前只使用了第一部分来检查我的pdf是否有变化... - miva2
1个回答

12

在关闭 FileOutputStream 之前,您可以尝试刷新它。

os.write(pdfAsBytes);
os.flush();
os.close();

3
让我感到惊讶,我本以为close会自动清除所有未写入的字节。 - MRAB
FileOutputStream 中的 flush() 方法不会执行任何操作,它是从 OutputStream 继承而来的。如文档所述:刷新此流。此方法的实现应确保将任何缓冲数据写入。此实现不执行任何操作。 - miva2
我认为它会清除流中可能存在的任何剩余字节,这就解释了为什么它修复了我的问题。 - AhmedW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接