字节流和字符流的操作方式几乎完全一样,区别之是操作的数据单元不同,字节流操作的数据单元是直接,字符流操作的数据单元是字符。
字节和字符输入流,在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");
}
}