学习IO流之字节流和字符流

字节流和字符流的操作方式几乎完全一样,区别之是操作的数据单元不同,字节流操作的数据单元是直接,字符流操作的数据单元是字符。

字节和字符输入流,在java类中,分别是InputStream 和Reader,这两个类都是抽象类,不能实例化,对于文件的读取,可以使用FileInputStream和FileReader子类来使用

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest {

	public static void main(String[] args) throws IOException {
		// 创建字节输入流
		FileInputStream fis = new FileInputStream("src/notes/io/FileInputStreamTest.java");
		// 创建一个长度为1024的byte类型的储存流的数组
		byte[] buff = new byte[1024];
		// 用来保存实际读取的字节数
		int len = 0;
		while ((len = fis.read(buff)) > 0) {
			// 取出储存在数组中的数据,将字节数转换成为字符串输出
			System.out.println(new String(buff, 0, len));
		}
		// 关闭流
		fis.close();

	}

}
在上面代码中,使用了一个长度为1024字节的数组来读取该文件,解决在读取文件中,如果遇到中文字符,每个中文字符占两个直接,只读单个字节会出现乱码的问题。上面程序最后使用了fis.close()来关闭该文件流,在jdk7中,改写了所有的IO资源类,他们都是先了AutoCloseable接口,所有都可以通过自动关闭资源的try语句来关闭这些IO流。虾米啊你程序使用FIleReader来读取文件本身。

import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {

	public static void main(String[] args) {
		// 创建字符输入流 放到try()里面 fr将自动关闭 jdk1.7开始支持
		try (FileReader fr = new FileReader("src/notes/io/FileReaderTest.java");) {
			char[] cbuf = new char[32];
			int len = 0;
			while ((len = fr.read(cbuf)) > 0) {
				System.out.println(new String(cbuf, 0, len));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


通常来说字节流的功能比字符流的功能强大,因为计算机所有的数据都是二进制的,但是遇到处理文本文件,就需要将字节转换成字符,增加了编程的复杂度,所以通常有一个规则:如果进行输入/输出的内容是文本内容,则应该考虑使用字符流,如果进行输入/输出的内容是二进制内容,则应该考虑使用字节流。


通过RandomAccessFile类,实现向指定文件、指定位置插入内容的功能

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

public class InserContent {
	/**
	 * 向文件指定位置插入数据
	 * 
	 * @param fileName
	 *            插入数据的文件
	 * @param pos
	 *            文件中插入数据的起始位置
	 * @param insertContent
	 *            插入的内容
	 * @throws IOException
	 */
	public static void insert(String fileName, long pos, String insertContent) throws IOException {
		File tmp = File.createTempFile("tmp", null);
		tmp.deleteOnExit();// 当JVM退出时删除当前文件
		// 流的创建放到try(),推出时候自动关闭 jdk1.7开始
		try (RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
				FileOutputStream tmpOut = new FileOutputStream(tmp);
				FileInputStream tmpIn = new FileInputStream(tmp);) {
			raf.seek(pos);// 设置指针位置
			// -----------下面将插入点后面的代码复制到输出到临时文件中---------------
			byte[] bbuf = new byte[64];
			int len = 0;
			while ((len = raf.read(bbuf)) > 0) {
				tmpOut.write(bbuf, 0, len);
			}
			// ------------下面代码用于插入内容-----------
			// 将指针重新定位到pos位置
			raf.seek(pos);
			// 追加插入的内容
			raf.write(insertContent.getBytes());
			// 将临时文件中的内容追加到文件末尾
			while ((len = tmpIn.read(bbuf)) > 0) {
				raf.write(bbuf, 0, len);
			}
		}
	}

	public static void main(String[] args) throws IOException {
		insert("src/notes/io/InserContent2.java", 0, "\\\\插入追加的内容\t\n");
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值