关键技术:
File类的构造方法的参数可以是文件的相对路径,也可以是文件的绝对路径,它被当做File对象的抽象路径。
File类的getPath方法把抽象路径中的文件分隔符用系统默认文件分隔符替换后返回。windows默认分隔符是"\",Linux和UNIX默认分隔符为"/"
File类的getAbsolutePath方法获得文件的绝对路径。
File类的isAbsolute方法判断File对象的抽象路径是否为绝对路径。
File类的toURI方法获得File对象的URI,以“file:”协议开头。
File对象可以指向一个目录,isDirectory方法返回它是否指向目录,isFile方法返回它是否指向一个具体文件。
File对象指向的文件可以不存在,exists方法返回它指向的文件是否存在。
package book.io;
import java.io.File;
import java.util.Date;
/**
* 获取文件的基本信息
*/
public class GetFileInfos {
public static void println(String s){
System.out.println(s);
}
public static void main(String[] args) {
//用文件路径新建一个文件对象。路径可以是绝对路径也可以是相对路径
//传入的参数被当作为文件的抽象路径
File file = new File("C:/temp/newTemp.txt");
//获取文件的名字,不包括路径
println("文件名:\t" + file.getName());
//将抽象路径名中的文件分隔符用系统默认分隔符替换
println("文件路径:\t" + file.getPath());
//获取文件的绝对路径
println("绝对路径:\t" + file.getAbsolutePath());
//获取抽象路径名的父抽象路径
println("父目录:\t" + file.getParent());
println("文件是否存在:\t" + file.exists());
println("是否可读:\t" + file.canRead());
println("是否可写:\t" + file.canWrite());
println("是否是隐藏文件:\t" + file.isHidden());
println("是否是普通文件:\t" + file.isFile());
println("是否是文件目录:\t" + file.isDirectory());
println("文件路径是否是绝对路径:\t" + file.isAbsolute());
println("文件路径的URI:\t" + file.toURI());
println("文件最后修改时间:\t" + new Date(file.lastModified()));
println("文件大小:\t" + file.length() + " bytes");
}
}
运行结果:
文件名: newTemp.txt
文件路径: C:\temp\newTemp.txt
绝对路径: C:\temp\newTemp.txt
父目录: C:\temp
文件是否存在: false
是否可读: false
是否可写: false
是否是隐藏文件: false
是否是普通文件: false
是否是文件目录: false
文件路径是否是绝对路径: true
文件路径的URI: file:/C:/temp/newTemp.txt
文件最后修改时间: Thu Jan 01 08:00:00 CST 1970
文件大小: 0 bytes
package cn.com.dne.activity.ceshi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class LinearActivity extends Activity implements OnClickListener{
ImageButton start;//播放、暂停按钮
ImageButton stop;//停止按钮
ActivityReceiver activityReceiver;
int status = 1;//当前的状态,1没有声音播放 ,2 正在播放声音,3暂停
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {//重写的onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main);//设置当前的用户界面
start = (ImageButton) this.findViewById(R.id.start);//得到start的引用
stop = (ImageButton) this.findViewById(R.id.stop);//得到stop按钮的引用
start.setOnClickListener(this);//为按钮添加监听
stop.setOnClickListener(this);//为按钮添加监听
activityReceiver = new ActivityReceiver();//创建BroadcastReceiver
IntentFilter filter = new IntentFilter();//创建IntentFilter过滤器
filter.addAction("wyf.ytl.update");//添加Action
registerReceiver(activityReceiver, filter);//注册监听
Intent intent = new Intent(this, MyService.class);//创建Intent
startService(intent);//启动后台Service
}
public class ActivityReceiver extends BroadcastReceiver{//自定义的BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {//重写的onReceive方法
// TODO Auto-generated method stub
int update = intent.getIntExtra("update", -1);//得到intent中的数据
switch(update){//分支判断
case 1://没有声音播放
status = 1; //设置当前状态
break;
case 2://正在播放声音
start.setImageResource(R.drawable.png3);//更换图片
status = 2; //设置当前状态
break;
case 3://暂停中
start.setImageResource(R.drawable.png2);//更换图片
status = 3; //设置当前状态
break;
}
}
}
public void onClick(View v) {//接口中的方法
// TODO Auto-generated method stub
Intent intent = new Intent("wyf.ytl.control");//创建Intent
switch(v.getId()){//分支判断
case R.id.start://按下播放、暂停按钮
intent.putExtra("ACTION", 1);//存放数据
sendBroadcast(intent);//发送广播
break;
case R.id.stop://按下停止按钮
intent.putExtra("ACTION", 2);//存放数据
sendBroadcast(intent);//发送广播
break;
}
}
@Override
protected void onDestroy() {//释放时被调用
// TODO Auto-generated method stub
super.onDestroy();
Intent intent = new Intent(this, MyService.class);//创建Intent
stopService(intent);//停止后台的Service
}
@Override
public boolean onCreateOptionsMenu(Menu menu){//弹出菜单
menu.add(0,Menu.FIRST,0,"退出")
.setIcon(android.R.drawable.ic_menu_delete);//设置图标
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){//选择的菜单项
switch(item.getItemId()){//分支判断
case Menu.FIRST:
showDialog(1);//显示对话框
break;
}
//将来可在此进行扩展
return false;
}
@Override
protected Dialog onCreateDialog(int id){//创建对话框
switch(id){//判断
case 1:
return new AlertDialog.Builder(this)
.setTitle("您确定退出?")
.setPositiveButton("确定", new android.content.DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
System.exit(0);//直接退出
}
})
.setNegativeButton("取消", null)//取消按钮
.create();
default:
return null;
}
}
}
package cn.com.dne.activity.ceshi;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MyService extends Service{
MediaPlayer mp;
ServiceReceiver serviceReceiver;
int status = 1;//当前的状态,1没有声音播放 ,2 正在播放声音,3暂停
@Override
public IBinder onBind(Intent intent) {//重写的onBind方法
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {//重写的onCreate方法
// TODO Auto-generated method stub
status = 1;
serviceReceiver = new ServiceReceiver();//创建BroadcastReceiver
IntentFilter filter = new IntentFilter();//创建过滤器
filter.addAction("wyf.ytl.control");//添加Action
registerReceiver(serviceReceiver, filter);//注册BroadcastReceiver
super.onCreate();
}
@Override
public void onDestroy() {//重写的onDestroy方法
// TODO Auto-generated method stub
unregisterReceiver(serviceReceiver);//取消注册
super.onDestroy();
}
public class ServiceReceiver extends BroadcastReceiver{//自定义BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {//重写的响应方法
// TODO Auto-generated method stub
int action = intent.getIntExtra("ACTION", -1);//得带需要的数据
switch(action){
case 1://播放或暂停声音
if(status == 1){//当前没有声音播放
mp = MediaPlayer.create(context, R.raw.nx);
status = 2;
Intent sendIntent = new Intent("wyf.ytl.update");
sendIntent.putExtra("update", 2);
sendBroadcast(sendIntent);
mp.start();
}
else if(status == 2){//正在播放声音
mp.pause(); //停止
status = 3;//改变状态
Intent sendIntent = new Intent("wyf.ytl.update");
sendIntent.putExtra("update", 3);//存放数据
sendBroadcast(sendIntent);//发送广播
}
else if(status == 3){//暂停中
mp.start();//播放声音
status = 2;//改变状态
Intent sendIntent = new Intent("wyf.ytl.update");
sendIntent.putExtra("update", 2);//存放数据
sendBroadcast(sendIntent);//发送广播
}
break;
case 2://停止声音
if(status == 2 || status == 3){//播放中或暂停中
mp.stop();//停止播放
status = 1;//改变状态
Intent sendIntent = new Intent("wyf.ytl.update");
sendIntent.putExtra("update", 1);//存放数据
sendBroadcast(sendIntent);//发送广播
}
}
}
}
}
这是很久前另一个BLOG上的,现在不用了。转过来吧,方便查看...
输出流
流程示意图:
不同的情况:
1. 调用 write( ) 方法,把数据写入缓冲区,
i 如果缓冲区被填满 ,将自动执行 2,3 步,把数据转换为字节 ,写入到下一个缓冲区 ;
(1) 如果此缓冲区又被填满,则自动执行第 4 步,把转换好的数据保存到缓冲数组 ;
(2) 如果未被填满则不会执行第 4 步。
< 将循环执行,未写入的数据源 继续写入缓冲区,直到数据被全部写入 >
ii 如果未被填满 ,则不执行 2 , 3 步。
2. 当出现未被填满而不发送的情况,可以调用 flush( ) 方法进行强制刷出操作。
API 中的一些定义:
ByteArrayOutputStream
1. 此类实现了一个输出流,其中的数据被写入一个 byte 数组。
2. 缓冲区会随着数据的不断写入而自动增长。
3. 可使用 toByteArray() 和 toString() 获取数据。
OutputStreamWriter
1. OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
2. 每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。
3. 传递给 write() 方法的字符没有缓冲。
BufferedWriter
1. 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
2. 可以指定缓冲区的大小,或者接受默认的大小。
还有就是 flush( ) 方法的定义——
1. 刷新该流的缓冲。
2. 如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。
3. 然后,如果该目标是另一个字符或字节流,则将其刷新。
4. 因此,一次 flush() 调用将刷新 Writer 和 OutputStream 链中的所有缓冲区。
* 需要注意的是, ByteArrayOutputStream 中的数组缓冲区初始大小为 32 字节,随后会按数据大小自动进行调整。
输入流
流程示意图:
1. 把数据源转换为字节数组;
2. 把转换好的字节缓冲数组作为参数源传进 ByteArrayInputStream 流;
3. 与输出流不同的是,第 3 , 4 , 5 步会自动执行,把数组传进下一个缓冲区;
4. 等到调用 read( ) 方法,把缓冲中数据读出 。
API 中的一些定义:
ByteArrayInputStream
1.ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
2. 内部计数器跟 踪 read 方法要提供的下一个字节。
InputStreamReader
1. InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
2. 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。
3. 要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
BufferedReader
1. 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
2. 可以指定缓冲区的大小,或者可使用默认的大小。
close( ) 方法——
1. 关闭该流并释放与之关联的所有资源。
2. 在关闭该流后,再调用 read() 、 ready() 、 mark() 、 reset() 或 skip() 将抛出 IOException 。
3. 关闭以前关闭的流无效。