Java文件读写

首先,我们的目的是:通过java源代码的运行将文件从一个地方复制到另外一个地方。只需要两步就可以了——将文件读出来,将读出来的内容保存到新建的一个文件夹内。

  现在介绍两种最基本的方法——字节流InputStream和缓冲流BufferedInputStream。第一种是将磁盘中文件的内容一个一个字节的读出写入;后一种则是将文件一段一段的读出写入。在创建 BufferedInputStream 时,会相应的创建一个内部缓冲区数组在java虚拟机内存中,因此每次处理的就是这一整块内存。

  我们先用InputStream来实现这一功能,然后再用BufferedInputStream 实现,最后比较这两者的优劣。

<span style="white-space:pre">	</span>/**
	 * 读取指定文件内容
	 * 
	 * @param fileName被复制文件名
	 * @return 将读取到的内容作为String类型返回
	 * @throws IOException
	 *             文件操作异常
	 */
	private String readFileString(String fileName)
			throws IOException {
		// java.io.InputStream抽象类是表示字节输入流的所有类的超类,java.io.FileInputStream是它的一个实现类
		// 定义这样的输入流对象,来进行文件操作
		java.io.InputStream ins = new java.io.FileInputStream(fileName);
		// 也可以这样(多个构造方法)
		// java.io.InputStream ins1 = new java.io.FileInputStream(new
		// File(fileName));
		// 根据ins中的字节长度 创建一个byte数组保存读出的数据
		byte[] contentByte = new byte[ins.available()];
		// 对contentByte数组赋值
		// 读入就是把文件中的东西读出后读入到另一个东西里去
		ins.read(contentByte);
		//方法二
//		while (true) {
//			int i = ins.read();
//			if(i == -1)
//				break;
//	
//		}
		//bis.available()对于大文件可能导致内存溢出
		/*byte[] contentByte = new byte[1024];
		OutputStream os = new FileOutputStream("fileName");
		while(true){
		 int ret = bis.read(contentByte);
		 if (ret > 0) {
			os.write(buf, 0, ret);
 		} else if (-1 == ret) {
			break;
 		}
		}
		os.close();  */
		// 把contentByte转变为String类型
		String s = new String(contentByte);
		//关闭文件流
		ins.close();
		System.out.println("InputStream使用结束,文件已被读出");
		return s;
	}

下一步就是创建一个新的文件,然后将刚刚获得的返回值写入进去便可了。

<span style="white-space:pre">	</span>/**
	 * contentString 文件的内容
	 * @param path新路径名 
	 * @throws IOException
	 *             文件操作异常
	 */
	private void whiteFile_OutputStream(String contentString, String path)
			throws IOException {
		// 定义输出流对象,来进行文件操作
		java.io.OutputStream os = new java.io.FileOutputStream(path);
		// 对contentByte数组赋值
		byte[] contentByte = contentString.getBytes();
		//写入path中
		os.write(contentByte);
		os.close();
		System.out.println("OutputStream结束,文件已被复制");
	}

这样的话filename里面的文件就被复制到了path里面。
     下面我们再看一下如果是BufferedInputStream 会怎么样。

<span style="white-space:pre">	</span>/**
	 * 复制指定文件内容
	 * @param path新文件的路径
	 * @param fileName
	 * 
	 * @throws IOException
	 *             文件操作异常
	 */
	private void copyBuffered(String fileName, String path)
			throws IOException {//还是需要先 定义InputStream输入流对象	
		java.io.InputStream ins = new java.io.FileInputStream(fileName);
		// 创建一个BufferedInputStream对象时 需要用InputStream作为输入
		java.io.BufferedInputStream bis = new java.io.BufferedInputStream(ins);
		// 文件复制中的输出流
		java.io.OutputStream os = new java.io.FileOutputStream(path);
		java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(os);
		// 根据ins中的字节长度 创建一个byte数组保存读出的数据
		byte[] contentByte = new byte[bis.available()];
		// 对contentByte数组赋值
		// 读入就是把文件中的东西读出后读入到另一个东西里去
	           bis.read(contentByte);
		bos.write(contentByte);
//方法二		while (true) {
//			int i = bis.read();
//			if (i == -1) {
//				break;
//			}
//			bos.write(i);
//		}
		System.out.println("BufferedInputStream拷贝结束");
		bos.flush();// 将缓冲区中的内容强制全部写入到文件中(不管是否已经全部写入)有点类似于下面的语句
		// bos.close();
		// bis.close();
		// os.close();
		// ins.close();
		
	}

读者将会发现其实并没有多少区别。

   只能说,形式的确是如此。但程序运行时内部的处理是不同的,这体现为后者的读取复制速度远远快于前者。

 


转自:http://java--hhf.iteye.com/blog/1747507
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值