[英]read file from assets
public class Utils {
public static List<Message> getMessages() {
//File file = new File("file:///android_asset/helloworld.txt");
AssetManager assetManager = getAssets();
InputStream ims = assetManager.open("helloworld.txt");
}
}
我正在使用此代碼嘗試從資產中讀取文件。 我嘗試了兩種方法來做到這一點。 首先,當使用File
我收到FileNotFoundException
,當使用AssetManager getAssets()
方法時無法識別。 這里有什么解決辦法嗎?
這是我在緩沖閱讀擴展/修改以滿足您的需求的活動中所做的
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt")));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
編輯:如果您的問題是關於如何在活動之外進行,我的回答可能沒用。 如果您的問題只是如何從資產中讀取文件,那么答案就在上面。
更新:
要打開指定類型的文件,只需在 InputStreamReader 調用中添加類型,如下所示。
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(getAssets().open("filename.txt"), "UTF-8"));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
...
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
編輯
正如@Stan 在評論中所說,我給出的代碼不是總結行。 mLine
每次通過mLine
被替換。 這就是我寫//process line
的原因。 我假設該文件包含某種數據(即聯系人列表),並且每一行都應該單獨處理。
如果您只想加載文件而不進行任何類型的處理,您將必須使用StringBuilder()
在每次傳遞時總結mLine
並附加每個傳遞。
另一個編輯
根據@Vincent 的評論,我添加了finally
塊。
另請注意,在 Java 7 及更高版本中,您可以使用try-with-resources
來使用最新 Java 的AutoCloseable
和Closeable
功能。
語境
在評論中@LunarWatcher 指出getAssets()
是context
一個class
。 因此,如果您在activity
之外調用它,則需要引用它並將上下文實例傳遞給活動。
ContextInstance.getAssets();
這在@Maneesh 的回答中有解釋。 因此,如果這對您有用,請支持他的回答,因為他指出了這一點。
getAssets()
僅適用於您必須使用Context
其他任何類中的 Activity 。
為 Utils類創建一個構造函數,將活動的引用(丑陋的方式)或應用程序的上下文作為參數傳遞給它。 在 Utils 類中使用 getAsset() 。
遲到總比不到好。
在某些情況下,我很難逐行讀取文件。 下面的方法是迄今為止我發現的最好的方法,我推薦它。
用法: String yourData = LoadData("YourDataFile.txt");
假設YourDataFile.txt位於assets/
public String LoadData(String inFile) {
String tContents = "";
try {
InputStream stream = getAssets().open(inFile);
int size = stream.available();
byte[] buffer = new byte[size];
stream.read(buffer);
stream.close();
tContents = new String(buffer);
} catch (IOException e) {
// Handle exceptions here
}
return tContents;
}
public String ReadFromfile(String fileName, Context context) {
StringBuilder returnString = new StringBuilder();
InputStream fIn = null;
InputStreamReader isr = null;
BufferedReader input = null;
try {
fIn = context.getResources().getAssets()
.open(fileName, Context.MODE_WORLD_READABLE);
isr = new InputStreamReader(fIn);
input = new BufferedReader(isr);
String line = "";
while ((line = input.readLine()) != null) {
returnString.append(line);
}
} catch (Exception e) {
e.getMessage();
} finally {
try {
if (isr != null)
isr.close();
if (fIn != null)
fIn.close();
if (input != null)
input.close();
} catch (Exception e2) {
e2.getMessage();
}
}
return returnString.toString();
}
kotlin 的單行解決方案:
fun readFileText(fileName: String): String {
return assets.open(fileName).bufferedReader().use { it.readText() }
}
您也可以將其用作任何地方的擴展功能
fun Context.readTextFromAsset(fileName : String) : String{
return assets.open(fileName).bufferedReader().use {
it.readText()}
}
只需在任何上下文中調用類
context.readTextFromAsset("my file name")
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("helloworld.txt");
}
catch (IOException e){
Log.e("message: ",e.getMessage());
}
當您在 Activity 類內部調用時, getAssets()
方法將起作用。
如果您在非 Activity 類中調用此方法,則需要從從 Activity 類傳遞的 Context 中調用此方法。 所以下面是您可以訪問該方法的行。
ContextInstance.getAssets();
ContextInstance
可以作為 Activity 類的 this 傳遞。
讀取和寫入文件總是冗長且容易出錯。 避免這些答案,只需使用Okio :
public void readLines(File file) throws IOException {
try (BufferedSource source = Okio.buffer(Okio.source(file))) {
for (String line; (line = source.readUtf8Line()) != null; ) {
if (line.contains("square")) {
System.out.println(line);
}
}
}
}
這是一種讀取資產中文件的方法:
/**
* Reads the text of an asset. Should not be run on the UI thread.
*
* @param mgr
* The {@link AssetManager} obtained via {@link Context#getAssets()}
* @param path
* The path to the asset.
* @return The plain text of the asset
*/
public static String readAsset(AssetManager mgr, String path) {
String contents = "";
InputStream is = null;
BufferedReader reader = null;
try {
is = mgr.open(path);
reader = new BufferedReader(new InputStreamReader(is));
contents = reader.readLine();
String line = null;
while ((line = reader.readLine()) != null) {
contents += '\n' + line;
}
} catch (final Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ignored) {
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException ignored) {
}
}
}
return contents;
}
您可以從文件加載內容。 考慮文件存在於資產文件夾中。
public static InputStream loadInputStreamFromAssetFile(Context context, String fileName){
AssetManager am = context.getAssets();
try {
InputStream is = am.open(fileName);
return is;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String loadContentFromFile(Context context, String path){
String content = null;
try {
InputStream is = loadInputStreamFromAssetFile(context, path);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
content = new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return content;
}
現在你可以通過調用函數來獲取內容如下
String json= FileUtil.loadContentFromFile(context, "data.json");
考慮到 data.json 存儲在 Application\\app\\src\\main\\assets\\data.json
在 MainActivity.java 中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvView = (TextView) findViewById(R.id.tvView);
AssetsReader assetsReader = new AssetsReader(this);
if(assetsReader.getTxtFile(your_file_title)) != null)
{
tvView.setText(assetsReader.getTxtFile(your_file_title)));
}
}
此外,您可以創建單獨的類來完成所有工作
public class AssetsReader implements Readable{
private static final String TAG = "AssetsReader";
private AssetManager mAssetManager;
private Activity mActivity;
public AssetsReader(Activity activity) {
this.mActivity = activity;
mAssetManager = mActivity.getAssets();
}
@Override
public String getTxtFile(String fileName)
{
BufferedReader reader = null;
InputStream inputStream = null;
StringBuilder builder = new StringBuilder();
try{
inputStream = mAssetManager.open(fileName);
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while((line = reader.readLine()) != null)
{
Log.i(TAG, line);
builder.append(line);
builder.append("\n");
}
} catch (IOException ioe){
ioe.printStackTrace();
} finally {
if(inputStream != null)
{
try {
inputStream.close();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
if(reader != null)
{
try {
reader.close();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
Log.i(TAG, "builder.toString(): " + builder.toString());
return builder.toString();
}
}
在我看來最好創建一個界面,但這不是必需的
public interface Readable {
/**
* Reads txt file from assets
* @param fileName
* @return string
*/
String getTxtFile(String fileName);
}
如果您使用除 Activity 以外的任何其他類,您可能想要這樣做,
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( YourApplication.getInstance().getAssets().open("text.txt"), "UTF-8"));
使用 Kotlin,您可以執行以下操作從 Android 中的資產讀取文件:
try {
val inputStream:InputStream = assets.open("helloworld.txt")
val inputString = inputStream.bufferedReader().use{it.readText()}
Log.d(TAG,inputString)
} catch (e:Exception){
Log.d(TAG, e.toString())
}
這是一種在沒有Context
、 Activity
、 Fragment
或Application
情況Context
獲取assets
文件夾中文件的InputStream
的方法。 如何從InputStream
獲取數據取決於您。 在這里的其他答案中有很多建議。
科特林
val inputStream = ClassLoader::class.java.classLoader?.getResourceAsStream("assets/your_file.ext")
爪哇
InputStream inputStream = ClassLoader.class.getClassLoader().getResourceAsStream("assets/your_file.ext");
如果使用自定義ClassLoader
則所有賭注都將關閉。
也許為時已晚,但為了其他尋找桃色答案的人:
public static String loadAssetFile(Context context, String fileName) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
StringBuilder out= new StringBuilder();
String eachline = bufferedReader.readLine();
while (eachline != null) {
out.append(eachline);
eachline = bufferedReader.readLine();
}
return out.toString();
} catch (IOException e) {
Log.e("Load Asset File",e.toString());
}
return null;
}
public void getCityStateFromLocal() {
AssetManager am = getAssets();
InputStream inputStream = null;
try {
inputStream = am.open("city_state.txt");
} catch (IOException e) {
e.printStackTrace();
}
ObjectMapper mapper = new ObjectMapper();
Map<String, String[]> map = new HashMap<String, String[]>();
try {
map = mapper.readValue(getStringFromInputStream(inputStream), new TypeReference<Map<String, String[]>>() {
});
} catch (IOException e) {
e.printStackTrace();
}
ConstantValues.arrayListStateName.clear();
ConstantValues.arrayListCityByState.clear();
if (map.size() > 0)
{
for (Map.Entry<String, String[]> e : map.entrySet()) {
CityByState cityByState = new CityByState();
String key = e.getKey();
String[] value = e.getValue();
ArrayList<String> s = new ArrayList<String>(Arrays.asList(value));
ConstantValues.arrayListStateName.add(key);
s.add(0,"Select City");
cityByState.addValue(s);
ConstantValues.arrayListCityByState.add(cityByState);
}
}
ConstantValues.arrayListStateName.add(0,"Select States");
}
// Convert InputStream to String
public String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb + "";
}
Scanner 類可以簡化這一點。
StringBuilder sb=new StringBuilder();
Scanner scanner=null;
try {
scanner=new Scanner(getAssets().open("text.txt"));
while(scanner.hasNextLine()){
sb.append(scanner.nextLine());
sb.append('\n');
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(scanner!=null){try{scanner.close();}catch (Exception e){}}
}
mTextView.setText(sb.toString());
@HpTerm回答 Kotlin 版本:
私人樂趣 getDataFromAssets(activity: Activity): String {
var bufferedReader: BufferedReader? = null
var data = ""
try {
bufferedReader = BufferedReader(
InputStreamReader(
activity?.assets?.open("Your_FILE.html"),
"UTF-8"
)
) //use assets? directly if in activity
var mLine:String? = bufferedReader.readLine()
while (mLine != null) {
data+= mLine
mLine=bufferedReader.readLine()
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
bufferedReader?.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
return data
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.