【黑马程序员】java I/O流浅谈

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


通过对I/O流的学习,让我懂得对于知识总结的重要性,通过总结可以让我对知识的理解更到位,而且对于知识点记忆的更加牢固,

以下是我通过学习教学视频中老师的总结所完成的对I/O流部分的总结:

因为流对象有很多,所以判断用哪个流对象就非常的重要~!

判断需要用什么流对象需要进行以下判断:

判断数据源,和要输出的目的地,只有明白了这2点才能更好的判断用哪一个流对象对数据进行操作。

1源:键盘录入。
目的:控制台。
这个老师说背也要背下来,因为这个是一个固定的套路,虽然这么说但是我认为可以通过这个方法来判断如何来用流对象

首先键盘录入:字节数据,要用到System.in

录入到控制台:   要用到PrintWriter  有自动刷新功能。
是否需要缓冲区:用: 需要用到BufferedReader    这个是字符流对象

所以需要用到转换流对象。

所以代码就出来了: BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

             PrintWriter out = new PrintWriter();

     out.println(br.readLine());


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


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


流操作的基本规律:
最痛苦的就是流的对象有很多,不知道用哪一个。


通过两个明确来完成。


1,明确源和目的。
源:输入流。InputStream   Reader
目的:输出流。OutputStream        Writer。


2操作的数据是否是纯文本。
是:字符流
不是:字节流。


3当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分
原设备:内存,硬盘,键盘
目的设备:内存,硬盘。控制台。


1,将一个文本文件中的数据存储到另一个文件中,复制文件。
源: 因为是源所以使用读取流。InputStream Reader
是不是操作文本文件
是:就可以选择Reader。
不是:就可以选择InputStream
这样体系就明确了。


是否需要提高效率呢?
是 加入Reader体系中的缓冲区 BufferedReader。


接下来明确要使用该体系中哪个对象。
明确设备:硬盘,上的一个文件。
Reader体系中可以操作文件的对象 FileReader。


     FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr);
目的:OutputStream  Writer
目的是否是纯文本?
是:Writer。
设备:硬盘,一个文件。


是否需要提高效率  是 加入Writer体系中的 BufferedWriter。


Writer可以操作文件的是FileWriter
      FileWriter fr = new FileWriter("b.txt");
 BufferedWriter bw = new BufferedWriter(fr);
 
------------------------


2需求:将键盘录入的数据保存到一个文件中
这个需求中有源和目的存在。
那么分别分析
源:InputStream  Reader
是不是纯文本文件  是  Reader


设备  键盘。 对应的对象是  System.in
不是选择Reader ?System.in对应的不是字节流么?
为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转成字符流。Reader
用了Reader体系中的转换流 ,InputStreamReader.
 
 InputStreamReader isr = new InputStreamReader(System.in);
 
 要提高效率么  需要    BufferedReader
 BufferedReader bufr = new BufferedReader(isr);


 目的:OutputStream Writer
 是否是纯文本  是  Writer
 设备 硬盘  一个文件,使用FileWriter。
 FileWriter fw = new FileWriter("c.txt");
 需要提高效率么  需要。
 BufferedWriter bw = new BufferedWriter(fw);




******************************


 扩展一下 想要把绿如的数据按照指定的编码表(utf-8)。将数据存入文件中
 转换流可以指定编码表
 OutputStreamWriter(OutputStream out,String Charset);




 目的:OutputStream Writer
 是否是纯文本  是  Writer
 设备 硬盘  一个文件,使用FileWriter。
 但是FileWriter是使用的默认编码表  GBK。


 但是存储时,需要加入指定的编码表 而指定的编码表只有转换流可以指定。
 所以用OutputStreamWriter
 而该转换流对象要接受一个字节输出流。而且还可以操作的文件的字节数出流 FileOutputStream


 FileWriter fw = new FileWriter("c.txt");
 需要提高效率么  需要。
 BufferedWriter bw = new BufferedWriter(fw);


 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8")
 
 需要提高效率么 需要
 BufferedWriter bufw = new BufferedWriter(osw);


所以  记住  转换流什么时候使用呢,字符和字节之间的桥梁,通常需要字符编码转换时 需要用到转换流


相关练习代码:

class FileDemo
{
	public static void main(String[] args) throws IOException
	{
		/*键盘录入 */
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("abcd.txt")));
		String str = null;
		while((str=br.readLine())!=null)
		{
			if(str.equals("over"))
			{
				break;
			}
			bw.write(str.toUpperCase());
			bw.newLine();
			bw.flush();
		}

	}
	public static void method_1()
	{
		File f = new File("c:\\");
		File[] arr = f.listFiles();
		for(File f1 : arr)
		{
			s("name::"+f1.getName()+"............"+"len::"+f1.length());
		}
	}
	public static void method()
	{
		File f = new File("c:\\");
		String[] arr = f.list(new FilenameFilter(){
		   public boolean accept(File f,String name){
			 
		   
		  return name.endsWith(".exe");
		   }
		
		});
		s("len"+arr.length);
		for(String name : arr)
		{
			s(name);
		}
	}
	public static void s(String obj)
	{
		System.out.println(obj);
	}
}

你可能感兴趣的:(编程技术)