黑马程序员_IO流

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

一、IO流

       java通过IO流技术,可以操作本地或者其他主机上的文件
      1,IO流的分类

            1.1,按处理的数据分为字符流和字节流

                    字符流:专门用于处理文本文件,自动查询编码表,GBK
                    字节流:可以处理任意文件

            1.2,按流向分为读取流和输出流

                    输入流读取文件

                    输入的字符流: Reader 这个流对象中的最高的父类
                    输入的字节流: InputStream 这个流对象中的最高父类

                    输出流 写入文件
                    输出的字符流:Writer 这个流对象中的最高父类
                    输出的字节流:OutputStream 这个流对象中的最高父类

二、字符流FileReader与FileWriter

        1,字符流写一个文本文件

              1.1,创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定目录下,如果文件已存在,文件将被覆盖

              1.2,调用written方法将数据写入流中

              1.3,刷新流对象中缓冲中的数据,将数据刷到目的地中

              1.4,关闭流资源

//字符流写一个文本文件
import java.io.*;
class FileWriterDemo 
{
	public static void main(String[] args)
	{
		FileWriter fw = null;
		try{
		fw = new FileWriter("demo.txt",true);
		fw.write("abcdefg");
		fw.flush();
		}
		catch(IOException e){
		  System.out.println(e);
		}finally{
			try{
			if(fw!=null)
			fw.close();
			}catch(IOException e){}
		}
	}
}

       2, 字符流读取一个文本文件

              2.1,创建FileReader对象,该对象一被初始化就必须要明确被操作的文件,数据源

              2.2,read(字符数组)提高读取的效率,read方法返回一个int 值,表示数组中的有效字符个数

              2.3,将数组变成字符串输出

              2.4,关闭流资源

//字符流读取文件
import java.io.*;

class FileReaderDemo 
{
	public static void main(String[] args) 
	{
		FileReader fr = null;
		try
		{
			fr = new FileReader("demo.txt");
			int x = 0 ; 
			char[] ch = new char[10];
			//read(字符数组)读取字符,放到数组中
			//缓冲的作用,提供读取的效率
			//返回数组中,放了多好个有效的字符
			while( (x = fr.read(ch))!=-1){
			  System.out.print(new String(ch,0,x));
			}
		}
		catch (IOException e)
		{

		}
		finally{
		   try
		   {
			if(fr!=null)
				fr.close();
		   }
		   catch (IOException e)
		   {
		   }
		}
	}
}

三、带有缓冲区对象BufferedReader与BufferedWriter

       1,BufferedWriter

             1.1,创建字符输出流对象操作文件

             1.2,为了提高效率加入缓冲技术,将字符流对象作为参数传递给BufferedWriter

             1.3,关闭缓冲区对象BufferedWriter

import java.io.*;
class BufferedWriterDemo 
{
	public static void main(String[] args) throws IOException
	{
		FileWriter fw = new FileWriter("d:\\BufferedWriter.txt");
		BufferedWriter bfw = new BufferedWriter(fw);
		for(int x = 0;x<5;x++)
		{
			bfw.write("abcde"+x);
			bfw.newLine();
			bfw.flush();
		}
		bfw.close();
	}
}

       2,BufferedReader

             2.1,创建字符输出流对象操作文件

             2.2,为了提高效率加入缓冲技术,将字符流对象作为参数传递给BufferedReader

             2.3,关闭缓冲区对象BufferedReader

import java.io.*;
class BufferedReaderDemo 
{
	public static void main(String[] args) throws IOException
	{
		FileReader fr = new FileReader("d:\\BufferedWriter.txt");
		BufferedReader bfr = new BufferedReader(fr);
		
		String s = null;
		while((s = bfr.readLine())!=null)
		{
			System.out.println(s);
		}
		bfr.close();
	}
}

四、复制文本文件

       通过字符的缓冲区复制文本文件

/*
  通过字符的缓冲区,复制文本文件
*/
import java.io.*;
class CopyText 
{
	public static void main(String[] args) 
	{
		//读写文件操作
		//先读(数据源),后写(数据目的)
		//建立缓冲区对象,用来读写
		BufferedReader bfr = null;
		BufferedWriter bfw = null;
		try
		{
		    bfr = new
			BufferedReader(new FileReader("q:\\COPYRIGHT"));

		    bfw = new
			BufferedWriter(new FileWriter("d:\\COPYRIGHT"));

			//BufferedReader提供读一行的方法 readLine
			//返回一个字符串,文件末尾,返回null

			//BufferedWriter提供了换行的方法 newLine
			//newLine方法有跨平台性,Window \r\n
			//Linux \n
			String line = null;
			while(( line = bfr.readLine() )!=null){
				bfw.write(line);
				bfw.newLine();
				bfw.flush();
			}
		}
		catch (IOException e)
		{
			System.out.println(e);
			throw new RuntimeException("复制失败");
		}finally{
			try
			{
				if(bfw!=null)
					bfw.close();
			}
			catch (IOException e)
			{
			}

			try
			{
				if(bfr!=null)
					bfr.close();
			}
			catch (IOException e)
			{
			}
		}
	}
}

