输入流和输出流及其转换笔记1

------- android培训java培训、期待与您交流! ----------

第一部分:

/*

读取键盘录入。

System.out:对应的是标准输出设备(屏幕),控制台(dos控制台)。

System.in:对应的标准输入设备:键盘。

 

需求:

通过键盘录入数据。

当录入一行数据后,就将该行数据进行打印。

如果录入的数据是over,那么停止录入。

*/

import java.io.*;

class  ReadIn

{

         public static void main(String[] args) throws IOException

         {

                   InputStream in = System.in;    //定义输入流对象in,读取从键盘录入的数据,system.in就是一个输出流

                   StringBuilder sb = new StringBuilder();     //定义一个容器,可变长度装存数据

 

                   while(true)

                   {

                            int ch = in.read();      //读取单个字节

                            if(ch=='\r')      //如果是\r

                                     continue;     //结束本次循环,不存储\r,回到循环开始出,继续下次while循环

                            if(ch=='\n')     //如果是\n

                            {

                                     String s = sb.toString();    //返回此对象本身(它已经是一个字符串)

                                     if("over".equals(s))    //如果输入的是否是over

                                               break;             //结束while循环

                                     System.out.println(s.toUpperCase());   //将所有字符(字符串)转换成大写并打印

                                     sb.delete(0,sb.length());   //经过上一步打印之后要把容器sb里面的内容清空,以免影响下次操作

                            }

                            else

                                     sb.append((char)ch);      //将读取到的单个字符依次都装入到容器sb中进行存储

 

                   }

         }

}

 

/*

注意:

1read()方法:从输入流中读取数据的下一个字节,每次只能读取一个字节;

public abstract int read()

                  throws IOException

         从输入流中读取数据的下一个字节。返回 0 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1

         在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

    子类必须提供此方法的一个实现。

返回:

下一个数据字节;如果到达流的末尾,则返回 -1

2Ctrl+C:结束输入;

     直接输入-1是不能结束输入的,Ctrl+C就是在往里面加上一个结束标记,这个结束标记返回来的就是-1

3)不需要进行close()关闭操作,因为结束输入后,系统自动就会关闭;

4)键盘录入结束的两种方式:(否则停不下来!)

     Ctrl+C

          定义一个结束标记;

*/

 

第二部分:

/*

字符流:

FileReader

FileWriter

 

BufferedReader

BufferedWriter

 

字节流:

FileInputStream

FileOutputStream

 

BufferedInputStream

BufferedOutputStream

 

通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法。

 

能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?

readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法,不能拿字节流去用字符流的方法。

 

思考:

那么能不能将字节流转成字符流在使用字符流缓冲区的readLine方法呢?

*/

import java.io.*;

 

class  InputStreamReaderDemo

{

         public static void main(String[] args) throws IOException

         {

                   //获取键盘录入对象。

                   InputStream in = System.in;

 

                   //将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去

                   InputStreamReader isr = new InputStreamReader(in);    //对象in由字节流变成了字符流isr

 

                   //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

                   BufferedReader bufr = new BufferedReader(isr);     //创建缓冲区对象,将字符流对象isr传入

 

                   String line = null;    //使用readLine()方法之前要先定义一个空字符串对象,以便将缓冲区中读到的行字符串对象地址赋给它

 

                   while((line=bufr.readLine())!=null)   //判断循环条件

                   {

                            if("over".equals(line))    //定义结束标记

                                     break;

                            System.out.println(line.toUpperCase());   //将行字符串的所有字符转换成大写并输出

                   }

 

                   bufr.close();         //关闭缓冲区资源,录入流不用关,因为键盘录入结束,系统会自动关闭

 

         }

}

 

/*

1)类 InputStreamReader(转换流):将字节流转换成字符流,是字节流通向字符流的桥梁;

     构造方法:InputStreamReader(InputStream in)

                      创建一个使用默认字符集的 InputStreamReader

*/

 

第三部分:

/*

将字符流转换成字节流:OutputStreamWriter

*/

import java.io.*;

 

class  OutputStreamWriterDemo1

{

         public static void main(String[] args) throws IOException

