我编写的代码将所有pdf文件写入文件夹获取字节并写入.dat文件。实际上它的工作和写入.dat文件中的所有字节但是当我用Acrobat打开该.dat文件时它打开了空白页面。 ... 实际上应该打开第一页,在acrobat中对吗?请帮帮我..谢谢!!由于标题,其他页面无法打开..但首页应该打开吗?
这是我的代码..
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
public class xmlfile1filebytes {
public static void main(String[] args) throws IOException {
File folder = new File ("07072013");
File[] listOfFiles = folder.listFiles();
System.out.println("There are " + listOfFiles.length + " files");
String filesin;
String timeStamp = new SimpleDateFormat("MM-dd-yyyy[HH.mm.ss]")
.format(Calendar.getInstance().getTime());
System.out.println(timeStamp);
BufferedWriter xmlfile = null;
BufferedWriter datfile = null;
String outxmlfile = ("07072013\\" + timeStamp + ".xml");
xmlfile = new BufferedWriter(new FileWriter(outxmlfile));
String outdatfile = ("07072013\\" + timeStamp + ".dat");
datfile = new BufferedWriter(new FileWriter(outdatfile));
int offset = 0;
int size = 0;
for (int i = 0; i < listOfFiles.length; i++) {
File f = listOfFiles[i];
// System.out.println(i + " " + f.getAbsolutePath());
if (f.isFile()) {
filesin = listOfFiles[i].getName();
if (filesin.endsWith("pdf")) {
Path aPath = Paths.get(f.getAbsolutePath());
System.out.println(filesin);
byte[] actualBytes = Files.readAllBytes(aPath);
size = actualBytes.length;
xmlfile.append((i + 1) + ")" + " File = " + filesin + ", Offset = " + offset + ", Size = " + size + "\n");
offset = offset + size;
xmlfile.newLine();
String s = new String(actualBytes);
datfile.append(s);
datfile.newLine();
File datfileinfolder = new File ("07072013\\" + timeStamp + ".dat");
long datfilesize = datfileinfolder.length();
final int BLOCK_SIZE = 200 * 1024;
for (int curBlock = 0; curBlock < actualBytes.length; curBlock += BLOCK_SIZE) {
String toWrite = new String(
Arrays.copyOfRange(actualBytes, curBlock, Math.min(curBlock + BLOCK_SIZE, actualBytes.length)));
String suffix = "";
if (curBlock > 0) {
//append underscores other file information and then perform writes
suffix = String.valueOf(curBlock / BLOCK_SIZE);
}
BufferedWriter datfile1 = null;
String outdatfile1 = ("07072013\\" + suffix + timeStamp + ".dat");
datfile1 = new BufferedWriter(new FileWriter(outdatfile1));
datfile1.append(toWrite);
datfile1.close();
}
//long datfilesizeinkb = datfilesize /1024;
//System.out.println("Size = " + datfilesizeinkb);
}
}
}
datfile.close();
xmlfile.close();
}
}
答案 0 :(得分:0)
您正在使用Writer
,其中OutputStream
是正确的选择。 Writer会进行字符编码,也可能是行结束转换,这可能会损坏二进制数据。
顺便说一下:为你编写的每个数据块重新打开和关闭输出文件效率很低。
答案 1 :(得分:0)
一些高级代码,但在某些地方却错了。二进制数据应使用OutputStream,而不是Writer。 new String(actualBytes);
使用当前的平台编码,并且希望将其与平台无关。在通常为UTF-8的Linux上,并且在UTF-8中,并非所有字节序列都形成合法的字符串,更好new String(actualBytes, "Windows-1252");
- 但这是黑客攻击。
出于您的目的, .zip 文件似乎最佳。简单地将多个PDF文件的内容添加到一个文件中将不会创建整个文件。如果你给它结尾.pdf,也许一些PDF查看器可能会显示它(即使最后有垃圾:其他PDF)。
要创建zip文件,请使用带有ZipFile / ZipOutputStream的旧API,或使用Java {的Zip FileSystem。