我正在使用usb-serial-for-android库,我得到了一些奇怪的结果。在与串口连续通信2.5小时并成功读写之后,我得到了这个例外:
exception in UsbManager.openDevice
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.hardware.usb.IUsbManager$Stub$Proxy.openDevice(IUsbManager.java:339)
at android.hardware.usb.UsbManager.openDevice(UsbManager.java:255)
at com.hoho.android.usbserial.driver.UsbSerialProber$1.probe(UsbSerialProber.java:63)
at com.hoho.android.usbserial.driver.UsbSerialProber.probeSingleDevice(UsbSerialProber.java:174)
但是当我强制关闭我的应用程序然后重新启动它时,一切都很好,我的应用程序可以再次与端口通信。
在异常之前提到它可能有用,我得到了这个例外:
java.io.FileNotFoundException: /sdcard/log.txt: open failed: EMFILE (Too many open files)
at libcore.io.IoBridge.open(IoBridge.java:406)
at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
at java.io.FileWriter.<init>(FileWriter.java:58)
at org.example.myapp.util.L.log(L.java:32)
我使用类L
进行日志记录:
public class L {
public synchronized void log(String message){
File logFile = new File("sdcard/log.txt");
if (!logFile.exists())
{
try
{
logFile.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try
{
//BufferedWriter for performance, true to set append to file flag
BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
buf.append(new Date(DateProvider.getInstance().getCurrentDateAsMillisecs()).toString()+": "+message);
buf.newLine();
buf.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
似乎某种缓冲区或缓存已被填满并阻止与设备通信。
如何摆脱异常?
更新
即使我收到异常,写入日志文件也不会失败。它只影响与USB设备的通信。
答案 0 :(得分:1)
您正在打开太多文件。
我发现的问题:
- 你永远不会关闭logFile
- 你在日志函数中打开文件,静态文件会更好,可以在log_init()中初始化;功能。
或者,使logFile成为对象变量并在构造函数中初始化它。
我认为解决这些问题可以解决你的问题。
答案 1 :(得分:1)
创建文件
时,是否可以使用getFilesDir()传递目录路径答案 2 :(得分:1)
public class L {
public static File logFile = new File("sdcard/log.txt");
public synchronized void log(String message){
....
每次调用新文件时,都会从系统请求文件资源。当你继续这样做时,系统会抱怨你打开了太多文件。为避免这种情况,请仅请求文件一次。