我开发了一个黑莓应用程序,其中我有视频控制来捕获图像然后我将图像保存在我的所需名称的根目录中并显示屏幕...在重新捕获按钮单击我再次捕获图像再一次,我正在删除上一个图像,并使用文件连接在同一路径中以相同的名称保存新图像。我的问题是它在模拟器中的工作正常。但是,当我在设备中测试时,当我尝试删除前一个图像以保存新图像时,它会抛出错误..它会抛出“net.rim.device.api.io.file.fileioexception:该文件当前正在使用中” ..请帮帮我..
@arhimed,@ juanmabaiu 这是在设备中测试时捕获和抛出异常的函数。
public void fieldChanged( final byte[] _raw )
{
try
{
flag ++;
// Create the connection to a file that may or
// may not exist.
FileConnection file = (FileConnection)Connector.open(FILE_NAME + "_front" + EXTENSION);
// If the file exists, increment the counter until we find
// one that hasn't been created yet.
while( file.exists() )
{
file.delete();
file = (FileConnection)Connector.open( FILE_NAME + "_front" + EXTENSION );
}
//FileConnection file_temp = (FileConnection)Connector.open(FILE_NAME + "tempimg" + EXTENSION);
//file_temp.delete();
// We know the file doesn't exist yet, so create it
file.create();
// Write the image to the file
OutputStream out = file.openOutputStream();
out.write(_raw);
// Close the connections
out.close();
file.close();
//Dialog.inform( "Saved to " + FILE_NAME + "_front" + EXTENSION );
}
catch(Exception e)
{
home.errorDialog("ERROR " + e.getClass() + ": " + e.getMessage());
Dialog.inform( "File not saved this time");
}
}
答案 0 :(得分:2)
我也面临这个问题,但是当我试图将图像保存在设备内存而不是SD卡上时。以下代码可以删除图像:
if (file.exists()) {
file.delete();
file.close();
}
答案 1 :(得分:1)
这段代码很臭:
while( file.exists() )
{
file.delete();
file = (FileConnection)Connector.open( FILE_NAME + "_front" + EXTENSION );
}
实际上,如果文件存在,那么您将其删除,但是您忘记了刚刚删除的文件的FileConnection
实例。我想这可能就是原因。您需要立即关闭FileConnection
实例。以下是BB API对此的说法:
同样,可以使用FileConnection.delete()方法删除文件或目录,开发人员应在删除后立即关闭连接,以防止异常访问与不存在的文件或目录的连接。
因此,请尝试使用以下内容:
if (file.exists()) {
file.delete();
file.close();
file = (FileConnection) Connector.open(FILE_NAME + "_front" + EXTENSION);
}
要强调的另一点是代码非常自信/乐观,它不能正确处理极端情况。例如。如果out.write(_raw);
因任何原因失败(例如没有可用的空间)会怎样? FileConnection和OutputStream会被关闭吗?不。所以你需要添加一个finally
块,确保你确实没有留下任何东西。