学习笔记 - IO流中的Stream
一、IO流使用步骤分析
/**
* 字符转换流 字节-->字符
* @author Administrator
*
*/
/**
* 1、
* 源:键盘录入
* 目的:控制台
*
* 2、需求:想把键盘录入的数据存放到一个文件中。
* 源:键盘
* 目的:文件
*
* 3.需求:想要将一个文件的数据打印到控制台上。
* 源:文件
* 目的:控制台
*
* 流操作的基本规律
* 最麻烦的是流对象 有很多,不知道该用哪一个
*
* 通过两个明确来完成
* 1、明确源和目的地
* 源:输入流。 InputStream Reader
* 目的:输出流 . OutputStream Writer
*
* 2.操作的数据是否是纯文本。
* 是:字符流
* 否:字节流
* 3.当体系明确后,在明确要使用哪个具体的对象。
* 通过设备来进行区分;
* 源设备:内存,硬盘,键盘;
* 目的设备:内存,硬盘,控制台。
*
* 1, 将一个文本文件中数据存储到另一个文件中,复制文件
* 源:应为是源,所以使用读取流 InputStream Reader
* 是不是操作文本文件。
* 是,选择Reader
*
* 接下来明确要使用该体系中的那个对象
* 明确设备:硬盘.上一个文件。
* Reader体系中可以操作文件的对象是FileReader
*
* 是否需要提高效率:是,加入Reader体系中的缓冲区,BufferedReader
*
* FileReader fr = new FileReader("a.txt");
* BufferedReader bufr = new BufferedReader(fr);
*
* 目的:OutputStream Writer
* 是否是纯文本。
* 是:Writer
* 设备:硬盘,一个文件
* Writer体系中可以操作文件的是FileWriter
* 是否需要提高效率:是,计入Writer体系中的缓冲区,BufferedWriter
*
* FileWriter fw = new FileWriter("b.txt");
* BufferedWriter bufw = new BufferedWriter(fw);
*/
/**
* 2.需求:将键盘录入的数据保存到一个文件中。
* 这个需求中有源和目的都存在。
* 那么分别分析
* 源:InputStream Reader
* 是不是纯文本?是,Reader
*
* 设备:键盘。对应的对象是System.in.
* 不是选择Reader吗?System.in对应的是字节流?
* 为了操作键盘的文本数据方便。转成字符流,按照字符串操作是最方便的
* 所以,既然明确了Reader,那么就将System.in转换成字符流Reader.
* 用了Reader体系占用转换流,InputStreamReader
*
* InputStreamReadr isr = new InputStreamReadr(System.in);
*
* 提高效率需要 BufferedReader
* BufferedReader bufr = new BufferedReader(isr);
*
* 目的:OutputStram Writer
* 是否是存文本?是,Writer
* 设备:硬盘。一个文件 。使用FileWriter
* FileWriter fw = new FileWriter("b.txt");
* 需要提高效率吗?需要
* BufferedWriter bufw = new BufferedWriter(fw);
*
* 扩展:想要把录入的数据按照指定的编码表(UTF-8),将数据存到文件中
二、使用示例
public class TransStreamDemo {
public static void main(String[] args) throws IOException {
//设置读取的对象
//System.setIn(new FileInputStream("FileReader.java"));
//设置写入的对象
//System.setOut(new PrintStream("zzzz.txt"));
//获取键盘录入的对象。
InputStream is = System.in;
//创建字节流转换成字符流的对象
InputStreamReader isr = new InputStreamReader(is);
//读缓冲区,接收字节流转换为字符流对象
BufferedReader bufis = new BufferedReader(isr);
//获取键盘录入功能的快速生成方法 System.in
//将文件的信息copy到目标文件 并将字母从小写该为大写
BufferedReader bufis2 = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\FileReader.txt")));
//写入 :屏幕显示
// OutputStream out = System.out;
//创建字符流转换成字节流的对象
// OutputStreamWriter opw = new OutputStreamWriter(out);
//写的缓冲区,将字节流转成字符流存入缓冲区
// BufferedWriter bufw = new BufferedWriter(opw);
//屏幕显示信息的最快捷的方法 System.out
//将信息的目标文件换成 C:
BufferedWriter bufw2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Tran.txt")));
String line = null;
while((line = bufis2.readLine())!=null){
if("over".equals(line))
break;
//使用系统的输出
// System.out.println(line.toUpperCase());
bufw2.write(line.toUpperCase());
bufw2.newLine();
bufw2.flush();
}
bufis2.close();
}
}
三、FileInputStream和FileOutputStream
/**
* inputStream 读 将目标文件中的信息,读出来,显示在控制台
* outputStream 写 写之前没有目标文件,先创建目标文件
* @author Administrator
*
*/
public class FileStream {
public static void main(String [] args) throws IOException{
writeFile();
readFile_3();
}
/**
* 通过流的方式向目标文件写入数据
* @throws IOException
*/
public static void writeFile() throws IOException{
//不管什么,都写到流中,不需要刷新
//byte是最下单位,不需要再转换了
//同样是覆盖原有的文件
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());
fos.close();
}
/**
* 这个方法能够读取出\r \n 即他们两个所占用的内存的大小
* @throws IOException
*/
public static void readFile_3() throws IOException{
FileInputStream fis = new FileInputStream("fos.txt");
//byte[] buf = new byte[fis.available]; //定义一个刚刚好的缓冲区
//fis.read(buf)
//System.out.println(new String(buf));
int num = fis.available();
System.out.println("num="+num);
fis.close();
}
/**
* 通过byte[] 以缓冲的形式读取数据
*
* 最保险,最简洁的方法
*
* @throws IOException
*/
public static void readFile_2() throws IOException{
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
fis.close();
}
/**
* 一个一个字节的读取数据
* @throws IOException
*/
public static void readFile() throws IOException{
FileInputStream fis = new FileInputStream("fos.txt");
int ch = 0;
while((ch = fis.read())!=-1){
System.out.println((char)ch);
}
fis.close();
}
}