Android与普通Java读取同目录/包内文件的技术咨询
嘿,我来帮你把这两个文件读取的问题捋清楚!
1. 普通Java项目中读取与类同目录的文件
如果你的Java类和目标文本/图片文件在同一个目录下,有两种靠谱的方法:
优先用
getResourceAsStream()
不管是本地运行还是打包成JAR,这种方式都不会掉链子。举个例子,假设你的类是MyClass,同目录下有note.txt和avatar.jpg:// 读取文本文件 InputStream txtStream = MyClass.class.getResourceAsStream("note.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(txtStream)); String contentLine; while ((contentLine = reader.readLine()) != null) { System.out.println(contentLine); } // 记得关闭流 reader.close(); txtStream.close(); // 读取图片文件 InputStream imgStream = MyClass.class.getResourceAsStream("avatar.jpg"); BufferedImage image = ImageIO.read(imgStream); imgStream.close();这里直接写文件名就行,因为是相对当前类的路径,不用加额外的层级。
想拿绝对路径的话用
getResource()
如果你需要获取文件的系统路径,可以先拿URL再转成File,但要注意打包成JAR后这种方式会失效(因为JAR里的文件不是真实的系统文件):URL fileUrl = MyClass.class.getResource("note.txt"); File targetFile = new File(fileUrl.getPath()); // 后续用FileReader或FileInputStream读取即可
2. Android项目中读取Java包子目录里的文件
先明确你的目录结构:
handler/ # 包目录 MyClass.java imgs/ test.jpg
你之前的路径写错了,才导致读取失败,和权限没啥关系,下面给你正确的操作方式:
正确的读取姿势
方式一:用当前类的getResourceAsStream()
这是Android里最稳妥的方式,因为APK打包后这些文件会作为类资源存在。路径要从MyClass的位置出发,imgs是handler包的子目录,所以直接写"imgs/test.jpg":
// 读取图片流 InputStream imgStream = MyClass.class.getResourceAsStream("imgs/test.jpg"); // 转换成Bitmap使用 Bitmap testBitmap = BitmapFactory.decodeStream(imgStream); // 用完记得关流 imgStream.close();
你之前写"handler/imgs/test.jpg"相当于多套了一层包名,自然找不到文件。
方式二:用类加载器读取
如果用ClassLoader的话,路径要从类根目录开始,也就是带上完整的包路径:
// 类根目录下的完整路径是"handler/imgs/test.jpg" InputStream imgStream = MyClass.class.getClassLoader().getResourceAsStream("handler/imgs/test.jpg"); Bitmap testBitmap = BitmapFactory.decodeStream(imgStream); imgStream.close();
注意:别用ClassLoader.getSystemResource(),Android的类加载机制和普通Java不一样,这个方法在Android环境下基本没用。
关于权限和打包的疑问
- 权限问题:完全不需要额外权限!这是读取应用自身APK里的资源,和外部存储权限八竿子打不着。
- 打包是否包含:只要你的
imgs目录和Java文件一起放在src/main/java(或对应模块的源码目录)下,Android Studio打包APK时会自动把这些文件包含进去。不过更规范的做法是把非Java文件放在src/main/resources目录下,读取方式是一样的。
内容的提问来源于stack exchange,提问作者KOUSIK MANDAL
相关产品推荐
相关产品推荐

