博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java I/O操作汇总
阅读量:7103 次
发布时间:2019-06-28

本文共 9903 字,大约阅读时间需要 33 分钟。

作者:卿笃军

原文地址:

本文简绍解说了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)注意,换行须要用“\r\n”实现。

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");			//注意换行须要用“\r\n”来实现			fWriter.write("I'm Dolphin.\r\n我叫海豚.");		} 		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.\r\n我叫海豚.");		} 		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.mp3public 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视频,毕向东主讲。

转载于:https://www.cnblogs.com/clnchanpin/p/6776367.html

你可能感兴趣的文章
VC++技术内幕(二)
查看>>
我们做微信二次开发的意义
查看>>
matlab练习程序(PSNR)
查看>>
Debian出现in the drive ‘/media/cdrom/’ and press enter解决办法
查看>>
SkRefCnt
查看>>
1.把一个字符串内的正整数相加
查看>>
日记(二)
查看>>
list,tuple,set,dict基础
查看>>
PIC中的#pragma idata 和#pragma udata
查看>>
使用FileAudit在Windows服务器上实现最优文件访问监控
查看>>
mysql 远程连接数据库的二种方法
查看>>
一步一步学android OpenGL ES2.0编程(4)
查看>>
corosync 源代码分析1
查看>>
寻找Cydia里面软件安装包deb文件的真实下载地址
查看>>
如何收缩日志文件
查看>>
解决Excel打开UTF-8编码的CSV文件乱码的问题
查看>>
Powershell invoke-command vs -computerName 效率比较
查看>>
送给那些有代码基础但仍旧不会学自动化测试的朋友们
查看>>
做公关必用的四大法宝
查看>>
Microsoft Hyper-V Server 2012开启虚拟化-虚拟机管理
查看>>