Android IO流使用详解-SDcard

Android IO流使用详解
一.Android IO流

Java IO 流按照不同类型来分,可以从以下几个方面来进行分类:
   1.输入流/输出流
输入流和输出流 InputStream 和 OutputStream(基类 抽象类)
一个流是字节的源或目的地,其次序是有意义的。例如,一个需要键盘输入的程序可以用流来做到这一点。流可以分成两种:输入流和输出流。可以从输入流读,但不能对它写。要进行写操作就必须使用输出流
InputStream  和  OutputStream 是Java流类中的两个最基本的类,Java中所有其他的流类 都是继承自这两个类
   2.字节流/字符流
字节流:
可以处理所有类型的数据,如MP3,图片,文字,视频等。在读取时,读到一个字节就返回一个字节。(在JAVA中对应的类以Stream结尾)
字符流:
仅能够处理纯文本数据,如txt文本。在读取时,读到一个或多个字节,先查找指定的编码表,然后将查到的字符返回。(在JAVA中对应的类都以Reader或Writer结尾)
   3.节点流/处理流
节点流和处理流,Java的IO使用装饰者模式将IO流分成了底层节点流和上层处理流。节点流直接和底层的物理存储节点关联,虽然不同的物理节点获取的节点流可能存在差异,但程序可以把不同的物理节点包装成统一的处理流,从而允许程序使用统一的IO代码来操作不同的物理节点。这就是封装的典型应用:不用考虑底层不同的节点流,只需将节点流封装成处理流来调用。

二.字节、字符、编码
一个字节等于8为二进制,即一个8位的二进制数,是一个很具体的存储空间。
字符是人们使用的记号,抽象意义上的一个符号。
字符集又称编码
如汉字GB2312中哪些汉字,字母,符号会被收入标准中,所包含的“字符”的集合叫做“字符集”
规定每个“字符”分别用一个字节还是多个字节存储。用哪些字节存储,这个规定叫做编码

三.IO流常用方法
1.字节流常用方法
InputStream类的主要方法:
int read()          从流中读出一个字节的数据 
int read(byte[] b)            从流中读取数据并存放到数组b中
int read(byte[] b, int off,int len) 从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始 
void close()                     关闭当前流对象 
int available()                  返回当前流中可用的字节数                             
void mark (int readlimit) 在流中作标记 
boolean markSupported ()  判断流是否支持标记和复位操作                            
void reset()    返回流中标记过的位置 
long skip(long n)    跳过流中的指定字数
OutputStream类的主要方法:
void write(int b) 向流中写入一个字节数据
void write (byte[] b) 写入数组buf的所有字节
void write (byte[] b,int off,int len) 将字节数组中off位置开始,长度为len的字节数据输出到输出流中
void close () 关闭当前流对象 
void flush () 强制缓冲区中的所有数据写入到流中 

2.字符流常用方法
Reader常用方法:
int read()从输入流中读取单个字符,返回读取的字符
int read(byte[] c) 从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数
read(char[] c,int off,int len) 从输入流中读取最多len的长度字符,保存到字符数组c中,保存的位置从off位置开始,返回实际读取的字符长度
void close() 关闭流
Writer常用方法:
write(String str)将str字符串里的字符输出到指定输出流中
write(String str,int off,int len) 将str字符串里从off位置开始长度为len的字符输出到输出流中
void close() 关闭输出流
void flush() 刷新输出流


四.IO流的使用
需要在AndroidMainfset.xml文件中进行权限的配置:
1.SDCard中创建与删除文件权限:

2.SDCard写入数据权限

代码如下:
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.cxy.io">
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS">uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            intent-filter>
        activity>
    application>
manifest>

字节文件的输入输出流ileInputStream 和 FileOutputStream(InputStream 和 OutputStream的子类,具体实现类)

FileInputStream 和 FileOutputStream分别是InputStream 和 OutputStream的子类,往往使用FileInputStream 和 FileOutputStream这两个子类去就可以从一个指定文件中读取或者向某一个文件中写入数据。

如果创建FileInputStream 和 FileOutputStream对象,那我们必须指定 文件的路径和文件名,对象被创建之后,流就打开了,程序结尾处必须结束流的操作。关闭流,释放资源。

package com.example.cxy.io;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn,btn1;
    private String content="今天天气不错";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inintView();
    }

    private void inintView() {
        btn= (Button) findViewById(R.id.button);
        btn1= (Button) findViewById(R.id.button2);
        btn.setOnClickListener(this);
        btn1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        File file =new File("/mnt/sdcard/cxy.txt");
        switch (v.getId()) {
            case R.id.button:
                try {
                    file.createNewFile();
                    //实例化一个输出流
                    FileOutputStream out=new FileOutputStream(file);
                    //FileOutputStream out=new FileOutputStream("/mnt/sdcard/cxy.txt");
                    //把文字转化为字节数组
                    byte[] bytes = content.getBytes();
                    //写入字节数组到文件
                    out.write(bytes);
                    //关闭输入流
                    out.close();
                    Toast.makeText(MainActivity.this, "写入成功", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.button2:
                try {
                    String text=null;
                    //实例化一个输入流
                    FileInputStream input=new FileInputStream(file);
                    //把文件中的所有内容转换为byte字节数组
                    byte[] bytes = new byte[input.available()];
                    //读取内容
                    input.read(bytes);
                    //关闭输入流
                    input.close();
                    //bytes字节数组转化为文字
                    text=new String(bytes);
                    Toast.makeText(MainActivity.this,text, Toast.LENGTH_SHORT).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}
xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.cxy.io.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="写入"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="输出"
        android:id="@+id/button2"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="157dp"/>
RelativeLayout>
Android IO流使用详解-SDcard_第1张图片


你可能感兴趣的:(Android)