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)注意,换行须要用“\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.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视频,毕向东主讲。

时间: 2024-08-01 06:45:45

Java I/O操作汇总的相关文章

Scala中List、Map、Set各类型操作汇总

1.Scala中List.Map.Set等各类型函数操作汇总 package com.scala.study import scala.collection.immutable.{Queue, TreeMap}import scala.collection.mutable /**  * Created by HP-PC on 2016/5/26.  */ object ScalaCaseDemo {  def main(args: Array[String]): Unit = {    prin

JAVA使用和操作properties文件

java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties文件中,可以用"#"来作注释,properties文件在Java编程中用到的地方很多,操作很方便.Properties 类存在于包 Java.util 中,该类继承自 Hashtable. 1. getProperty ( String  key) ,   用指定的键在此属性列表中搜索

SQL字符串操作汇总

--将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处 select stuff('hello,world!',4,4,'****') --返回值hel****orld! --返回从指定位置开始指定长度的字符串 select substring('Hello,World!',2,10) --返回值ello,World --将字符串中某段字符替换为指定的字符串 select replace('hello,world!','ll','aa') --返回值heaao,world! --

Java 文件写操作

在进行文件写操作的时候,有两种操作方方式.一个是连续写,一个是覆盖式写. 代码如下: import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; // text:要写入的内容:isAppend:写入方式,true为连续写,false为覆盖式写入. public void write(String text

Java的JXL操作xls表格

jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件. 另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式. 使用如下: 搭建环境 将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

java大数字操作:BigInteger,BigDecimal(浮点型)

java大数字操作: BigInteger:大数字整型的 BigDecimal(浮点型):大数字小数的,也适用大的整数 BigInteger: String num1 = "100381828646148164"; String num2 = "10998979766868"; BigInteger big1 = new BigInteger(num1); BigInteger big2 =new BigInteger(num2); System.out.print

提升效率的Linux终端快捷操作汇总

很多普通 Linux 桌面用户都对使用终端感到排斥和恐惧,其实它没大家想的那么复杂,很多常见操作都可以直接在终端中进行,如:安装软件.升级系统等. 无论你是新手还是 Linux 终端使用的老鸟,系统极客在此为大家总结了提升终端命令执行效率的快捷操作汇总,希望能帮助你学习和提升效率. 移动定位光标 在终端中移动光标和定位似乎非常不便,其实不是你想的那样,有很多种方式可以让键盘成为你的好朋友,只是需要掌握正确的方法而已. 定位单词 在长段的命令中,使用 Ctrl + ← 和 Ctrl + → 可快速

JS数组(Array)操作汇总

1.去掉重复的数组元素.2.获取一个数组中的重复项.3.求一个字符串的字节长度,一个英文字符占用一个字节,一个中文字符占用两个字节.4.判断一个字符串中出现次数最多的字符,统计这个次数.5.数组排序. 6.快排. 7.删除/添加数组项. 8.数组随机顺序输出. 9.数组求和.最大值. 10.判断是否为数组. 11.冒泡排序. 1.去掉重复的数组元素. Array.prototype.unique = function() { var ret = []; var o = {}; for(var i