java学习一目了然——IO

java学习一目了然——IO

IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所以也分为字符输入流和字节输入流。

数据类型:

  • 基本流(低级流)
    字节流 InputStream/OutputStream
    字符流 Reader/Writer(接口类型)
  • 高级流(处理流):对基本流进一步操作
字符:
Writer--FileWriter  
Reader--FileReader
字节:
Writer--FileOutputStream
Reader--FileInputStream
Writer--FileWriter
FileWriter(String filename);
FileWriter(File file);
write(int c); 写一个单独的字符(在缓冲区中)
write(char cbuf[], int off, int len) 写入字符数组(在缓冲区中)
public void write(String str, int off, int len) 写入字符串(在缓冲区中)
flush(); 刷新缓冲区,将数据真正写入文件,注意这里的写入为修改,而不是追加
close(); 刷新缓冲区,关闭流对象,释放相关资源

构造函数FileWriter(String filename,boolean isAppend)中boolean参数为true时,write()方法为追加

这里的write方法介绍三种种重载

  1. 写入单个字符

    int c = 0; //初始化
    while((c=fr.read())!=-1){
        fw.write(c);
    }
    
  2. 写入字符数组

    char[] chs = new char[1024];
    int len = chs.length;
    while(fr.read(chs)!=-1){
        fw.write(chs,0,len); //添加字符数组的长度,为了防止写入时缓冲区未写满而产生多余数据
    }
    
  3. 写入字符串

    char[] chs = new char[1024];
    int len = chs.length;
    while((len = fr.read(chs))!=-1){
        fw.write(new String().valueOf(chs,0,len));
        //fw.write(new String().valueOf(chs), 0 , len);
    }
    

flush方法为刷新缓冲区,在flush方法使用之后write方法写入的数据才真正有效.而close方法调用的同时,会自动将缓冲区flush一下,然后关闭流.

Reader--FileReader
 FileReader(String filename);
 FileReader(File file);
 int read() 返回读入单一字符对应的int值,并将read位置移到下一位.如果没有读到,返回-1
 int read(char cbuf[]) 返回多字符值
 int read(char cbuf[], int off, int len) 

注意:read和write(Writer类中)其中一个使用三参数的重载即可

代码见FileWriter
Writer--FileOutputStream
write(char);
write(int);
write(byte[]);//因为是字节流,write没有参数为String的重载
write(byte[],int off,int len);最常用
Reader--FileInputStream
read(byte[]);
高效流:
BufferedWriter(Writer w);
BufferedReader(Reader r);
使用方法同上

BufferedWriter:
    write(String);
    newLine(); 换行
BufferedReader
    String readLine(); 读取一行信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));

    String line = null; //初始化
    while((line = br.readLine())!= null){
        if(line.equals("quit")){
            break; //读取到退出信息
        }
        else{
            //写入数据三步:写入-换行-刷新
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    }
    bw.close();
    br.close();
字节流与字符流的转化:
字节流转换字符流:
InputStreamReader(InputStream); 此时InputStringReader对象将InputStream对象转换为字符流
常用于键盘输入(字节流)的保存或输出(字符流)
注意:键盘输入时的System.in为InputStream类型
因此,高效转换过程为BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));

字符流转换字节流:
与之相似,常用于键盘输出
BufferedWriter(new OutputStreamWriter(System.out));
Properties(Map)
Properties可保存到流中也可从流中加载
Object setProperties(String key,String value); 添加
String getProperties(String key)
Set<StringstringPropertyNames()
Properties实现集合与IO流的拼接
void load(InputStream is);
void load(Reader r); 读到的文件输入流按照格式直接存入Properties的Map集合中

void store(OutputStream os,String comments);
void store(Writer w,String comments);以键值对的形式写入文件
打印流
直接操作文件
PrintWriter(File file);
PrintWriter(String filePath);(不自动刷新缓冲区)

PrintWriter(OutputStream os);
PrintWriter(Writer w); println自动刷新缓冲区

print(...);
println(...); println在某些情况下可以自动刷新缓冲区,具体情况如上
当println方法自动刷新时,相当于BufferedWriter中的writer(ln);newLine();flush();三个方法
posted @ 2015-10-27 17:16  stonesola  阅读(159)  评论(0编辑  收藏  举报