flash数据交互
安卓中webview读取html,同时嵌入Flex的SWF,交互
安卓activity与html交互很简单,用javascript接口即可,网上一堆的例子,基本上没多大问题。
在html里面嵌入swf并与之交互就有点麻烦,我用了ExternalInterface没有成功,那位兄台成功了可以交流交流。我用的是FlashVars,
不用改什么配置,html就可以向swf传递数据。
- <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="940" height="600">
- <param name="movie" value="client.swf?v=3">
- <param name="wmode" value="opaque"/>
- <param name="quality" value="high" />
- <param name="FlashVars" value="p1=222&p2=333" />
- <param name="menu" value="false"/>
- <embed src="client.swf" quality="high" wmode="opaque" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" FlashVars="p1=222&p2=333" width="940" height="600">
- </embed>
- </object>
其中可以在FlashVars中指定,也可以通过movie或src中的swf url指定参数,例如上面的v。
Flex代码
- // 需要引入
- import mx.core.Application;
- // 获取 FlashVars 的 Object
- var params:*= Application.application.parameters;
- // 也可以指定某一个参数
- var p1:String = Application.application.parameters.p1;
Okay!
Android使用Webview播放Swf文件,实现与Flash数据交互
HDSwfPlayer
谷歌中国API链接:https://developer.android.google.cn
支持swf播放以及html带swf的播放。
支持swf与js的交互。
自动写入flash信任路径。
提供播放回调。
Android版本不要超过4.3。
目录
如何导入到项目
支持jcenter方式导入。
支持本地Module方式导入。
jcenter方式导入
- 在需要用到这个库的module中的build.gradle中的dependencies中加入
dependencies { compile 'com.yhd.hdswfplayer:hdswfplayer:1.0.0'}
- 1
- 2
- 3
Module方式导入
- 下载整个工程,将hdmediaplayer拷贝到工程根目录,settings.gradle中加入
include ':hdswfplayer'
- 1
- 在需要用到这个库的module中的build.gradle中的dependencies中加入
dependencies { compile project(':hdswfplayer')}
- 1
- 2
- 3
如何使用
本类支持播放.swf文件、.html文件(.html可以包裹.swf文件并实现与android的交互)。
在demo中提供.html文件模板实例,如果需要js与android数据交互,请移步demo参考。
HDSwfPlayerHelper
- 初始化
private void initSwf() { //工程assets目录下swf文件对应的html文件路径,如果直接传入swf文件的路径也可以播放,但是不能与js交互 String assetsPath="file:///android_asset/main.html"; SwfPlayerHelper.getInstance(getApplicationContext()) .setJSCallClassName("jsCallClassName")//设置js调用的类名 .setJSCallMethodName("jsCallMethodName")//设置js调用的方法名 .setWebView(webView)//设置flash播放的载体 .setSwfPlayerCallBack(new SwfPlayerHelper.SwfPlayerCallBack() {//设置播放过程的回调 @Override public void onCallBack(SwfPlayerHelper.CallBackState state, final Object... args) { Log.v(TAG, state.toString()); //收到js调用方法发来的参数字符串信息 if(state== SwfPlayerHelper.CallBackState.JS_CALL_ANDROID_METHOD_WITH_PARAM){ runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),(String)args[0],Toast.LENGTH_LONG).show(); } }); } } }) .playSwf(assetsPath);//传入绝对路径、带file://的绝对路径、url都行}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 为了让退出播放或者在播放时用户转到其它页面后flash不再播放,应该重写用于播放的Activity的onPause和onResume方法,并分别调用webview的隐藏方法”onPause”和”onResume
@Overrideprotected void onResume() { super.onResume(); SwfPlayerHelper.getInstance(getApplicationContext()).onResume();}@Overrideprotected void onPause() { super.onPause(); SwfPlayerHelper.getInstance(getApplicationContext()).onPause();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 更多的操作
//WebView调用js的基本格式为:webView.loadUrl(“javascript:methodName(parameterValues)”)SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJsMethod("jsMethodString");SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJSMethodWithReturn("jsMethodString");
- 1
- 2
- 3
关于我
欢迎 Star Fork交流地址:尹海德(123302687@qq.com)
- 1
- 2
- 3
License
Copyright 2017 yinhaideLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
Github传送门https://github.com/yinhaide/HDSwfPlayer
- 本文已收录于以下专栏:
- Android开源之路
Android通过javascript与flash动画交互
问题描述:当我们在Android应用上加载了flash,然后希望点击flash的相关控件,Android应用能够做出相应。
这就涉及到Android通过javascript与flash动画交互技术。我们实现方案是:新建一个html文件显示flash动画,html文件嵌入javascript函数与flash交互,然后我们我们Android应用通过webview加载html文件,再与该html文件嵌入的javascript函数交互,最后可以实现Android的数据与flash的数据进行通信。有点绕口,不知读者是否看明白了。总之就一句话:html中的javascript函数是中介,Android与flash分别与它进行数据传输即可。
贴代码:
flash.html
[html] view plain copy- <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd;">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script language="JavaScript" type="text/JavaScript">
- var str1 = "hello";
- var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
- function myFlash_DoFSCommand(command, args) {
- var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
- //flash传来的参数,如果有数据传来则调用Android代码的函数,将flash数据传给Android
- if(command =="file1_open"||command=="file2_open"||command=="file3_open"||command=="file4_open"||command=="file5_open"||command=="file6_open")
- {
- //alert(command);
- doFromCommand(command);
- }else{
- //alert(command);
- }
- }
- //下面的代码是网页加载flash的钩子
- if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
- navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
- document.write('<SCRIPT LANGUAGE=VBScript\> \n');
- document.write('on error resume next \n');
- document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
- document.write(' call myFlash_DoFSCommand(command, args)\n');
- document.write('end sub\n');
- document.write('</SCRIPT\> \n');
- }
- //调用android的函数,runJs2Activity是Android代码定义的函数,<span style="font-family: Arial, Helvetica, sans-serif;">playerJs是Android中定义该类的别名,</span><span style="font-family: Arial, Helvetica, sans-serif;">目的是获得flash传来的数据</span>
- function doFromCommand(command){
- window.playerJs.runJs2Activity(command);
- }
- </script>
- </head>
- <body>
- <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,0,0,0"
- WIDTH="100%" HEIGHT="100%" id="myFlash">
- <PARAM NAME=movie VALUE="flash.swf"> <!--这里一堆代码是加载flash动画的-->
- <PARAM NAME=quality VALUE=high>
- <PARAM NAME=bgcolor VALUE=#CCCCCC>
- <param name="allowScriptAccess" value="always" />
- <param name="allowNetworking" value="all">
- <param name="allowFullScreen" value="true">
- <EMBED src="flash.swf" quality=high bgcolor=#CCCCCC WIDTH="100%" HEIGHT="100%" NAME="myFlash" swLiveConnect="true" allowScriptAccess="always" allownetworking="all" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
- </OBJECT>
- <div id="show" style="color:#000000;font-size:30px;margin-left:50px" ></div>
- </body>
- </html>
Android中定义的与thml交互的函数
[java] view plain copy- //类中类:定义js中调用的Android类
- lass RunJavaScript {
- public void runJs2Activity(String str) {
- strFromJs = str;
- mScriptHandler.removeCallbacks(mPlayerRunnable);
- mScriptHandler.postDelayed(mPlayerRunnable, 300);
- }
Android中是Vebview加载html文件的,其中交互类的别名是这样定义的
[java] view plain copy- //给网页文件添加Android与JS交互函数的定义
- mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");
下面是Android完整代码
[java] view plain copy- package com.ideal.swfplayer;
- /************************
- *用来加载flash.html文件*
- ************************/
- import java.io.File;
- import java.util.Timer;
- import java.util.TimerTask;
- import sunvision.database.DBOperation;
- import sunvision.dialog.MatchDialog;
- import sunvision.dialog.TipDialog;
- import sunvision.dialog.VersionDialog;
- import sunvision.file.FileOperation;
- import sunvision.tools.FlashPath;
- import sunvision.tools.IdealSystemProperties;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.os.Build;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.os.SystemClock;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.KeyEvent;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.WindowManager;
- import android.webkit.WebChromeClient;
- import android.webkit.WebSettings;
- import android.webkit.WebSettings.PluginState;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import android.widget.FrameLayout;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainFlashActivity extends Activity {
- private WebView mWebView = null;
- private FrameLayout mFrameLayout = null;
- private ImageView mImageView = null;
- private Timer mTimer = null;
- private Timer mTimer2 = null;
- private WebSettings settings;
- private String strFromJs = "";
- private String TAG = "SwfPlayer";
- private int mLoadingIndex = 0;
- private int mWebViewLoadTimes = 0;
- private int versionloadtime=0;
- private MatchDialog mDialogManager;
- private Handler mHandler = null;
- private FileOperation mFileUnit;
- private boolean isversionup=true;
- Handler mScriptHandler = new Handler() {};
- //加载驱动
- public native void native_initPlayer( ) throws Exception;
- public native void native_prepare() throws Exception;
- public native void native_start();
- public native void native_finish();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_flash);
- //初始化UI界面
- InitUI();
- //加载主界面
- loadSwf(FlashPath.MainPath);
- //等待消息传过来更新界面
- //mHandler.post(task); //启动定时器1秒刷新一次
- mHandler = new Handler() {
- @SuppressLint("Recycle")
- public void handleMessage(Message msg) {
- Log.i(TAG, "PlayerActivity-mLoadingIndex==" + mLoadingIndex);
- switch (msg.arg1) {
- case 0:
- mImageView.setImageResource(R.drawable.flashloading);
- break;
- case 1:
- mTimer.cancel();
- mImageView.setVisibility(View.GONE);
- mImageView.destroyDrawingCache();
- mLoadingIndex = 0;
- break;
- case 6:
- mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, mWebView.getLeft() + 5,mWebView.getTop() + 5, 0));
- mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,mWebView.getLeft() + 5, mWebView.getTop() + 5, 0));
- break;
- default:
- break;
- }
- super.handleMessage(msg);
- }
- };
- }
- //UI界面初始化函数
- private void InitUI() {
- mFileUnit = new FileOperation(getApplicationContext());
- mFileUnit.createFlashPlayerTrust();
- mFrameLayout = (FrameLayout) findViewById(R.id.player_frameLayout);
- mImageView = (ImageView) findViewById(R.id.swf_loading_img);
- mWebView = (WebView) findViewById(R.id.webView_show);
- }
- //加载Flash动画
- @SuppressLint({ "SetJavaScriptEnabled", "Recycle" })
- public void loadSwf(String swfPath) {
- //获得配置函数
- settings = mWebView.getSettings();
- //设置允许与js交互
- settings.setJavaScriptEnabled(true);
- //设置允许文件操作
- settings.setAllowFileAccess(true);
- //设置允许使用Adobe Flash播放视频
- settings.setPluginState(PluginState.ON);
- //设置加载方式是替换加载,而不是新页面加载
- settings.setLoadWithOverviewMode(true);
- //设置编码方式
- settings.setDefaultTextEncodingName("GBK");
- //设置透明背景
- mWebView.setBackgroundColor(0);
- //重写Flash加载辅助函数
- mWebView.setWebChromeClient(new WebChromeClient() {
- public void onShowCustomView(View view, int requestedOrientation,
- WebChromeClient.CustomViewCallback callback) {
- super.onShowCustomView(view, callback);
- //Android SDK版本
- if (Build.VERSION.SDK_INT >= 14) {
- if (view instanceof FrameLayout) {
- mFrameLayout.addView(view,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,Gravity.CENTER));
- mFrameLayout.setVisibility(View.VISIBLE);
- }
- }
- }
- @Override
- public void onHideCustomView() {
- super.onHideCustomView();
- }
- });
- //重写Flash加载主要函数
- mWebView.setWebViewClient(new WebViewClient() {
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- view.loadUrl(url);
- return true;
- }
- //Flash启东时调用
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- mWebViewLoadTimes++;
- }
- //Flash加载完成之后调用
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- //Flash加载之前会有一段时间是白屏,为了掩盖,让五张图片隔时刷新
- if (mWebViewLoadTimes == 1) {
- mTimer = new Timer();
- mTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = 0;
- msg.arg1 = mLoadingIndex;
- mHandler.sendMessage(msg);
- mLoadingIndex++;
- }
- }, 0, 2000);
- //flash偶尔会失去焦点,让flash加载完成之后每隔2秒点击一次界面获得焦点
- mTimer2 = new Timer();
- mTimer2.schedule(new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = 0;
- msg.arg1 = 6;
- mHandler.sendMessage(msg);
- }
- }, 0, 2000);
- } else if (mWebViewLoadTimes >= 2) {
- mWebViewLoadTimes = 0;
- String path = FlashPath.TIP_NO_FILE;
- Intent intent = new Intent(MainFlashActivity.this,NoFileFlashActivity.class);
- intent.putExtra("swfPath", path);
- startActivity(intent);
- MainFlashActivity.this.finish();
- }
- }
- });
- //给网页文件添加Android与JS交互函数的定义
- mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");
- //设置网页能够获得焦点
- mWebView.requestFocusFromTouch();
- mWebView.requestFocus();
- mWebView.setFocusable(true);
- //设置完毕之后加载Flash
- mWebView.loadUrl(swfPath);
- }
- //类中类:定义js中调用的Android类
- class RunJavaScript {
- public void runJs2Activity(String str) {
- strFromJs = str;
- mScriptHandler.removeCallbacks(mPlayerRunnable);
- mScriptHandler.postDelayed(mPlayerRunnable, 300);
- }
- }
- //类中接口:当js调用RunJavaScript时,新开辟线程处理消息,这里是接口
- Runnable mPlayerRunnable = new Runnable() {
- @Override
- public void run() {
- //文件操作行为
- if (strFromJs.equals("file1_open")||strFromJs.equals("file2_open")||strFromJs.equals("file3_open")||strFromJs.equals("file4_open")||strFromJs.equals("file5_open")||strFromJs.equals("file6_open") ) {
- File folder = new File("/mnt/external_sd/");
- //TF卡存在
- if(folder.length()>0){
- Intent intent = new Intent(MainFlashActivity.this,FileListActivity.class);
- intent.putExtra("filename", strFromJs);
- startActivity(intent);
- //TF卡不在
- }else{
- TipDialog mTipDialog = new TipDialog(MainFlashActivity.this, R.style.IdealDialog,R.drawable.no_tf_card,3);
- //设置背景透明度
- WindowManager.LayoutParams lp=mTipDialog.getWindow().getAttributes();
- lp.dimAmount=0.7f;
- mTipDialog.getWindow().setAttributes(lp);
- mTipDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- mTipDialog.show();
- }
- }
- }
- };
- //加载Antivity是调用
- @SuppressLint("Recycle") @Override
- protected void onResume() {
- super.onResume();
- //flash在回到该Activity是能够继续播放
- try {
- mWebView.getClass().getMethod("onResume").invoke(mWebView, (Object[]) null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //Activity停止时调用
- @Override
- protected void onPause() {
- super.onPause();
- //允许flash暂停播放
- try {
- mWebView.getClass().getMethod("onPause").invoke(mWebView, (Object[]) null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //该Activity销毁时调用
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mWebView.destroyDrawingCache();
- mWebView.destroy();
- try {
- mHandler.removeMessages(0);
- mTimer.cancel();
- } catch (Exception e) {
- }
- }
- }
Android加载flash时有一些要注意的问题:Webview加载flash一开始会出现白屏,可以通过刷图的形式掩盖;刚加载完flash,它还无法获得Android用户的焦点事件,必须在代码里面模拟点击屏幕,才可以获得焦点;在运行flash的过程中可能会出现焦点丢失的情况,我的方案是每隔几秒点击屏幕一次;Android加载flash需要flash插件,必须确保插件装好了,但是。即使插件装好了也不能通信,必须要把要加载的flash的路径写到flash插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
flash数据交互的更多相关文章
- Flex数据交互之Remoting
一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...
- Flex数据交互之Remoting[转]
Flex数据交互之Remoting 一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章 ...
- Unity3D和网页数据交互的基本原理
简介: 1.Unity3D的游戏引擎是和编辑器集成在一起的,所有它也是一个制作/开发平台. 2.Unity3D是使用JavaScript.C#作为核心脚本语言来驱动事个游戏引擎. 3.平台可以发布Ex ...
- Android客户端和服务器端数据交互
网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...
- 使用Jquery.AJAX方法和PHP后台数据交互小结
使用jQuery的AJAX方法和后台PHP进行数据交互,交互采用的数据格式JSON格式. 我主要小小的总结了一下,我使用AJAX方法时候遇到一些小小的问题. 第一:在传递数据的时候,传输地址注意是否正 ...
- View与Control间的数据交互
View与Control间的数据交互 1.ViewBag.Name ="Name1" 2.ViewData["VD"] = "view data&qu ...
- .net实现与excel的数据交互、导入导出
应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- JSP数据交互
JSP数据交互 一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...
随机推荐
- Chrome Stylist 插件 (CSS备份)
Stylist 插件还是很好用的,可以给网站自定义CSS样式,(还有个插件叫"油猴子",可以给网页加载自定义JS): 不过麻烦的是,现在的最新版360浏览器不能显示这个插件(这个浏 ...
- TensorFlow实战之实现AlexNet经典卷积神经网络
本文根据最近学习TensorFlow书籍网络文章的情况,特将一些学习心得做了总结,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. 一.AlexNet模型及其基本原理阐述 1.关于AlexNet ...
- curl模拟post和get请求
function _post($url,$post_data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); ...
- JMS学习(一):初识JMS
1.为什么使用JMS(java消息中间件)java message service 为了解决一个系统对服务调用进行解耦(在一个系统需要调用多个服务的时候,需要通过中间件来进行消息进行交流) 2.AMQ ...
- 阿里云CentOS 7系统挂载SSD云盘的教程_Linux
一.查看SSD云盘 sudo fdisk -l Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors ...
- Linux中文件夹的文件按照时间倒序或者升序排列
1.按照时间升序 命令:ls -lrt 详细解释: -l use a long listing format 以长列表方式显示(详细信息方式) -t sort by modification time ...
- 模板语言变量,js变量,js自执行函数之前嵌套调用
1.模板语言变量 前端html页面中展示 {{ nodeIp }} 2.js变量引用模板语言变量 把模板语言变量传递给js,js去执行页面操作(变量的转换,只适用于字符串) var IP = &quo ...
- JDBC底层原理
Class.forName(“com.mysql.jdbc.Driver”)是 强制JVM将com.mysql.jdbc.Driver这个类加载入内存,并将其注册到DriverManager类,然后根 ...
- android/底层获取上下文对象
public class ContextUtils { private static Context applicationContext = null; public static Context ...
- java I/O框架 (一)总览
一.前言 java io框架非常庞大,各种功能的类让人目不暇接,为了系统学习io框架,搜集了各种资料,整理出这篇文章,尽可能详细的讲述java io框架,其中会牵扯到许多信息,不仅包括框架内各种类的方 ...