Java的Apache FileUtils的readFileToString和writeStringToFile的问题

我需要parsing一个Java文件(实际上是.pdf)到一个string,并返回到一个文件。 在这些过程中,我会将一些补丁应用于给定的string,但在这种情况下,这并不重要。 我开发了以下JUnittesting用例:

String f1String=FileUtils.readFileToString(f1); File temp=File.createTempFile("deleteme", "deleteme"); FileUtils.writeStringToFile(temp, f1String); assertTrue(FileUtils.contentEquals(f1, temp)); 

此testing将文件转换为string并将其写回。 但是testing失败了。 我认为这可能是因为编码,但是在FileUtils中没有关于这个的详细信息。 任何人都可以帮忙 谢谢!

添加为进一步的未知数:为什么我需要这个? 我在一台机器上有非常大的pdf,在另一台机器上复制。 第一个是负责创build这些PDF文件。 由于第二台机器的低连接性和pdf的大尺寸,我不想同步整个pdf,但只有更改完成。 要创build补丁程序/应用它们,我正在使用谷歌程序库DiffMatchPatch。 这个库在两个string之间创build补丁。 所以我需要加载一个pdf到一个string,应用一个生成的补丁,并把它放回到一个文件。

PDF不是一个文本文件。 解码(转换成Java字符)和重新编码未编码文本的二进制文件是不对称的。 例如,如果输入字节流对于当前编码是无效的,那么可以确定它不会正确地重新编码。 总之 – 不要这样做。 改为使用readFileToByteArray和writeByteArrayToFile 。

只是几个想法:

  1. 其中一个文件中可能实际存在一些BOM(字节顺序标记)字节,这些字节在读取或写入时被剥离。 文件大小是否有差异(如果是BOM,差异应该是2或3个字节)?

  2. 换行符可能不匹配,具体取决于创建文件的系统,即一个可能有CR LF,而另一个只有LF或CR。 (每行中断1个字节)

  3. 根据JavaDoc,两种方法都应该使用JVM的默认编码,这两种操作应该是相同的。 但是,尝试使用显式设置的编码进行测试(使用System.getProperty("file.encoding") )将查询JVM的默认编码。

埃德Staub awnser指出,为什么我的解决方案不工作,他建议使用字节,而不是字符串。 在我的情况下,我需要一个字符串,所以我找到的最终工作解决方案如下:

 @Test public void testFileRWAsArray() throws IOException{ String f1String=""; byte[] bytes=FileUtils.readFileToByteArray(f1); for(byte b:bytes){ f1String=f1String+((char)b); } File temp=File.createTempFile("deleteme", "deleteme"); byte[] newBytes=new byte[f1String.length()]; for(int i=0; i<f1String.length(); ++i){ char c=f1String.charAt(i); newBytes[i]= (byte)c; } FileUtils.writeByteArrayToFile(temp, newBytes); assertTrue(FileUtils.contentEquals(f1, temp)); } 

通过使用byte-char之间的转换,我有转换的对称性。 谢谢你们!

试试这个代码…

  public static String fetchBase64binaryEncodedString(String path) { File inboundDoc = new File(path); byte[] pdfData; try { pdfData = FileUtils.readFileToByteArray(inboundDoc); } catch (IOException e) { throw new RuntimeException(e); } byte[] encodedPdfData = Base64.encodeBase64(pdfData); String attachment = new String(encodedPdfData); return attachment; } //How to decode it public void testConversionPDFtoBase64() throws IOException { String path = "C:/Documents and Settings/kantab/Desktop/GTR_SDR/MSDOC.pdf"; File origFile = new File(path); String encodedString = CreditOneMLParserUtil.fetchBase64binaryEncodedString(path); //now decode it byte[] decodeData = Base64.decodeBase64(encodedString.getBytes()); String decodedString = new String(decodeData); //or actually give the path to pdf file. File decodedfile = File.createTempFile("DECODED", ".pdf"); FileUtils.writeByteArrayToFile(decodedfile,decodeData); Assert.assertTrue(FileUtils.contentEquals(origFile, decodedfile)); // Frame frame = new Frame("PDF Viewer"); // frame.setLayout(new BorderLayout()); }