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

来源:互联网 发布:linux定时执行脚本 编辑:程序博客网 时间:2024/06/05 22:40

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

字节和字符输入流,在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
原创粉丝点击