SDCard存储和File存储 的总结

来源:互联网 发布:java电脑版64位安装包 编辑:程序博客网 时间:2024/05/29 06:36

两者存储基本相同,因为SD存储是在SD卡上而File存储是在本程序中,所以SD存储能读写大文件数据,毕竟手机的内存是有限的
所以两者的区别在路径的获取上 两个程序前面都相同,不同的是两个LIstener处理上,相同的代码如下:仅获取布局组件:
public class SDCardTestActivity extends Activity {
/** Called when the activity is first created. */
final String FILE_NAME = "/crazyit.txt";//注意此处sd卡需要加“/” 否则系统报错,而File时不需要加“/”


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
final EditText edit1 = (EditText) findViewById(R.id.edit1);
final EditText edit2 = (EditText) findViewById(R.id.edit2);


write.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
edit2.setText(read());
System.out.println("888888");
}


});
}
两个按钮,write和read,分别调用write()和read()方法完成单击事件
SD卡的read和write方法如下:
private String read() {
try {
//如果手机插入sd卡而且应用程序具有访问sd的权限
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File sdCardDir = Environment.getExternalStorageDirectory();//获取SD卡对应的存储目录
System.out.println("==============read sdCardDir" + sdCardDir);
FileInputStream fis = new FileInputStream(
sdCardDir.getCanonicalPath() + FILE_NAME);//获取指定文件对用的输入流
BufferedReader bf = new BufferedReader(new InputStreamReader(
fis));//包装成BufferedReader
StringBuilder sb = new StringBuilder("");
String line = null;
while ((line = bf.readLine()) != null) {//读取一个文本行,以换行('\n')、回车 ('\r')为结尾标志
sb.append(line);
}


return sb.toString();


}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return null;
}


private void write(String content) {
try {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File sdCardDir = Environment.getExternalStorageDirectory();


File targetFile;
targetFile = new File(sdCardDir.getCanonicalPath() + FILE_NAME);//获取目标路径
System.out.println("==============write targetFile"
+ targetFile);
RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");//以指定文件创建随机访问文件对象
raf.seek(targetFile.length());//将文件记录指针移到最后
raf.write(content.getBytes());//输出文件内容
raf.close();//必须关闭


}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}
SD卡存储的总结:
1,必须有往sd卡读写的权限,即必须在AndroidManifest.xml中添加如下代码:否则报错
<!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 向SD卡写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2,路径中即FILE_NAME="/crazyit" 必须有“/”
  而file的存取则不可以有“/”


下面是File的read和write代码:
注意的是此处的FILE_NAME="crazyit" 
 private String read() {
try {
StringBuilder sb=new StringBuilder("");
FileInputStream fis=openFileInput(FILE_NAME);
byte[] buff=new byte[1024];//定义一个1024的byte数组
int hasRead=0;
while((hasRead=fis.read(buff))>0){ //每次读取1024个字节的数据填入buff中,返回读取的长度,如果为0,则为读到末尾
sb.append(new String(buff,0,hasRead));
}
return sb.toString();
}
catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("yichang1");
}
return null;
}
    private void write(String content) {
    // TODO Auto-generated method stub
    try {
FileOutputStream fos=openFileOutput(FILE_NAME,MODE_APPEND);//以追加模式打开文件输出流
PrintStream ps=new PrintStream(fos);//包装成PrintStream
ps.print(content);//输出文件内容
ps.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("yichang2");
}
   
    }
}


File存取的总结:
1,存放的位置为date/date/包名/文件名,即本程序的位置 
    而SD存取的位置为mnt/sdcard/文件名,当然也可以指定随意的地址
2,FileInputStream(String name)和FileOutputStream(String name,int Mode)来打开文件输入输出流
  而Mode有4个参数:
MODE_PRIVATE:该文件只能被当前程序读写
MODE_APPEND:以追加文件方式打开
MODE_WORLD_READABLE:可以被其他程序读取
MODE_WORLD_WRITEABLE:可以被其他程序读写


另外,本程序写的时候有个插曲,发现点击write时运行的是read的方法,而点击read时运行的是write的方法
仔细比较了对应的组件,没发现问题出在哪,找啊找,找啊找,才发现R.java文件下有问题,本来布局的时候是
edit1-write-edit2-read 但是
public static final int write=0x7f050003;
public static final int read=0x7f050001;
即在内存中存在问题,系统把write的内存地址和read的地址颠倒了,导致点击这按钮出现那按钮的功能
估计是我在布局的时候来回增删组件,导致系统没识别出来更改后的组件的内存位置
但R.java文件是不可以更改的,解决这问题的办法是
把两个button换下,并看R。java是否改变其地址
0 0
原创粉丝点击