五、字节流

        字节流处理任意文件,FileOutputStream用于写文件的字节流,FileInputStream 用于读取文件的字节流,读写操作,字节流只能读写字节数组。

         以复制图片为例

        1,建立FileOutputStream与FileInputStream对象确立数据源和目的

        2,FileInputStream对象的read方法读取数据,FileOutputStream对象的write方法写数据

        3,关闭读写资源

import java.io.*;
class CopyPicture 
{
	public static void main(String[] args) 
	{
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try
		{
			fis = new FileInputStream("E:\\1.jpg");
			fos = new FileOutputStream("E:\\1_copy.jpg");
			int len = 0;
			byte[] b = new byte[1024*1024];
			while((len = fis.read(b))!=-1)
				fos.write(b,0,len);
		}
		catch (IOException e)
		{
			throw new RuntimeException("文件复制失败");
		}finally
		{
			try
			{
				if(fis!=null)
					fis.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("读取关闭失败");
			}
			try
			{
				if(fos!=null)
					fos.close();
			}
			catch (IOException e)
			{
				throw new RuntimeException("写入关闭失败");
			}
		}
	}
}

六,转换流

       InputStreamReader  字节转成字符,OutputStreamWriter 字符转成字节。规律,构造方法中接收的都是字节流,都是用字符流的方法,操作字节流

       以获取键盘录入,默认输出到控制台为例

        1,键盘录入的内容是字符串,用readLine方法读取更快捷方便,但是读取键盘录入返回的是字节输入流,因而需将字节流转成字符流操作,这个类就是java.io.InputStreamReader

         2,System.out这个输出流是字节输出流,将字符串输出应将将字符流转成字节流进行操作,这个类就是OutputStreamWriter ,字符转成字节流。

import java.io.*;
class TransStreamDemo 
{
	public static void main(String[] args)throws IOException
	{
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		OutputStream out = System.out;
		OutputStreamWriter ops = new OutputStreamWriter(out);
		BufferedWriter bufw = new BufferedWriter(ops);
		String str = null;
		while((str = bufr.readLine())!=null)
		{
			if("over".equals(str))
				break;
			bufw.write(str);
			bufw.write(str);
			bufw.newLine();
		}
		bufr.close();
		bufw.close();

	}
}

七、打印流

       打印流:只操作数据目的,不操作数据源,在点对点通信,可以使用打印流将数据打印到另一台主机,在互联网的应用中,可以使用打印流将数据打印到客户端浏览器 

       1,PrintWriter 接收参数类型

             1.1,字节输出流

             1.2,字符输出流
             1.3,接收File对象

             1.4,字符串形式的文件名

        2,PrintStream 接收参数类型
             2.1,字节输出流

             2.2,接收File对象
             2.3,字符串形式的文件名

import java.io.*;
class PrintWriterDemo 
{
	public static void main(String[] args)throws IOException
	{
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(new FileWriter("PrintWriterDemo.txt"),true);
		String str = null;

		while((str = bufr.readLine())!=null)
		{
			if("over".equals(str))
				break;
			pw.println(str.toUpperCase());
		}

		bufr.close();
		pw.close();
	}
}

八、File类的一个应用

      使用File对象,遍历当前硬盘上的一个目录

      实现步骤:
             1. 将遍历的目录封装到File类的构造方法中,File(String pathname) 
             2. 调用File类中的一个方法 listFiles(),返回String pathname目录下的内容,返回的是一个File类型数组
             3. 遍历数组,

             4,取到了一个目录下的内容,但是获取不到子目录下的内容,使用递归对子目录进行遍历,获取子目录下的内容

import java.io.*;
class FileDemo 
{
	public static void main(String[] args) 
	{
		getAllFiles(new File("c:\\demo"));
	}
	public static void getAllFiles(File file){
		File[] files = file.listFiles();
		for( File f : files){
			if(f.isDirectory())//f遍历到得是一个目录
			  getAllFiles(f);
			else
			  System.out.println(f);
		}
	}
}



 

 

       
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

       




 

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值