Android问题之res/raw和assets的区别及文件大小限制

大模型训练(1):流水线并行 Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。 阅读详情

*res/raw和assets的相同点:

1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。


*res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

 

*读取文件资源:

1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

[java]  view plain copy
  1. InputStream is = getResources().openRawResource(R.id.filename);  

2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

[java]  view plain copy
  1. AssetManager am = null;  
  2. am = getAssets();  
  3. InputStream is = am.open("filename");  

 

补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
1.res/raw目录:
通过反射的方式得到R.java里面raw内部类里面所有的资源ID的名称,然后通过名称获取资源ID的值来读取我们想要的文件。(这个方法我没试过,有用过的同学麻烦发一段代码看看)。
2.assets目录:
getAssets().list("");来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。


Android系统对资源文件(res/raw和assets文件夹下)的大小有限制,默认最大仅支持1M的文件。否则apk程序将报错。如果AssetManager或Resources classes方法来获取InputStream,将抛出java.io.IOException的异常如下DEBUG/asset(1123): Data exceeds UNCOMPRESS_DATA_MAX。

1、大文件解决办法
1.将你的资源文件后缀改成后面aapt忽略压缩的文件后缀。
2.在命令行上使用-0参数来指定不需要压缩的文件后缀,具体配置查看aapt帮助文档。
3.把资源文件分割成多个小于UNCOMPRESS_DATA_MAX(1M)的文件,然后在程序中进行组合。

2、aapt压缩忽略文件说明
由于aapt工具在打包apk文件时,会对资源文件进行压缩以减少apk文件大小。查看aapt工具中的Package.cpp源码,发现有些文件不会被压缩处理:

/* these formats are already compressed, or don't compress well */ 
   static  const  char * kNoCompressExt [ ]  =  { 
   ".jpg",  ".jpeg",  ".png",  ".gif", 
   ".wav",  ".mp2",  ".mp3",  ".ogg",  ".aac", 
   ".mpg",  ".mpeg",  ".mid",  ".midi",  ".smf",  ".jet", 
   ".rtttl",  ".imy",  ".xmf",  ".mp4",  ".m4a", 
   ".m4v",  ".3gp",  ".3gpp",  ".3g2",  ".3gpp2", 
   ".amr",  ".awb",  ".wma",  ".wmv" 
   } ;


实现步骤:

1.先把需要拷贝的大文件分割成若干个大小小于1M的小文件(事先写个程序来分隔或者使用一些工具,我这里直接写了个程序),把这些小文件放在assets文件夹中;

2.在程序启动时我们获取这些小文件的文件名,当然我们得事先规定小文件的命名方式方便我们来获取这些文件名;
3.通过获得的小文件名分别建立输入流来合并成一个大文件,并拷贝到sdcard中。

下面是解决方法中需要用到的一些代码,仅供参考,不妨自己写。分割大文件的方法:

  1. public static void main(String[] args) throws Exception {  
        // 大文件放置的路径  
        String path = "D:/";  
        // 大文件的文件名称  
        String base = "demo";  
        String ext = ".db";  
        // 以每个小文件1024*1024字节即1M的标准来分割  
        int split = 1024 * 1024;  
        byte[] buf = new byte[1024];  
        int num = 1;  
        // 建立输入流  
        File inFile = new File(path + base + ext);  
        FileInputStream fis = new FileInputStream(inFile);  
        while (true) {  
            // 以"demo"+num+".db"方式来命名小文件即分割后为demo1.db,demo2.db,。。。。。。  
            FileOutputStream fos = new FileOutputStream(new File(path + base  
                    + num + ext));  
            for (int i = 0; i < split / buf.length; i++) {  
                int read = fis.read(buf);  
                fos.write(buf, 0, read);  
                // 判断大文件读取是否结束  
                if (read < buf.length) {  
                    fis.close();  
                    fos.close();  
                    return;  
                }  
            }  
            fos.close();  
            num++;  
        }  
    }


获取输入流来合并文件,我们这里以assets文件夹下的文件为例,raw文件夹下如何获取输入流之前的已经讲过。
  1.   
    private void mergeApkFile(Context c, ArrayList<String> partFileList, String dst) throws IOException {  
        if (!new File(dst).exists()) {  
            OutputStream out = new FileOutputStream(dst);  
            byte[] buffer = new byte[1024];  
            InputStream in;  
            int readLen = 0;  
            for(int i=0;i<partFileList.size();i++){  
                // 获得输入流  
                in = c.getAssets().open(partFileList.get(i));  
                while((readLen = in.read(buffer)) != -1){  
                    out.write(buffer, 0, readLen);  
                }  
                out.flush();  
                in.close();  
            }  
            // 把所有小文件都进行写操作后才关闭输出流,这样就会合并为一个文件了  
            out.close();  
        }  
    }  


