康熙年间古董级代码
直接从Switch相册上传图片到Facebook的功能突然不能用了
找不到解决方案,遂把TF卡拔了出来打算直接把所有相册里的图片都导进硬盘里,正好做一下备份
打开相册文件夹,直接惊呆了
默认的存储先是年份文件夹,然后是月份文件夹,最后居然特喵的还有日期文件夹,这找起来得猴年马月啊
大概就是这种感觉的↓
于是,我有了一个初步的想法,辣就是把这个目录下所有子目录里的图片都抽出来放到另一个地方
当时我就在想,这种垃圾需求应该直接写个bat就能搞定了
在搜索并尝试了15分钟后,我放弃了,然后打开了Intellij
同时,经过观察,Switch存储的截图文件名存在着一定的规律
以这个文件为例: 2019111519023300-3C66B776DB1AA06323037049FACD96D3.jpg
文件名 = 16位时间信息 + -号 + 32位神秘代码 + .扩展名
再根据我的仔细观察,发现32位神秘代码相同的图片都是属于同一个游戏的
因此我决定,既然打开了Intellij,干脆就把自动分类也做完好了
private static void classification(File file, String inputPath, String outputPath) {
File[] fs = file.listFiles();
for (File f : fs) {
if (f.isDirectory())
classification(f, inputPath, outputPath);
if (f.isFile()) {
String s = f.toString();
s = s.substring(s.length() - 36, s.length() - 4);
String ms = nameMap.get(s);
if (ms.length() > 0) s = ms;
(new File(inputPath + s + "\\")).mkdirs();
try {
copyFile1(f.toString(), outputPath + s + "\\" + f.getName());
System.out.println("Moving file: " + f.getName() + " to " + s);
} catch (Exception e) {
System.out.println("Error happened");
}
}
}
}
思路大概就是截取出字符串中的32位神秘代码,根据这个神秘代码分别创建文件夹,将图片分别丢到相应的文件夹内
但是!这样是不够的!看着一大堆神秘代码文件夹我根本没法分清是哪个游戏
于是我就写了个Map,先人肉把神秘代码对应的游戏给匹配上,到时候再分类就会方便很多了
private static void makeMap() {
nameMap.put("0DC6ECE91CF3F6F02BAFC002E3FFBAAD", "火焰纹章风花雪月");
nameMap.put("1CFA4F0AFF14019A30AD91A509EF4A14", "乐高世界");
nameMap.put("1E95E5926F1CB99A87326D927F27B47E", "其他");
nameMap.put("3C66B776DB1AA06323037049FACD96D3", "宝可梦剑");
nameMap.put("4CBEE39065EC88984BABA68A511DDD19", "异度之刃2黄金国");
nameMap.put("5E92066D83C981FCBC05AE4D9711906A", "任天堂会员家庭游戏");
nameMap.put("5F25EBBAB5987964E56ADA5BBDDE9DF2", "宝可梦去吧伊布");
nameMap.put("8AEDFF741E2D23FBED39474178692DAF", "马里奥奥德赛");
nameMap.put("50E2A11CE4BDDC72EF99DF78315D4938", "其他");
nameMap.put("57B4628D2267231D57E0FC1078C0596D", "其他");
nameMap.put("638E7E1EEC4CD8A239243633C0345A07", "健身环大冒险");
nameMap.put("931D32AB2EF79DF207B086838CA778CF", "达芬奇之家");
nameMap.put("16851BE00BC6068871FE49D98876D6C5", "马里奥赛车8");
nameMap.put("9129043EF2AAD7F1157CF852BACB8F7D", "塞尔达传说梦见岛");
nameMap.put("A6C056CABE0E1894654A3769FAF6D11E", "奇诺比奥队长");
nameMap.put("B20FAEC679A3A9320864DC374CFB9713", "星之卡比新星同盟");
nameMap.put("E4B364C957D95017CA1171810D655865", "方可梦");
nameMap.put("EC1951C1CF03769053B9622056A16777", "歧路旅人");
nameMap.put("ECCAE210FD0AA1E799B6F807E179FB9A", "异度之刃2");
nameMap.put("F1C11A22FAEE3B82F21B330E1B786A39", "塞尔达传说荒野之息");
nameMap.put("F6DC99542CAAB4B06860324827349DAD", "节奏海拉鲁");
}
在我玩的游戏变多以后,维护这个Map感觉也会变得比较复杂,不过现在能用就行
然后就是在Java里读文件写文件了
开启写轮眼复制了一段代码,改了改写成了这样
private static void copyFile(String srcPath, String destPath) throws IOException {
// 打开输入流
FileInputStream fis = new FileInputStream(srcPath);
// 打开输出流
FileOutputStream fos = new FileOutputStream(destPath);
// 读取和写入信息
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
// 关闭流 先开后关 后开先关
fos.close(); // 后开先关
fis.close(); // 先开后关
}
但是这个代码跑的实在是太太太太太太慢了,于是就开始考虑找找有没有提速的方法
后来就搜到了可以用Buffered io stream来代替,提速的思路就是以空间换时间,一次性读够一定的字节再统一打包传送,就比每一个字节都得调用一次系统io要快的多了
现在想了想,我好像在自己的研究室项目里也有用过这个东西,但居然已经没有记忆了
修改外加写轮眼后的函数如下
private static void copyFile(String srcPath, String destPath) throws IOException {
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(srcPath));
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] readData = new byte[1024];
int length = 0;
while ((length = fis.read(readData)) != -1) {
fos.write(readData, 0, length);
}
fos.flush();
}
瞬间变快了不少,爽到
最终就可以愉快地把截图按照游戏名来进行分类噜~