站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题J2ME中的文件读写问题.

J2ME中的文件读写问题.

摘要: J2ME中的文件读写问题.


if( System.getProperty("microedition.io.file.FileConnection.version" ) == null ){
return;
}

try {
FileConnection fc = (FileConnection)Connector.open("file:///C:/CCC.txt", Connector.READ);
fc.creat();
}catch (java.lang.SecurityException e) {
System.out.println("fc failed!");
e.printStackTrace();
}

首先这段代码会抛出SecurityException 异常,就在Connector.Open()的时候,
那位达人能告诉我为什么么? 难道不能用FileConnection了吗?

另外还有问题是,在模拟器下运行时候, 这个"file:///C:/CCC.txt"的在哪儿里啊 ? 也就是说如果fc.create成功的话,这个ccc.txt应该在哪儿个路径下呢?


java.lang.SecurityException: Application not authorized to access the restricted API



没有权限读这个文件


无权限



你把Connetor.READ 改成 Connector.READ_WRITE ,如果成功的话,ccc.txt应该是在c:盘根目录下.
你还有可能在"file:///c:/ccc.txt"会报错,因为"file:///"好象就代表目标设备(手机)的文件系统的根目录.
文件要建在你的电脑上话,改成"file://c:/ccc.txt".


忘了一条,我也正在用FileConnection, 发现在文件名或者目录名之后还要加一个"/",即是这样.Connector.open("file://C:/CCC.txt/") 或者 Connector.open("file://localhost/CCC.txt/")

有不妥处,请指正.


在许多类型的设备中,不适用。


抛出SecurityException 异常, 说明你没有权限调用这个函数
基于设备安全考虑,一些函数必须经过签名才可以使用
这个在jsr118里头有提到


谢谢 chunandlee() .
试了一下, 还是java.lang.SecurityException: Application not authorized to access the restricted API 异常.

我现在是在NOKIA的模拟器下使用的啊,

那如果要使用FileConnection , 需要如何 "签名" 才能使用呢?



签名需要购买


模拟器无法直接读取电脑硬盘上的数据,你可能需要把程序安装在手机上测试

以前试过,总是报错:“无法找到加载点c:/”,看来模拟器无法读取硬盘

还在找一个可以在模拟器上测试文件读取的方法。。。


要在模拟器中读取文件,可临时将文件打包在jar文件中,然后用getResourceAsStream读取,如:

InputStreamReader reader = new InputStreamReader(this.getClass().getResourceAsStream("cced.dat"));

简要说明:
1、须将要读取的文件(如上cced.dat)包含在project中,编译器会将其压缩打包进jar文件。在NetBeans 5.0中,我没找到直接包含文件的方法,只好先在project中新建一个空白文件cced.dat,然后将实际的cced.dat文件复盖这个空白文件

2、你可以在程序任何地方使用this.getClass().getResourceAsStream(filename),它会在project中找filename这个文件,你可能需要调试一下路径才能正确找到

3、缺点是,调用getResourceAsStream时它会将整个文件读入内存,因此文件不能太大


仔细的看了下FileConnection API 的介绍 (http://www.sf.org.cn/Article/symbiandev/200510/396.html), 发现我的模拟器只支持读文件的操作 Connector.READ, 如果要写文件的话, 就会出现SecurityException了,

现在用Connector.READ的方式打开"file:///c:/CCC.txt" (在我的c:下面存在ccc.txt的).
提示异常:
java.io.IOException: Can not open stream connection to a file that does not exist.
看来这个路径并不是pc上的c:, 那模拟器的c: 在哪儿呢?

当用chun and lee 的方法, 路径写 ("file://C:/CCC.txt/") 时, IOException的说明是 cannot mount c: 什么的. 这个mount是什么意思呢? 是不是说, 您就别想在模拟器上读文件啦?




谢谢hslow, 下午试一下。

呵呵, sun做的东西怎么都 拐弯抹角的呢, 呵呵。


这里面有两个问题,一个是访问权限问题,二是访问路径问题
对于模拟器,也应该是手机平台,我们加安全管理器(SecurityManager)是为了限制手机之外的代码访问手机资源,而不是限制自己访问。对手机上自己的代码,只有使用bootclasspath加载就可以了,JVM会认为是系统代码,而授予AllPermission。

二是访问路径问题,应该把文件放到模拟器中,而不是放到PC上,因为虽然是模拟器,但它是模拟手机的,即真实情况下,你不可能通过手机访问到一个PC上的文件。


to Cathy97, 我想知道的就是

如何把文件放到模拟器上, 是通过把文件放到一个指定路径上,还是需要把文件加在project里面, 然后使用哪种格式(file://...)访问。


做完了, 使用this.getClass().getResourceAsStream("conf.txt")的方法, 我用的Eclipse,所以很容易把文件加到工程里面. 谢谢各位.


↑返回目录
前一篇: j2me平台如何搭建?
后一篇: 游戏中NPC的AI