         {

                   //获取键盘录入对象。

                   InputStream in = System.in;

 

                   //将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去

                   InputStreamReader isr = new InputStreamReader(in);    //对象in由字节流变成了字符流isr

 

                   //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

                   BufferedReader bufr = new BufferedReader(isr);     //创建缓冲区对象,将字符流对象isr传入

 

                                    

                   OutputStream out = System.out;     //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句

                   OutputStreamWriter osw = new OutputStreamWriter(out);     //out对象进行包装,osw是字符流

                   BufferedWriter bufw = new BufferedWriter(osw);   //创建缓冲区对象,将字符流对象osw传入

 

                   String line = null;

 

                   while((line=bufr.readLine())!=null)

                   {

                            if("over".equals(line))

                                     break;

                            bufw.write(line.toUpperCase());    //将每行字符串(字符流)转换成字节(字节流),并变成大写

                            bufw.newLine();     //进行换行操作

                            bufw.flush();       //将缓冲区数据进行刷新操作,输出结果

                   }

 

                   bufr.close();      //关闭缓冲区资源

 

         }

}

 

/*

1)类 InputStreamReader:将字节流转换成字符流,是字节流通向字符流的桥梁;

     构造方法:InputStreamReader(InputStream in)

                      创建一个使用默认字符集的 InputStreamReader

2)类OutputStreamWriter:将字符流转换成字节流,是子字符流通向字节流的桥梁;

          构造方法:OutputStreamWriter(OutputStream out)

                      创建使用默认字符编码的 OutputStreamWriter

3system.in是输出流

     system.out是输出流

4PrintStreamOutputStream的子类,可以使用父类接收子类对象;

5)理解:字符转字节

     我们往文件中录入的都是字符,但写入文件的字符都是以字节的形式存在的,即录入的是字符,但在硬盘上保存的是字节,这就是

          字符转字节;

6)录入和输出的数据都要是字节流,缓冲区存储的可以是字符流;

7)本例实质上就是自己定义了一个输出的操作方法;

*/

 

第四部分(第三部分代码修改,使其更简洁)

/*

将字符流转换成字节流:OutputStreamWriter

*/

import java.io.*;

 

class  OutputStreamWriterDemo2

{

         public static void main(String[] args) throws IOException

         {

                   //获取键盘录入对象。

                   //InputStream in = System.in;

 

                   //将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去

                   //InputStreamReader isr = new InputStreamReader(in);    //对象in由字节流变成了字符流isr

 

                   //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

                        //创建缓冲区对象,将字符流对象isr传入

                  

                   //键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)

                   BufferedReader bufr =

                                     new BufferedReader(new InputStreamReader(System.in));

                                    

                   //OutputStream out = System.out;     //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句

                   //OutputStreamWriter osw = new OutputStreamWriter(out);     //out对象进行包装,osw是字符流

                   //BufferedWriter bufw = new BufferedWriter(osw);   //创建缓冲区对象,将字符流对象osw传入

 

 

                   BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out));

 

                   String line = null;

 

                   while((line=bufr.readLine())!=null)

                   {

                            if("over".equals(line))

                                     break;

                            bufw.write(line.toUpperCase());    //将每行字符串(字符流)转换成字节(字节流),并变成大写

                            bufw.newLine();     //进行换行操作

                            bufw.flush();       //将缓冲区数据进行刷新操作,输出结果

                   }

 

                   bufr.close();      //关闭缓冲区资源

 

         }

}

/*

1)类 InputStreamReader:将字节流转换成字符流,是字节流通向字符流的桥梁;

     构造方法:InputStreamReader(InputStream in)

                      创建一个使用默认字符集的 InputStreamReader

2)类OutputStreamWriter:将字符流转换成字节流,是子字符流通向字节流的桥梁;

          构造方法:OutputStreamWriter(OutputStream out)

                      创建使用默认字符编码的 OutputStreamWriter

          理解:实质上OutputStreamWriter就是一个转换流(将字符流转换成字节流),就是对输出流System.in的一个包装,

                System.in 一次只能读一个字节,而进行包装之后,一次可以读一行,非常方便;

3system.in是输出流

     system.out是输出流

4PrintStreamOutputStream的子类,可以使用父类接收子类对象;

5)理解:字符转字节

     我们往文件中录入的都是字符,但写入文件的字符都是以字节的形式存在的,即录入的是字符,但在硬盘上保存的是字节,这就是

          字符转字节;

6)录入和输出的数据都要是字节流,缓冲区存储的可以是字符流;

7)本例实质上就是自己定义了一个输出的操作方法;

*/

 

