现在的位置: 首页 > 综合 > 正文

SDCard存储和File存储 的总结

2018年02月05日 ⁄ 综合 ⁄ 共 3897字 ⁄ 字号 评论关闭

两者存储基本相同,因为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是否改变其地址

抱歉!评论已关闭.