我的本地文件夹中有几个文件。我想将文件名作为键存储,并将相应文件的内容存储为值。
HashMap<String,String> hm = new HashMap<String,String>();
hm.put(filename,filecontent);
有人能告诉我这是正确的方法吗?
答案 0 :(得分:2)
将文件内容存储为String时,必须确保编码得到遵守,我建议使用字节数组:
Map<String, byte[]> hm = new HashMap<String, byte[]>();
:根据您操作的文件数量,您可能需要考虑使用文件流以避免将所有内容保留在内存中。
答案 1 :(得分:0)
您想要的是几个步骤。
我假设您已将文件名设为String
。
HashMap<String, byte[]> hm = new HashMap<String, byte[]>(); //Initialize our hashmap with String as key, and byte array as data (binary data)
FileInputStream fileStream = new FileInputStream(filename); //Get a stream of the file
byte[] buff = new byte[512]; //A buffer for our read loop
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); //Where to write buff content to, we can convert this into the output byte array with toByteArray()
while(fileStream.read(buff) > 0) { //read 512 bytes of file at a time, until end of file
byteStream.write(buff); //write buff content to byte stream
}
fileStream.close(); //Close our file handle, if we don't do this we may not be able to see changes!
hm.put(filename, byteStream.toByteArray()); //insert filename and filecontent to hashmap
然而,正如其他人所说,这不太理想。您在内存中保存多个文件一段任意时间。你可以吃掉很多ram并且没有意识到这样做,并且很快就会遇到内存异常。
你最好只在需要的时候阅读文件内容,所以没有一个整个文件坐在你的公羊里,因为上帝知道多久。我可以看到存储文件内容的唯一合理的原因是,如果你正在阅读它,你可以负担ram将文件缓存在内存中。
答案 2 :(得分:0)
二进制数据更新
HashMap<String,String> hm = new HashMap<String, byte[]>();
final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);
public void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
String name = fileEntry.getName();
byte[] fileData = new byte[(int) fileEntry.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(fileEntry));
dis.readFully(fileData);
dis.close();
hm.put(name,fileData);
}
}
}
针对OP的Zip文件进行了测试:
public static void main(String[] args) throws FileNotFoundException, IOException {
File file = new File("D:\\try.zip");
System.out.println(file.length());
byte[] fileData = new byte[(int) file.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(file));
dis.readFully(fileData);
dis.close();
}