我使用给定here的示例创建一个Logger
类,该类写入标准输出,但也写入文件。完整的课程如下。
但是,在最简单的主要活动中编译并使用对该记录器的调用之后,我收到以下错误:
E/com.example.alexander.bootservice.Logger: initExternal() -> IOException
java.io.FileNotFoundException: /storage/emulated/0/MyLogger/test.log: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:456)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileWriter.<init>(FileWriter.java:58)
at com.example.alexander.bootservice.Logger.init(Logger.java:34)
at com.example.alexander.bootservice.Logger.log(Logger.java:45)
at com.example.alexander.bootservice.Logger.d(Logger.java:65)
at com.example.alexander.bootservice.MainActivity.onCreate(MainActivity.java:12)
at android.app.Activity.performCreate(Activity.java:5977)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5272)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
既没有创建目录也没有创建日志文件。但错误在哪里?
其他信息:dir.mkdirs()
返回'false'。
package com.example.alexander.bootservice;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by alexander on 12/09/16.
*/
public class Logger {
public static PrintWriter printWriter = null;
public static String LOG_DIR = "/MyLogger";
public static String LOG_FILE = "test.log";
private static void init() {
// Check if external media is writable
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
Log.e(Logger.class.getName(), "Cannot write to external media");
return;
}
if (printWriter == null) {
try {
File dir = new File(Environment.getExternalStorageDirectory() + LOG_DIR);
dir.mkdirs();
printWriter = new PrintWriter(new FileWriter(new File(dir, LOG_FILE), true)); // Line 34
} catch (IOException e) {
Log.e(Logger.class.getName(), "initExternal() -> IOException", e);
}
}
}
private static synchronized int log(int priority, String tag, String msg) {
int res = Log.println(priority, tag, msg);
if (printWriter == null) {
init(); // May be called just once, depending on your requirements
}
printWriter.print(tag + " ");
printWriter.print(msg + "\r\n");
printWriter.flush();
return res;
}
// Duplicates of standard android.util.Log methods:
public static int v(String tag, String msg) {
return log(Log.VERBOSE, tag, msg);
}
public static int v(String tag, String msg, Throwable tr) {
return log(Log.VERBOSE, tag, msg + '\n' + Log.getStackTraceString(tr));
}
public static int d(String tag, String msg) {
return log(Log.DEBUG, tag, msg);
}
public static int d(String tag, String msg, Throwable tr) {
return log(Log.DEBUG, tag, msg + '\n' + Log.getStackTraceString(tr));
}
public static int i(String tag, String msg) {
return log(Log.INFO, tag, msg);
}
public static int i(String tag, String msg, Throwable tr) {
return log(Log.INFO, tag, msg + '\n' + Log.getStackTraceString(tr));
}
public static int w(String tag, String msg) {
return log(Log.WARN, tag, msg);
}
public static int w(String tag, String msg, Throwable tr) {
return log(Log.WARN, tag, msg + '\n' + Log.getStackTraceString(tr));
}
public static int e(String tag, String msg) {
return log(Log.ERROR, tag, msg);
}
public static int e(String tag, String msg, Throwable tr) {
return log(Log.ERROR, tag, msg + '\n' + Log.getStackTraceString(tr));
}
}
答案 0 :(得分:0)
解决方案:必须设置一个权限才能将外部存储写入Manifest:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果File文档中提到了例如......
,那会很好