• 输入和输出--IO流


    • JavaIO流
    首先要理解这个“流”(stream)字:Java把不同的输入,输出源抽象成为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入,输出源。把这里的“流”简单的理解成从起源到接受的有序数据就好了。
    • IO流的分类:
    一共有3种分类方式:

    1,按流向分:

    输入流;输出流

    2,按处理的单位:

    字节流(8 位的字节);字符流(16 位的字节)

    3,按流的角色:

    节点流:可以从一个特定的 IO 设备读/写数据的流

    处理流:对一个已存在的流进行连接和封装,通过封装后的流来实现数据读/写操作。


    Java的io流一共涉及40多个类,虽然多但是别慌,他是有规则的。记住一下3点就好了:
    1,所有的类都是从4个抽象类中派生出来的。这4个抽象类是:InputStream & Reader;OutputStream & Writer。
    2,输入和输出没有什么区别,只不过一个是读,一个是写而已。字节流和字符流也没什么区别,只不过他们操作的数据单元不同:一个是字节,一个是字符。通常来说:如果需要进行输入和输出的内容是文本内容,就考虑使用字符流,如果需要进行输入和输出的内容是二进制内容,这个时候就使用字节流。
    3,使用高级流:
    1),转换流:将字节流转换成字符流(InputStreamReader,OutputStreamWriter)。  

    2),处理流:使用处理流来包装节点流,程序通过处理流来执行输入和输出。识别处理流也非常的简单:只要流的构造器参数不是一个物理节点,而是一个已经存在的流,那么这种流就是处理流。下面来实现一种比较常用的处理流的用法:Java使用system.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的一个实例,使用的时候不是很方便,而且我们也知道键盘输入的内容都是文本内容,所以我们可以使用InputStreamReader将其转换成字符输入流,普通的reader读取输入内容还是不太方便,我们可以将reader包装成BufferReader,利用BufferReader的readline方法就可以一次读取一行内容了。


    以下几块代码用来演示具体的常用的几种流:

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Linkin
    {
    
    	public static void main(String[] args) throws IOException
    	{
    		FileInputStream fis = null;
    		FileOutputStream fos = null;
    		try
    		{
    			// 创建字节输入流
    			fis = new FileInputStream("src/Linkin.java");
    			// 创建字节输出流
    			fos = new FileOutputStream("src/newFile.java");
    			byte[] bbuf = new byte[32];
    			int hasRead = 0;
    			// 循环从输入流中取出数据
    			while ((hasRead = fis.read(bbuf)) > 0)
    			{
    				// 每读取一次,即写入文件输出流,读了多少,就写多少。
    				fos.write(bbuf, 0, hasRead);
    			}
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    		finally
    		{
    			if (fis != null)
    			{
    				fis.close();
    			}
    			if (fos != null)
    			{
    				fos.close();
    			}
    		}
    	}
    }
    

    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Linkin
    {
    
    	public static void main(String[] args) throws IOException
    	{
    		FileReader fr = null;
    		FileWriter fw = null;
    		try
    		{
    			// 创建字符输入流
    			fr = new FileReader("src/Linkin.java");
    			// 创建一个长度为32的“竹筒”
    			char[] cbuf = new char[32];
    			// 用于保存实际读取的字符数
    			int hasRead = 0;
    			// 使用循环来重复“取水”过程
    			while ((hasRead = fr.read(cbuf)) > 0)
    			{
    				// 取出“竹筒”中水滴(字符),将字符数组转换成字符串输入!
    				System.out.print(new String(cbuf, 0, hasRead));
    			}
    			fw = new FileWriter("poem.txt");
    			fw.write("锦瑟 - 李商隐
    "); 
    			fw.write("锦瑟无端五十弦,一弦一柱思华年。
    ");
    			fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。
    ");
    			fw.write("沧海月明珠有泪,蓝田日暖玉生烟。
    ");
    			fw.write("此情可待成追忆,只是当时已惘然。
    ");
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    		finally
    		{
    			if (fr != null)
    			{
    				fr.close();
    			}
    			if (fw != null)
    			{
    				fw.close();
    			}
    		}
    	}
    }

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintStream;
    
    public class Linkin
    {
    
    	public static void main(String[] args) throws IOException
    	{
    		FileOutputStream fos = null;
    		PrintStream ps = null;
    		try
    		{
    			fos = new FileOutputStream("test.txt");
    			ps = new PrintStream(fos);
    			// 使用PrintStream执行输出
    			ps.println("普通字符串");
    			// 直接使用PrintStream输出对象
    			ps.println(new Linkin());
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    		finally
    		{
    			if (ps != null)
    			{
    				ps.close();
    			}
    		}
    	}
    }

    import java.io.IOException;
    import java.io.StringReader;
    import java.io.StringWriter;
    
    public class Linkin
    {
    
    	public static void main(String[] args) throws IOException
    	{
    		StringReader sr = null;
    		StringWriter sw = null;
    		String src = "从明天起,做一个幸福的人
    " + "喂马,劈柴,周游世界
    " + "从明天起,关心粮食和蔬菜
    " + "我有一所房子,面朝大海,春暖花开
    " + "从明天起,和每一个亲人通信
    " + "告诉他们我的幸福
    ";
    		char[] buffer = new char[32];
    		int hasRead = 0;
    		try
    		{
    			sr = new StringReader(src);
    			// 采用循环读取的访问读取字符串
    			while ((hasRead = sr.read(buffer)) > 0)
    			{
    				System.out.print(new String(buffer, 0, hasRead));
    			}
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    		try
    		{
    			// 创建StringWriter时,实际上以一个StringBuffer作为输出节点
    			// 下面指定的20就是StringBuffer的初始长度
    			sw = new StringWriter();
    			// 调用StringWriter的方法执行输出
    			sw.write("有一个美丽的新世界,
    ");
    			sw.write("她在远方等我,
    ");
    			sw.write("哪里有天真的孩子,
    ");
    			sw.write("还有姑娘的酒窝
    ");
    			System.out.println("----下面是sw的字符串节点里的内容----");
    			// 使用toString()方法返回StringWriter的字符串节点的内容
    			System.out.println(sw.toString());
    		}
    		catch (Exception ioe)
    		{
    			ioe.printStackTrace();
    		}
    		finally
    		{
    			if (sr != null)
    			{
    				sr.close();
    			}
    			if (sw != null)
    			{
    				sw.close();
    			}
    		}
    	}
    }


    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Linkin
    {
    
    	public static void main(String[] args) throws IOException
    	{
    		InputStreamReader reader = null;
    		BufferedReader br = null;
    		try
    		{
    			// 将Sytem.in对象转换成Reader对象
    			reader = new InputStreamReader(System.in);
    			//将普通Reader包装成BufferedReader
    			br = new BufferedReader(reader);
    			String buffer = null;
    			//采用循环方式来一行一行的读取
    			while ((buffer = br.readLine()) != null)
    			{
    				//如果读取的字符串为"exit",程序退出
    				if (buffer.equals("exit"))
    				{
    					System.exit(1);
    				}
    				//打印读取的内容
    				System.out.println("输入内容为:" + buffer);
    			}
    		}
    		catch (Exception ioe)
    		{
    			ioe.printStackTrace();
    		}
    		finally
    		{
    			if (br != null)
    			{
    				br.close();
    			}
    		}
    	}
    }


    关于上面几段代码,有几点要注意:
    1,在使用低级流的时候往往会new一个1024的字节数组,这个相当于一个竹筒用来操作流,指针对应向后跳就好了
    2,使用IO流结束后,要记得关闭流。因为程序打开的文件IO资源不属于内存里面的资源,垃圾回收无法回收。使用IO流执行结束后关闭流,不仅可以流的物理资源被回收,还可以将输出流缓存的数据flush到物理节点中。当我们在使用了处理流来包装底层几点流之后,只需要关闭最上层的流就好了,下面的低级流也会自动跟着关闭的。
    3,PrintStream类的输入功能非常强大,通常如果我们需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。


  • 相关阅读:
    从未改过的网名,一如既往的孤荷凌寒——我的信息技术之路之五
    编程思维的养成——我的信息技术之路之五
    从无知无畏到虚心借鉴——我的信息技术之路之四
    相信自己,看着目标前进——我的信息技术之路之三
    先迈开步子再找路——我的信息技术之路之二
    每个问题的解决都预设多种算法方案——我的信息技术之路之七
    软件开发流程之三:可行性研究
    软件开发流程之二:开发流程
    软件开发流程之九:项目组建设
    软件开发流程之七:软件测试
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233108.html
Copyright © 2020-2023  润新知