as3文件操作

使用flash/flex进行air或手机应用的开发时,有时会需要对文件和文件夹进行操作,需要综合使用File,FileStream和FileMode类。
0.自定义目录:
var file:File = new File();
file.nativePath = “C://test//t.txt”;
1,写入到文件

var fileObj:File = File.documentsDirectory.resolvePath(“t.txt”);
var fs:FileStream = new FileStream();
fs.open(fileObj, FileMode.WRITE);
fs.writeUTFBytes(“hangge.com”);
fs.close();

2,更新文件内容
(1)下面例子在第5个字节开始覆写内容

var fileObj:File = File.documentsDirectory.resolvePath(“t.txt”);
var fs:FileStream = new FileStream();
fs.open(fileObj, FileMode.UPDATE);
fs.position = 5;
fs.writeUTFBytes(“.yuhang”);
fs.close();
(2)下面例子将内容添加到文件末尾

var fileObj:File = File.documentsDirectory.resolvePath(“t.txt”);
var fs:FileStream = new FileStream();
fs.open(fileObj, FileMode.APPEND);
fs.writeUTFBytes(“www.hangge.com”);
fs.close();

3,读取文件内容

var fileObj:File = File.documentsDirectory.resolvePath(“t.txt”);
var fs:FileStream = new FileStream();
fs.open(fileObj, FileMode.READ);
var str:String = fs.readUTFBytes(fs.bytesAvailable);
fs.close();

4,移动文件(重命名文件)

var originalFile:File = File.documentsDirectory.resolvePath(“t.txt”);
var newDir:File = File.applicationStorageDirectory.resolvePath(“t.txt”);
originalFile.moveTo(newDir);

5,复制文件

var originalFile:File = File.documentsDirectory.resolvePath(“t.txt”);
var newDir:File = File.applicationStorageDirectory.resolvePath(“t.txt”);
originalFile.copyTo(newDir);

6,删除文件

var fileObj:File = File.documentsDirectory.resolvePath(“t.txt”);
if(fileObj.exists){
fileObj.deleteFile();
}

7,创建文件夹

var fileDir:File = File.documentsDirectory.resolvePath(“t”);
fileDir.createDirectory();

8,移动文件夹

var originalDir:File = File.documentsDirectory.resolvePath(“t”);
var newDir:File = File.applicationStorageDirectory.resolvePath(“t”);
originalDir.moveTo(newDir);

9,复制文件夹

var originalDir:File = File.documentsDirectory.resolvePath(“t”);
var newDir:File = File.applicationStorageDirectory.resolvePath(“t”);
originalDir.copyTo(newDir);

10,删除文件夹

var fileDir:File = File.documentsDirectory.resolvePath(“t”);
if(fileDir.exists){
fileDir.deleteDirectory();
}

参考资料:
http://www.hangge.com/blog/cache/detail_502.html
https://blog.csdn.net/zdingxin/article/details/6635376

As3文本密码及限制输入

pwd.displayAsPassword=true;
my_txt.restrict = “A-Z 0-9”;//仅允许在文本字段中输入大写字符、空格和数字
my_txt.restrict = “^a-z”;//包含除小写字母之外的所有字符
my_txt.restrict = “\\-\\^”;//以使用反斜杠输入 ^ 或 – 的本义。 认可的反斜杠序列为 \-、\^ 或 \\。 反斜杠在字符串中必须是一个本义字符,因此在 ActionScript 中指定时必须使用两个反斜杠。 这段代码只包含短划线 (-) 和尖号 (^)
my_txt.restrict = “A-Z^Q”;//可在字符串中的任何地方使用 ^,以在包含字符与排除字符之间进行切换。 这段代码只包含除大写字母 Q 之外的大写字母
my_txt.restrict = ” -~”;//只包含从 ASCII 32(空格)到 ASCII 126(代字号)之间的字符
my_txt.restrict = “a-zA-Z\u4e00-\u9fa5″,这样是代表只能够输入大小写的英文字母和中文

As3与jsp交互