这样就OK了,大文件已经拷贝到你需要的路径中了。



SAP公司间外协业务流程以及配置说明 阅读详情

相关推荐

Flexible H-Tree(灵活 H 树)与 Multi-Tap 时钟流程解析

通过灵活 H 树与多抽头技术的结合,复杂时钟架构可在保持电气对称性的同时适应不规则布局,为高性能、低功耗 SoC 设计提供高效的时钟网络解决方案。

weixin_45371279的博客 1914

Android中资源文件夹res/raw和assets的使用

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。 2.r...

xiechengfa的技术笔记 491

手把手教你搭建硬件在回路(HIL)仿真系统:从Simulink建模到实时测试

本文详细介绍了如何从零开始搭建硬件在回路(HIL)仿真系统,涵盖Simulink建模、实时仿真、代码生成及调试等关键步骤。通过具体配置示例和优化技巧,帮助开发者解决复杂控制系统验证中的技术难题,提升半实物仿真的效率和可靠性。

weixin_30952535的博客 445

Android中的asserts和res/raw资源目录

1、assets目录 assets目录下称为原生文件,无法通过R资源清单类访问,这类文件在被打包成apk文件时是不会进行压缩的; (1)使用方法AssetManager assets = this.getResources().getAssets(); ((TextView)findViewById(R.id.txAssets)).setText( readStream(assets.o

跨语言,跨平台,跨应用 4932

UniApp实现多端支付功能完整实现指南

支付业务流程多端支付实现安全性保障异常处理最佳实践支付基础知识多端支付实现统一支付封装安全性处理异常处理最佳实践根据具体业务场景选择合适的支付方式注重安全性和用户体验做好异常处理和日志记录持续优化和改进支付流程关注我,持续分享前端项目开发经验!

weixin_63454527的博客 2128

Unity+Hybridclr发布WebGL记录

问题不多,比预想中的顺利,如果遇到问题建议先看Hybridclr的常见问题里面有没有解决方案,没遇到Hybridclr的报错,所以记录的问题里面没有Hybridclr相关的。导出设置里的压缩格式选择了Brotli,而服务器或浏览器不支持,据说是可以拓展服务器配置使支持Brotli,但是由于我本人是IIS小白,所以换了种压缩格式,在publishing Settings修改Compression Fromat为Gzip。3.在浏览器运行之后视图一直闪烁。,修改配置,这个网上很常见。

a598211757的博客 1037

android资源目录---assets与res/raw区别

<br /><br />android资源目录---assets与res/raw的不同<br /> <br />Android 2011-05-24 14:40:21 阅读20 评论0   字号:大中小 订阅<br />assets:用于存放需要打包到应用程序的静态文件,以便部署到设备中。与res/raw不同点在于,ASSETS支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名。<br /> <br />res:用于存放应用程序的资源(如图标、GUI布局等

4万+

微信聊天记录数据库解密实战:从WCDB到sqlcipher4的关键步骤解析

本文详细解析了微信桌面版聊天记录数据库的解密实战过程。通过逆向分析,定位了微信从WCDB框架到sqlcipher4加密的关键步骤,并成功提取了数据库密钥。文章重点介绍了如何通过动态调试、字符串定位等方法,追踪并验证sqlcipher4的加密密钥,最终实现对加密数据库文件的解密操作,为安全研究和数据恢复提供了技术参考。

weixin_29322553的博客 1071

Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。

Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。 res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.fil

legend12300的专栏 2508

DNA pull-down技术避坑指南:从探针设计到质谱验证的完整实验方案

本文提供了一份详尽的DNA pull-down技术实战避坑指南,涵盖从探针设计、生物素标记、磁珠选择与预处理,到结合洗脱优化及下游质谱验证或Western Blot验证的全流程。重点解析了如何通过精细操作降低非特异性结合、提高实验特异性与重复性,并对比了质谱与WB两种验证路径的适用场景,旨在帮助研究者构建稳健可靠的DNA-蛋白质互作研究体系。

weixin_29274337的博客 495

避免踩坑!WIN11 22H2更新后共享打印机失效的终极解决方案

本文详细解析了WIN11 22H2更新后共享打印机失效的问题,特别是常见的0x00000709错误代码。通过系统更新机制分析、错误代码解读,提供从基础到高级的完整解决方案,包括注册表修复、组策略调整和驱动兼容性处理,帮助用户彻底解决打印机共享问题并预防未来故障。

pp12345的博客 533

Android中assets目录和res/raw目录的异同和使用场景

好久没写些什么了,一直比较忙,有近2个月没更新博客了。 今天看到有人问Android中assets目录和raw目录的区别和使用情况。 能提出这个问题的,应该都了解它们的共同点: 它们会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式。 要说区别,当然最直观的就是获取它们的InputStream的API不一样了。 assets:InputStre

cocoooooa的专栏 984

YOLOv8实战:用Labelme标注自定义数据集并训练分割模型(附完整代码)

本文详细介绍了使用Labelme标注自定义数据集并训练YOLOv8实例分割模型的完整流程。从环境搭建、数据标注与格式转换,到模型训练、调优、验证及部署,提供了实战代码和调优建议。文章还探讨了如何结合追踪目标技术,实现视频流中的实例分割与目标追踪,为计算机视觉应用提供了一套可复制的解决方案。

552

android的res/raw和assets文件夹

android开发中可以使用res/raw和assets文件夹来存放不需要系统编译成二进制的文件,例如字体文件等,这两个文件夹有很多相同的地方,例如都可以把文件夹下的东西原封不动的拷贝到应用程序目录下,但是两个文件夹也有一些不同的地方,首先就是访问方式不同,res/raw文件夹不能有子文件夹,文件夹下的资源可以使用getResources().openRawResource(R.raw.id)的方

a5597942的专栏 509

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android中asset和raw区别

res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候 需要AssetManager类。 2.

showkey111的博客 611

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android res/raw文件以及raw与res/assets异同

Android res/raw文件以及raw与res/assets异同 通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。res/raw和res/assets

Rokends的博客 613

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android : assets与res/raw资源目录的区别

在应用的开发中,当我们创建一个新的Android工程后,我们会发现工程中包含了一个目录assets,另外当我们察看一些示例工程的时候,有时会发现在该工程的资源目录下会有一个raw目录(res/raw)。那么assets和raw目录有什么用处呢?下面笔者将给与解释。     assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据。),这些文件将被打

Rollingstonelu的博客 640

android asset大小限制,android自愿目录assets与res/raw的不同

android资源目录---assets与res/raw的不同转载 http://blog.youkuaiyun.com/hshm20517/article/details/6461890assets:用于存放需要打包到应用程序的静态文件,以便部署到设备中。与res/raw不同点在于,ASSETS支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名。res:用...

weixin_39610488的博客 349

assets与res/raw资源目录的区别

1.简介   assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据。),这些文件将被原样打包到APK中应用使用。 2.不同 assets目录下的文件将原样打包,而res/raw目录下的文件,有些文档说会编译为二进制,有些文档说不会。一个原则那就是最好不要将过大的文件打包到APK中,如果你的资源很大,例如视频等等,应该单独存储在...

banyinlve3147的博客 287

android工程下assets与raw文件夹的区别

在android应用的开发中,当我们建一个新的工程后,我们会发现工程中包含了一个目录assets,工程的资源目录下会有一个raw目录(res/raw)。一,相同点:assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据。),这些文件将被打包到APK中应用使用。二,不同点:assets目录 assets目录中文件将不做任何处理被打包。 assets目录

河蟹的博客 4205

Android res/raw文件;raw与res/assets异同

Android res/raw文件以及raw与res/assets异同 通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。res/raw和res/assets目录

l970859633的博客 643

Android资源文件目录assets和raw

assets 资源目录或者叫资产目录,里面存放的是无法直接访问的原生资源。与res属于同级目录。应用程序需要通过AssetsManager以二进制流的形式读取文件。应用程序编译的时候不会在R类中为assets目录下的文件创建索引。raw在res目录下(res/raw)也是用于存放一些资源文件的。应用程序编译的时候raw目录下的资源文件会在R类中生成索引res/raw与assets的比较相同点: 都是

Elven_Shi的专栏 1761

Android中assets目录和res/raw目录的异同区别和使用场景

Android中assets目录和res/raw目录的异同和使用场景 1 作者:futurexiong更新于 07月05日访问(3670)评论(12) 好久没写些什么了,一直比较忙,有近2个月没更新博客了。 今天看到有人问Android中assets目录和raw目录的区别和使用情况。 能提出这个问题的,应该都了解它们的共同点:

Kevin的世界 1803
上一篇: API Levels与Android os_version的对比
下一篇: android App应用的打包及发布
android_xiaozhou
博客等级 码龄14年 14粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值