如何将字符串转为InputStream存入R.raw?及音频字符串转回存储至R.raw
嘿,先得给你划个核心重点:Android里的R.raw目录是编译时生成的只读资源目录,运行时根本没办法往里面添加或修改文件哦!所有存到这里的文件都是你在开发阶段放到res/raw文件夹里,编译后打包进APK的,运行时只能读不能写。所以你的两个问题里,「存储到R.raw目录」这个需求是没法实现的,得换个存储位置(比如应用内部存储、外部存储)。下面给你具体的解决思路:
1. 字符串转InputStream并存储(替代R.raw的方案)
如果你的需求是把字符串转成InputStream后持久化存储,完全可以用应用内部存储(默认仅当前应用可访问,安全性高)或者外部存储来替代R.raw:
- 第一步:字符串转InputStream
直接用ByteArrayInputStream就能快速实现:String targetString = "你要转换的字符串内容"; // 指定编码格式避免乱码,推荐UTF-8 InputStream inputStream = new ByteArrayInputStream(targetString.getBytes(StandardCharsets.UTF_8)); - 第二步:将InputStream内容保存到内部存储
用openFileOutput方法把内容写入应用专属的文件目录:try (FileOutputStream fos = openFileOutput("saved_content.txt", Context.MODE_PRIVATE)) { byte[] buffer = new byte[1024]; int bytesRead; // 逐字节读取InputStream并写入文件 while ((bytesRead = inputStream.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); }
2. 音频字符串转回原格式并保存(替代R.raw的方案)
你之前把R.raw的音频转成字符串,大概率是把音频的二进制数据转成了Base64字符串(直接转普通字符串会损坏二进制数据),这里就按Base64的情况给你解决方案:
- 第一步:Base64字符串转回音频字节数组
String audioBase64Str = "你从R.raw音频转换得到的Base64字符串"; // 解码回原音频的字节数组 byte[] audioBytes = Base64.decode(audioBase64Str, Base64.DEFAULT); - 第二步:将字节数组写入新文件
可以选择存到内部存储或外部存储:
如果你的字符串不是Base64格式,需要对应使用你转换时的解码方式,但二进制数据转字符串几乎都会用Base64来避免数据丢失。// 方案1:存到应用内部存储 try (FileOutputStream fos = openFileOutput("new_audio.mp3", Context.MODE_PRIVATE)) { fos.write(audioBytes); } catch (IOException e) { e.printStackTrace(); } // 方案2:存到外部存储(Android 13+需申请READ_MEDIA_AUDIO等权限) File externalMusicDir = getExternalFilesDir(Environment.DIRECTORY_MUSIC); if (externalMusicDir != null) { File newAudioFile = new File(externalMusicDir, "new_audio.mp3"); try (FileOutputStream fos = new FileOutputStream(newAudioFile)) { fos.write(audioBytes); } catch (IOException e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者hyperCoder
相关产品推荐
相关产品推荐

