我正在开发一个允许使用任何扩展程序加载文件的程序,并使用一些algortihm对其进行加密。
我完成了加密部分,我使用java File
类来加载文件。
但问题是,我无法使用File
对象加载PDF文件。
这是我加载文件的代码,
/**
* Read bytes from a File into a byte[].
*
* @param file The File to read.
* @return A byte[] containing the contents of the File.
* @throws IOException Thrown if the File is too long to read or couldn't be
* read fully.
*/
@SuppressWarnings("resource")
public static byte[] readBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();
// You cannot create an array using a long type.
// It needs to be an int type.
// Before converting to an int type, check
// to ensure that file is not larger than Integer.MAX_VALUE.
if (length > Integer.MAX_VALUE) {
throw new IOException("Could not completely read file " + file.getName() + " as it is too long (" + length + " bytes, max supported " + Integer.MAX_VALUE + ")");
}
// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + file.getName());
}
// Close the input stream and return bytes
is.close();
return bytes;
}
这就是我用Hex加载文件的方式,
File file = new File("F:/filepath.pdf");
System.out.print(BaseEncoding.base16().encode(LoadFile.readBytesFromFile(file)));
当我加载文本文件并打印它时,我得到十六进制输出,当我将该十六进制输出转换为ASCII字符时,我得到了文本文件的实际数据,但在{{1}的情况下不会发生这种情况。文件。
值得一提的是,加载后我与数据无关,我需要做的就是对它进行加密,当我解密时,我应该能够获得实际的数据。 这种情况只适用于文本文件而不是任何其他扩展,如apk,pdf,doc等。
我在Play商店看到一个能够输入任何文件然后使用AES-256对其进行加密的应用并保存它然后当我们解密时,我们会得到原始文件。
任何人都可以向我提供有关如何加密所有类型文件的任何线索,无论其扩展名如何?
以下是我用来首先将pdf文件作为字节加载然后将其保存为另一个pdf文件的测试代码。
PDF
书写,
public static void writeBytesToFile(File theFile, byte[] bytes) throws IOException {
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream(theFile);
bos = new BufferedOutputStream(fos);
}finally {
if(bos != null) {
try {
//flush and close the BufferedOutputStream
bos.flush();
bos.close();
} catch(Exception e){}
}
}
}
此处生成的输出文件为0kb,我不知道原因。