第五部分

/*

1

源:键盘录入

目的:控制台

 

2,需求:想把键盘录入的数据存储到一个文件中。

         分析:

                   源:键盘

                   目的:文件

*/

import java.io.*;

 

class  OutputStreamWriterDemo3

{

         public static void main(String[] args) throws IOException

         {

                   //键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)

                   BufferedReader bufr =

                                     new BufferedReader(new InputStreamReader(System.in));    //键盘录入,是源

                                    

                   BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));   //文件,是果,数据目的

 

                   String line = null;

 

                   while((line=bufr.readLine())!=null)

                   {

                            if("over".equals(line))

                                     break;

                            bufw.write(line.toUpperCase());    //将每行字符串(字符流)转换成字节(字节流),并变成大写

                            bufw.newLine();     //进行换行操作

                            bufw.flush();       //将缓冲区数据进行刷新操作,输出结果

                   }

 

                   bufr.close();      //关闭缓冲区资源

 

         }

}

 

/*

总结:

1new OutputStreamWriter()传入的应该是字符流对象(将字符流变为字节流),字节输出流中能操作文件的是:FileOutputStream(String name)

2new InputStreamReader()传入的应该是字节流对象(将字节流变为字符流)

*/

 

/*

3,需求:想要将一个文件的数据打印在控制台上。

源:文件。

目的:控制台。

 

流操作的基本规律:

最痛苦的就是流对象有很多,不知道该用哪一个。*/

import java.io.*;

 

class  OutputStreamWriterDemo4

{

         public static void main(String[] args) throws IOException

         {

                   //键盘的最常见写法。(以后只要老师说需要键盘录入,就是用这个方法,背下来!)

                   BufferedReader bufr =

                                     new BufferedReader(new InputStreamReader(new FileInputStream("CopyMp3.java")));    //文件,是源

                                    

                   BufferedWriter bufw =new BufferedWriter(new OutputStreamWriter(System.out));   //控制台,是果,数据目的

 

                   String line = null;

 

                   while((line=bufr.readLine())!=null)

                   {

                            if("over".equals(line))

                                     break;

                            bufw.write(line.toUpperCase());    //将每行字符串(字符流)转换成字节(字节流),并变成大写

                            bufw.newLine();     //进行换行操作

                            bufw.flush();       //将缓冲区数据进行刷新操作,输出结果

                   }

 

                   bufr.close();      //关闭缓冲区资源

 

         }

}

 

/*

总结:

1new OutputStreamWriter()传入的应该是字符流对象(将字符流变为字节流),字节输出流中能操作文件的是:FileOutputStream(String name)

2new InputStreamReader()传入的应该是字节流对象(将字节流变为字符流)字符流中中能操作文件的是:FileInputStream(String name)

*/

 

流操作的基本规律(4个明确)

明确1:源和目的

源(输入流)

目的(输出流)

 

字节输入流InputStream

字符输入流Reader

字节输出流OutputStream

字符输出流Writer

明确2:操作的是否是纯文本

输入流

输出流

 

(是)字符输入流:Reader

(否)字节输入流:InputStream

(是)字符输出流:Writer

(否)字节输出流:OutputStream

明确3:使用的具体对象

源设备

目的设备

 

内存

硬盘FileReader

键盘System.in(键盘录入一定是纯文本)

内存

硬盘FileWriter

控制台System.out

明确4:读取效率提升

提升

提升

 

字符输入流:Reader体系中缓冲区BufferedReader

字节输入流:InputStream体系中缓冲区BufferedInputStream

字符输出流:Writer体系中缓冲区BufferedWriter

字节输出流:OutputStream体系中缓冲区BufferedOutputStream

注意:

(1)       键盘录入(System.in)对应的是字节流,如果要操作字符流文件,必须要转换成字符流:用Reader体系中转换流InputStreamReader(将字节流转换成字符流)

(2)       键盘输出(System.out)对应的也是字节流,如果字符流要进行输出,必须要先转换成字节流:用OutputStream体系中转换流OutputStreamWriter(将字符流转换成字节流)

 

 

 

练习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);

你可能感兴趣的:(java)