IO流-字符流

来源:互联网 发布:宿州影楼美工招聘兼职 编辑:程序博客网 时间:2024/05/03 18:42

IO

“java语言以流的形式进行数据的输入输出。”
数据流是一种形象的概念,可以理解为是一种数据传输的“管道”。将字节数据的读写,抽象成数据在管道中流动。管道中流动的数据可以是基于字节的,也可以是基于字符的。当程序需要读写数据的时候,就会开启一个通向数据源的管道,进行数据的输入输出。

这里需要注意的是:(刚学习的时候经常摸不清怎么回事儿,现在也有点后遗症....)
IO的流向问题:
输入:程序要从数据源获得数据时。(数据从磁盘或网络等流入程序(内存))
输出:程序有数据结果需要输出。(数据从(程序)内存流到磁盘或网络等)
输入输出的参照物都是java程序。是相对于java程序而言的。

java中的流分为两种:字节流/字符流。(以Stream结尾的是字节流,反之是字符流)
分别由四个抽象类表示:
字节流:
输入:InputStream
输出:OutputStream
字符流:
输入:Reader
输出:Writer
(只要是处理纯文本数据,优先考虑字符流,除此外都用字节流。)


字符流以16位Unicode码表示字符位基本处理单位
以字符的形式对数据进行读写
Reader/Writer:基类
它的子类有:
OutputStreamWriter/ InputStreamReader
BufferedReader /BufferedWriter
Reader:
方法:
ready()
     
判断是否准备读取输入流
int read()      
读取一个字符,返回读取的字符。如果读取完毕到达末尾,返回-1。
int read(char[ ] b)      
从输入流中读取一定数量的字符并将其存储在缓冲区数组b中。返回读入缓冲区的总字节数。
int read(char[ ]b,int off,int len)      
读取len个字符,从数组b的下标off处开始存放,返回实际读取的字符数
void reset()    
将当前流重新定位到mark()方法标记的位置
void mark()      
给当前流作标记,最多支持readAheadLimit个字符的回溯
boolean markSupported()     
判断当前流是否支持做标记
void close()      
关闭当前流对象  ,并释放与数据流相关的资源 
Writer:
方法:
void write(int b)      
将整型值c的低16位写入输出流
void write(String str)    
将指定的字符串写入输出流
void write(String str,int off,int len)    
将指定的字符串从off位置开始的len个字符写入输出流
void write(char[ ] c)      
将字符数组c写入输出流
void write(char[ ] c, int off, int len)      
将字符数组b中从索引off的位置开始的len个字符写入输出流
void flush()      
清空流并强制将缓冲区中所有数据写入到流中
void close()    
关闭当前流对象  ,并释放与数据流相关的资源

eg:Writer w = new OutputStreamWriter(new FileOutputStream(file/路径));Reader r = new InputStreamReader(FileInputStream(file/路径));
FileReader/FileWriter 文件读/写字符流
FileReader:(InputStreamReader的子类)
用于读取文本文件的流对象
FileReader类创建了一个可以读取文件内容的Reader类。必须指定一个被读取的文件。
Reader reader = new FileReader(String filePath);Reader reader = new FileReader(FIle file);
FileWriter:(OutputStreamWriter的子类)
用于处理文本文件。
类中有默认编码表。
有临时缓冲。
FileWriter创建了一个可以写文件的Writer类
//在指定的位置创建一个文件,如果文件已存在,将会覆盖Writer writer = new FileWriter(String filePath);//append为true,如果文件已存在,会在指定的文件末尾处进行数据续写。Writer writer = new FileWriter(String filePath,boolean append);//如果文件已存在,将会覆盖Writer writer = new FileWriter(File file);
FileWriter类的创建不依赖与文件存在与否。



字符缓冲区输入流--BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取

BufferedReader reader = new BufferedReader(Reader in);//指定输入缓冲区大小BufferedReader reader = new BufferedReader(Reader in,int size);
方法:
readLine()
    读取一行数据,不包含末尾换行符;读取结束后,再读取,返回 null

字符缓冲区输出流--BufferedWriter:

BufferedWriter reader = new BufferedWriter(Writer out);//指定输出缓冲区大小BufferedWriter reader = new BufferedWriter(Writer out,int size);
方法:
newLine()
    写入一个行分隔符

eg:BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(file/路径), "UTF-8")); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file/路径), "UTF-8")); 

import java.io.*;public class BufferedRWDemo{    public static void main(String[]args){        try{                 BufferedReader bufReader=new BufferedReader(new InputStreamReader(System.in));                 BufferedWriter bufWriter=new BufferedWriter(new FileWriter("BufferedRWDemo.txt"));                 String input=null;                 While(!(input=bufReader.readLine()).equals("quit")){                          bufWriter.write(input);                          bufWriter.newLine();         }         bufReader.close();         bufWriter.close();      }      catch(Exception e){            e.printStackTrace();      }   }}


字符打印流--PrintWriter  将字符数据进行格式化输出
PrintWriter out = new PrintWriter(Writer out);
PrintWriter out = new PrintWriter(File file);
PrintWriter out = new PrintWriter(File file, 字符集);
方法:
print(boolean b)    输出boolean类型的数据
print(char c)     输出char类型数据
     ......char[]、double、float、int、long、String等


InputStreamReader 和 OutputStreamWriter--字节流和字符流之间转换

这两个类是字节流和字符流之间转换的类:
InputStreamReader 可以将一个字节流中的字节解码成字符。通过InputStream类型对象构建实例
OuputStreamWriter 将写入的字符编码成字节后写入一个字节流。通过OutputStream类型对象构建实例
InputStreamReader:

// 用默认字符集创建一个 InputStreamReader对象InputStreamReader reader = new InputStreamReader(InputStream in);// 接受已指定字符集名的字符串,并用该字符集创建对象InputStreamReader reader = new InputStreamReader(InputStream in,String CharsetName);//另外指定编码类型
OutputStreamWriter:
OutputStreamWriter writer = new OutputStreamWriter(OutputStream out);OutputStreamWriterwriter = new OutputStreamWriter(OutputStream out,String CharsetNarme);//另外指定编码类型

readLine():此方法本质还是缓冲区关联流对象的read()方法。只不过,每次读到一个字符,先不进行具体操作,先进行临时存储。当读到换行符(回车标记)时,将临时容器中的数据一次性返回。
 

java定义的两个流对象System.in与System.out:
可以在程序中直接使用,而不用重新定义自己的流对象。
System.in:可以从键盘中读入数据。
System.out:可以将数据输出到显示屏。