//test.jsp
<%@page import="javaBean.simpleBean"%>
<% out.clear(); //避免出现多余html代码 request.setCharacterEncoding("UTF-8"); //避免中文乱码 response.setCharacterEncoding("UTF-8"); simpleBean a=new simpleBean(); out.println(a.returnName("1234")); %>
~~~~~~~~~~~~~~~~~~~~~~
//simpleBean.java
package javaBean;

public class simpleBean {

public String returnName(String name)
{
if(name.equals(“”))
{
return “&data=hello guest”;
}else{
return “&data=hello”+name;
}
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~

//as3 code LoginPage.as关联到fla中,定义了一个btn和txt
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.system.System;

/**
* …
* @author amyblog.ml
*/
public class LoginPage extends Sprite
{

public function LoginPage()
{
super();
main();
}

private function main():void
{
System.useCodePage=true;
btn.addEventListener(MouseEvent.CLICK,loadMss);
}

private function loadMss(e:MouseEvent):void
{
var postLoader:URLLoader=new URLLoader();
var request:URLRequest=new URLRequest();
var vars:URLVariables=new URLVariables();
vars.s1=”flash”;
vars.s2=”flex”;
request.url=”http://https://https://cfzy.site:8080/myproject/test.jsp”;
request.method=URLRequestMethod.POST;
request.data=vars;//这里的data可以是一个Object,或者Array
postLoader.load(request);
postLoader.addEventListener(Event.COMPLETE,completeFun);
}

private function completeFun(e:Event):void
{
txt.text = “test:” + (e.currentTarget as URLLoader).data;
trace(e.target.data);
//trace((e.currentTarget as URLLoader).data);
}

}

}

JavaScript 与 ActionScript 3.0 交互的一些问题

原文地址:http://www.coolcode.cn/show-291-1.html
这两天做基于 Flash9(ActionScript 3.0)的 JavaScript PHPRPC 3.0 客户端时遇到了一些 JavaScript 与 ActionScript 3.0 交互的一些问题,这些问题在网上基本上都没有找到答案,最后通过不断的尝试才得以解决,因此在这里总结出来,希望能给遇到同样问题的同志们一些帮助。
JavaScript 跟 ActionScript 3.0 交互也是通过 flash.external.ExternalInterface 这个类,不过与跟 Flash 8 中跟 ActionScript 2.0 交互所使用的 flash.external.ExternalInterface 还是有所不同的。最大的不同就是 ExternalInterface.addCallback 方法在 ActionScript 3.0 中只有 2 个参数了,而不再有 instance 这个参数。下面要讨论的这些问题都是关于 Flash 9 中 ActionScript 3.0 的。
先来说最常遇到的问题,就是在 JavaScript 调用 Flash 中的 ActionScript 方法时报告该方法不存在。这个问题是跟 Flash 中执行 ExternalInterface.addCallback 的时间有关的,ExternalInterface.addCallback 必须要在 HTML 的完全载入之后也就是 window.onload 事件执行后才可以执行,否则,它所发布的方法都无法在 JavaScript 中调用。
解决这个问题的方法在 Flash 9 的 ActionScript 3.0 帮助中有个例子,里面包含了这个解决方法,就是首先在 js 中设置两个标志,例如 jsReady 和 swfReady 这两个变量作为标志,开始都设置为 false,当 window.onload 时,设置 jsReady 为 true,在 Flash 中一开始检查 JavaScript 中的这个 jsReady 标志是否是 true(通过 ExternalInterface.call 方法调用 JavaScript 中的返回这个标志的一个函数),如果不为 true,就设置一个定时器,经过一段时间后(例如 50 或 100 毫秒)重复这个检查这个标志,一旦为 true,则执行 ExternalInterface.addCallback 来发布 ActionScript 要提供给 JavaScript 调用的函数或方法,执行完所有的 ExternalInterface.addCallback 后,通过 ExternalInterface.call 方法调用 JavaScript 中的设置 swfReady 标志的函数设置 swfReady 为 true。之后,当 JavaScript 检测到 swfReady 为 true 后,再调用 ActionScript 中的方法就不会遇到上的说的这个问题了。
如果简单一点的调用这样还可以,如果是有好多这样的调用就比较麻烦了。我是通过建立两个执行队列:jsTaskQueue 和 swfTaskQueue,当在 jsReady 为 true 之前,如果有要调用 ActionScript 的操作,就把这个操作放到 jsTaskQueue 中,当 js 在 window.onload 中执行设置 jsReady 时,把这个队列中的任务取出来执行,当 jsReady 为 true 后 swfReady 为 true 之前,如果有要调用 ActionScript 的操作,就把这个操作放到 swfTaskQueue 中,当 ActionScript 通过 ExternalInterface.call 方法调用 JavaScript 中的设置 swfReady 标志的函数设置 swfReady 为 true 时,把这个队列中的任务取出来执行。当 jsReady 和 swfReady 都为 true 时,那么如果有要调用 ActionScript 的操作,直接运行就可以了。通过这种方法把这些任务封装后,使用这些封装之后的操作,在编写代码就可以按照顺序(而不是异步)来写了,执行时也是顺序执行啦。
除了这个最常遇到的问题之外,还有两个关于 IE 上的问题。
如果你是通过 JavaScript 动态创建的 Flash 标签然后插入到 html 中的话(例如通过 innerHTML 赋值的方法或者 appendChild 的方法),很可能你这个操作是在 window.onload 之后才进行,在这种情况下,其它浏览器可以正常进行 JavaScript 和 ActionScript 3.0 的交互,IE 就不行。所以,为了保险,最好的方法就是直接把 flash 标签的 html 写在 html 的 body 中,或者用 JavaScript 的 document.write 来写入 html 的 body 中,后面这种方法对于 IE 来说更合适一些,因为这样的话,可以不需要点击激活 Flash。
另一个问题是,不要在 ActionScript 中发布名字为 invoke 的方法,否则在 IE 中,JavaScript 调用该方法时会出错。
最后一个问题,网上可以查到的比较多了,就是不要把 flash 放到 form 中,否则在 IE 中,JavaScript 调用 ActionScript 时会出错。当然,网上也给出了一个解决这个问题的脚本,不过那个貌似是针对 Flash 8 的 ActionScript 2.0 的,我没有试过,不知道对 ActionScript 3.0 是否同样有效。
11 月 23 日补充:
今天又发现一个问题,如果在 ActionScript 中通过 ExternalInterface.call 调用 JavaScript 时,如果传递的参数有字符串,那么字符串中如果包含 \ 符号的话,那么将会调用失败。这个也是 ActionScript 和 JavaScript 交互的一个 bug,解决办法是,对传递的字符串先进行一下处理在传递,处理方法很简单,比如要传递的数据是 data,将它进行一次 data.replace(/\\/, “\\\\”) 替换之后,在传递给 JavaScript 就可以了。
8.28号补充:
注意生成的swfobject的id是var attributes = {id:”uploadimg”};而不是embedswf里定义的id
9.1号补充:
div.hide()以后就调用不到flash的函数了,可以将flash设置成1*1大小
jquery的dom对象回调不到flash的函数,必须用document.getElementById的形式才可以调到

As3指定宽度截断文本

import flash.text.TextField;
var w:Number=100; //指定宽度
var t:TextField = new TextField();
var s:String =  "12345678901234567890";
t.text =s;
addChild(t);
t.x =100;
t.y =100;

getFinalTxt(w);

function getChar(_str:String , _l:int):String
{
	var _ba:ByteArray = new ByteArray ;
	_ba.writeMultiByte (_str, "");
	if (_ba.length < _l) return _str;
	_ba.position = 0;
	return _ba.readMultiByte(_l-2, "")+"...";
}

function getFinalTxt(len:Number):void
{
	var i:int=s.length;
	while(t.textWidth>len)
	{
		t.text = getChar(s,--i);
		trace(t.text,t.textWidth);
	}
	t.width = w;
}
/*output
12345678901234567... 111
1234567890123456... 105
123456789012345... 99
*/

关于as3替换字符串

//replace all
var str:String="AAABBBCCCAAA";
str=str.split("AAA").join("DDD");
//结果str为:DDDBBBCCCDDD

//replace first
var str:String="AAABBBCCCAAA";
str=str.replace("AAA","DDD");
//结果str为:DDDBBBCCCAAA