白菜之前的代码基本已经稳定运行了,于是我准备把它改成一个Web项目,采用HTTP API来收发消息,同时将来可能扩展出网页什么的……
在重构的时候遇到一个问题:之前我在绘图类,用nio扫出结算界面需要的所有图片,然后用static代码块包裹:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| static { final Path resultPath = Paths.get(rb.getString("path") + "\\data\\image\\resource\\result"); final List<File> resultFiles = new ArrayList<>(); Images = new ArrayList<>(); Nums = new ArrayList<>(); Mods = new ArrayList<>(); SimpleFileVisitor<Path> resultFinder = new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { resultFiles.add(file.toFile()); return super.visitFile(file, attrs); } };
try { java.nio.file.Files.walkFileTree(resultPath, resultFinder); for (int i = 0; i < 23; i++) { Images.add(ImageIO.read(resultFiles.get(i))); } for (int i = 23; i < 37; i++) { Nums.add(ImageIO.read(resultFiles.get(i))); } for (int i = 37; i < 48; i++) { Mods.add(ImageIO.read(resultFiles.get(i))); } zPP = ImageIO.read(resultFiles.get(48)); zPPTrick = ImageIO.read(resultFiles.get(49)); } catch (IOException e) { logger.error("读取result相关资源失败"); logger.error(e.getMessage()); }
|
这样这些对象只会在这个类第一次被加载的时候生成,避免了每次绘图重复扫描文件夹,降低效率的问题。
然后后面画图的时候,我只需要调用List中的BufferedImage对象
1 2 3
| g2.drawImage(Images.get(1), 1300, 699, null); g2.drawImage(Images.get(2), 1300, 723, null);
|
但是如果我要新加功能就会显得不便:我只能添加z开头的文件名,否则我得把所有的Images.get()后面的数字调一下。。
看了一眼它们的文件名,我觉得ppy应该是在osu启动的时候把皮肤全部加载到内存,然后根据文件名绘制……
看了一下nio,好像能生成文件名,那我把List换成Map好了……