zoukankan      html  css  js  c++  java
  • Java I/O操作汇总

    作者:卿笃军

    原文地址:http://blog.csdn.net/qingdujun/article/details/41154807


    本文简绍解说了FileWriter、FileReader、BufferWriter、BufferReader、LineNumReader、FileOutputStream、FileInputStream、BufferInputStream、BufferOutputStream等流操作技术。

    ——————————————————————————————————————————————————————

    1、明白“源”和“目的”:

                                      字节流              字符流

          源(输入流):InputStream()、 Reader();

          目的(输出):OutputStream()、Reader()。

    2、明白数据是否“纯文本”:

          是:字符流;

          否:字节流。

    3、明白详细使用对象:

         源设备:内存、硬盘、键盘。

         目的   : 内存、硬盘、控制台。

    ——————————————————————————————————————————————————————

    1、写文件FileWriter

    flush()和close()的差别:

    1)flush()刷新流后,将数据写入文件里,流还能够使用;

    2)close()关闭流之前。会自己主动调用flush()刷新流。

    关闭后。流不能再次使用。

    package io.dol.sn;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriterDemo {
    
    	public static void main(String[] args) throws IOException {
    
    		//创建对象,就一定要明白被操作的文件。

    假设该文件夹下已有同名文件,该文件将被覆盖。 FileWriter fWriter = new FileWriter("demo.txt"); //写入流中,并非直接写在demo.txt里面 fWriter.write("I's Dolphin"); //刷新流中数据 //fWriter.flush(); fWriter.close();//关闭之前会刷新一次缓冲流 //flush刷新后,流能够继续用 //close之后,流被关闭 } }

    2、对写文件操作加入异常捕捉try:

    1)FileWriter()、write()、close()都会产生抛出;

    2)我们将close()放在finally里面进行处理;

    3)那么。须要将fWriter变量定义在外面,同一时候须要再又一次try一次close()。

    4)注意,如果创建文件失败,则fWriter=null; 此时进入finally调用close()。异常。

    所以须要判null。

    5)注意,换行须要用“ ”实现。

    package io.dol.sn;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriterDemo {
    
    	public static void main(String[] args) {
    		//须要将申明写在外面。否则finally中会出现变量没有定义
    		FileWriter fWriter = null;
    		try 
    		{
    			fWriter = new FileWriter("demo.txt");
    			//注意换行须要用“
    ”来实现
    			fWriter.write("I'm Dolphin.
    我叫海豚.");
    		} 
    		catch (IOException e) {
    			System.out.println("文件创建失败");
    		}
    		finally{
    			try {//注意:close()要单独try
    				//同一时候要对流是否为空进行推断
    				if (fWriter != null)
    					fWriter.close();
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }

    3、读文件FileReader

    read()函数,每次读取一个字符。返回值为int。

    package io.dol.sn;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderDemo {
    
    	public static void main(String[] args) {
    
    		FileReader fReader = null;
    		try 
    		{
    			fReader = new FileReader("demo.txt");
    			//read()一次读一个字符,且自己主动往后移动
    			int ch = fReader.read();
    			//System.out.println(ch);
    			System.out.println((char)ch);
    		} 
    		catch (IOException e) {
    			System.out.println("文件读取失败");
    		} 
    		finally{
    			try {
    				if (fReader != null)
    					fReader.close();
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    改进后1,用个while()循环,每次读取一个字符直到将文件所有读取完成。

    package io.dol.sn;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderDemo {
    
    	public static void main(String[] args) {
    
    		FileReader fReader = null;
    		try 
    		{
    			fReader = new FileReader("demo.txt");
    			int ch = 0;
    			//read()一次读一个字符。且自己主动往后移动
    			while ((ch = fReader.read()) != -1)
    			{
    				//System.out.println(ch);
    				System.out.print((char)ch);
    			}
    		} 
    		catch (IOException e) {
    			System.out.println("文件读取失败");
    		} 
    		finally{
    			try {
    				if (fReader != null)
    					fReader.close();
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    

    改进后2,每次读取一块数据直到将文件读完。

    这里注意一下。int read(char [])返回值为成功读取到的数据。

    package io.dol.sn;
    
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderDemo {
    
    	public static void main(String[] args) {
    
    		FileReader fReader = null;
    		try 
    		{
    			fReader = new FileReader("demo.txt");
    			//注意,这里随便开辟3个空间,一般开辟为2的整数倍。如1024
    			char buf[] = new char[3];
    			int n = 0;
    			//int read(char[])返回值为读取成功的个数
    			while ((n=fReader.read(buf)) != -1)
    			{
    				System.out.print(new String(buf,0,n));
    			}
    		} 
    		catch (IOException e) {
    			System.out.println("文件读取失败");
    		} 
    		finally{
    			try {
    				if (fReader != null)
    					fReader.close();
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    4、文件缓冲区之写文件操作BufferedWriter

    1)缓冲区的出现,是为了提高流的操作效率;

    2)所以,创建缓冲区之前,必须有流;

    3)缓冲区提供了一个跨平台是方法:newLine()  这里不做过多说明。

    package io.dol.sn;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    
    //缓冲区的出现。是为了提高流的操作效率;
    //所以。创建缓冲区之前。必须有流。
    public class BufferWriterDemo {
    
    	public static void main(String[] args) {
    		
    		BufferedWriter bfBufferedWriter = null; 
    		FileWriter fWriter = null;
    		try 
    		{
    			//创建一个文件
    			fWriter = new FileWriter("demo.txt");
    			//将数据流关联上缓冲区,以后都是直接对缓冲区操作
    			bfBufferedWriter = new BufferedWriter(fWriter);
    			bfBufferedWriter.write("I'm Dolphin.
    我叫海豚.");
    		} 
    		catch (IOException e) {
    			System.out.println("文件创建失败");
    		}
    		finally{
    			try {
    				if (bfBufferedWriter != null)
    				{
    					//凡是牵涉到缓冲区的都须要刷新数据
    					bfBufferedWriter.flush();
    					//这里关闭缓冲区。事实上就相当于是关闭了数据流
    					bfBufferedWriter.close();
    					//fWriter.close() 就不须要调用了
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    

    5、文件缓冲区之读文件操作BufferedReader

    注意:这里的readLine()方法,仅仅返回回车前的内容。并不返回回车符;所以,读取多行的时候。会出现不换行情况。

    package io.dol.sn;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class BufferReaderDemo {
    
    	public static void main(String[] args) {
    		
    		BufferedReader bfBufferedReader = null; 
    		FileReader fReader = null;
    		try 
    		{
    			//打开一个文件
    			fReader = new FileReader("demo.txt");
    			//将数据流关联上缓冲区,以后都是直接对缓冲区操作
    			bfBufferedReader = new BufferedReader(fReader);
    			//String readLine()这种方法非常牛。一次从文本读取一行数据
    			String buf = bfBufferedReader.readLine();
    			System.out.println(buf);
    		} 
    		catch (IOException e) {
    			System.out.println("文件创建失败");
    		}
    		finally{
    			try {
    				if (bfBufferedReader != null)
    				{
    					bfBufferedReader.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    改进后,每次读取一行,循环读取,实现读取文件里的全部数据.

    package io.dol.sn;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class BufferReaderDemo {
    
    	public static void main(String[] args) {
    		
    		BufferedReader bfBufferedReader = null; 
    		FileReader fReader = null;
    		try 
    		{
    			fReader = new FileReader("demo.txt");
    			bfBufferedReader = new BufferedReader(fReader);
    			//String readLine()读取到文件末尾返回值为null
    			String buf = null;
    			while ((buf=bfBufferedReader.readLine()) != null)
    				System.out.println(buf);
    		} 
    		catch (IOException e) {
    			System.out.println("文件创建失败");
    		}
    		finally{
    			try {
    				if (bfBufferedReader != null)
    				{
    					bfBufferedReader.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    6、跟踪行号缓冲字符输入流LineNumberReader

    此类定义了方法getLineNumber(int)和getLineNumber()用于设置行号和获取行号;

    package io.dol.sn;
    
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.LineNumberReader;
    
    public class LineNumberReaderDemo {
    
    	public static void main(String[] args) {
    
    		LineNumberReader lnReader = null; 
    		FileReader fReader = null;
    		try 
    		{
    			fReader = new FileReader("demo.txt");
    			lnReader = new LineNumberReader(fReader);
    
    			String buf = null;
    			//行号默认是从0開始。我们设置从100開始
    			lnReader.setLineNumber(100);
    			while ((buf=lnReader.readLine()) != null)
    				System.out.println(lnReader.getLineNumber()+":"+buf);
    		} 
    		catch (IOException e) {
    			System.out.println("文件创建失败");
    		}
    		finally{
    			try {
    				if (lnReader != null)
    				{
    					lnReader.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    

    7、字节流操作之写文件FileOutputStream

    当我们须要对图片视频等数据进行操作的时候,就须要用到字节流。

    package io.dol.sn;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    //图片数据就须要用到字节流
    public class FileOutputStreamDemo {
    
    	public static void main(String[] args) {
    		
    		FileOutputStream fos = null;
    		try 
    		{
    			fos = new FileOutputStream("demo.txt");
    			//直接对字节流进行操作是不须要刷新的
    			fos.write("abcde".getBytes());
    		} 
    		catch (IOException e) 
    		{
    			System.out.println("文件创建失败");
    		}
    		finally
    		{
    			try {
    				if (fos != null)
    				{
    					fos.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}	
    	}
    }
    
    8、字节流操作之读文件FileInputStream

    推荐用该方法读取数据,后面我讲到的那种方法不推荐;

    package io.dol.sn;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamDemo {
    
    	public static void main(String[] args) {
    		
    		FileInputStream fis = null;
    		try 
    		{
    			fis = new FileInputStream("demo.txt");
    			byte[] buf = new byte[1024];
    			int len = 0;
    			while ((len=fis.read(buf)) != -1)
    			{
    				System.out.println(new String(buf,0,len));
    			}
    		} 
    		catch (IOException e) 
    		{
    			System.out.println("文件创建失败");
    		}
    		finally
    		{
    			try {
    				if (fis != null)
    				{
    					fis.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    补充一种另外的方法,不推荐使用该方法读取数据。

    package io.dol.sn;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamDemo {
    
    	public static void main(String[] args) {
    		
    		FileInputStream fis = null;
    		try 
    		{
    			fis = new FileInputStream("demo.txt");
    			//获得文件大小
    			int num = fis.available();
    			//定义一个刚刚好的数组大小。这样下面就不用再for循环读取了。
    			//可是怎样这种话,一个电影1G大小,难道我们开辟一个这么大的数组?!
    			byte[] buf = new byte[num];
    			int len = 0;
    			while ((len=fis.read(buf)) != -1)
    			{
    				System.out.println(new String(buf,0,len));
    			}
    		} 
    		catch (IOException e) 
    		{
    			System.out.println("文件创建失败");
    		}
    		finally
    		{
    			try {
    				if (fis != null)
    				{
    					fis.close();
    				}
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    9、使用字节流实现对文件进行拷贝操作BufferInputStream、BufferOutputStream

    1)创建两个流(输入流,输出流);

    2)与缓冲区建立关联;(这里仅仅是为了加快拷贝速度,该步骤可省略)。

    3)開始拷贝。

    以下展示一个mp3拷贝样例:

    package io.dol.sn;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    //加入缓冲区对字节流进行操作,将1.mp3拷贝为2.mp3
    public class BufferIOputStreamDemo {
    
    	public static void main(String[] args) {
    		
    		BufferedInputStream bfi =  null;
    		BufferedOutputStream bfo = null; 
    	
    		try 
    		{
    			//将两个字节流与缓冲流建立关联
    			bfi = new BufferedInputStream(new FileInputStream("D:\1.mp3"));
    			bfo = new BufferedOutputStream(new FileOutputStream("D:\2.mp3"));
    			
    			int byteNum = 0;
    			//先把硬盘数据弄进缓冲区,read()方法是从缓冲区里取数据
    			while ((byteNum=bfi.read()) != -1)
    			{
    				bfo.write(byteNum);
    			}
    		} 
    		catch (IOException e) 
    		{
    			System.out.println("文件创建失败");
    		}
    		finally
    		{
    			try {
    				if (bfi != null)
    					bfi.close();
    				if (bfo != null)
    					bfo.close();
    			} catch (IOException e2) {
    				System.out.println("文件关闭失败");
    			}
    		}
    	}
    }
    
    原文地址:http://blog.csdn.net/qingdujun/article/details/41154807

    參考文献:Java视频,毕向东主讲。



  • 相关阅读:
    一、定义枚举类,并随机取值
    常用Linux日志查询命令
    一、爬虫之基础
    Jmeter接口自动化-3-生成HTML报告
    Jmeter接口自动化-2-查看结果数只能显示有限的数据,查看全部数据
    Jmeter接口自动化-1-启动报错:Could not initialize class org.apache.jmeter.gui.util.MenuFactory
    三十一、Java基础之Collection集合
    设计模式
    缓存
    Ckeditor配置
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6776367.html
Copyright © 2011-2022 走看看