1. 字节流
1. InputStream/OutputStream 都是抽象类,所以不能new对象,要借助子类完成,所以都是
直接子类FileInputStream/FileOutputStream is/os = new File…();
2. 如果想加快效率,可以对FileInputStream/out.. 增加管道BufferedInputStream/out..
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path1));
BufferedOutputStream bos = new BufferedOutputStream(new FileInputStream(path2));
3. 当然,FileInputStream/out 也可以自定义缓冲数组实现 Buffered的功能,在调用read/write 方法时,传入 自定义的数组即可
自定义缓冲数组标准代码:
FileInputStream fis = new FileInputStream("致青春.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
int len;
byte[] arr = new byte[1024 * 8]; //自定义字节数组
while((len = fis.read(arr)) != -1) {
//fos.write(arr);
fos.write(arr, 0, len); //写出字节数组写出有效个字节个数
}
fis.close();
fos.close();
标准字节流代码:
FileInputStream fis = new FileInputStream("致青春.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
byte[] arr = new byte[1024];
int len;
while((len = fis.read(arr)) != -1) {
fos.write(len); //写出字节数组写出有效个字节个数
}
fis.close();
fos.close();
2. 字符流
1. 基本使用方式 参考 字节流
FileReader---FileInputStream BufferedReader---BufferedInputStream
FileWriter---FileOutputStream BufferedWriter---BufferedOutputStream
2. 什么情况下使用字符流
只读/只写的情况下 考虑使用
* 字符流**只能拷贝纯文本文件**, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组
3. BufferedReader的 reanLine,Writer的newLine方法
* BufferedReader的readLine()方法可以读取一行字符(不包含换行符号):更高效的读取文本
* BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
//bw.write("\r\n"); //只支持windows系统
bw.newLine(); //跨平台的
}
br.close();
bw.close();
4. LineNumberReader:
* LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
* 调用getLineNumber()方法可以获取当前行号
* 调用setLineNumber()方法可以设置当前行号
*
LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt"));
String line;
lnr.setLineNumber(100); //设置行号,默认值0
while((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + line);//获取行号,第一行101而不是100
}
lnr.close();
5. 使用指定的码表读写字符
看图就好了,代码里无非就是在 字符流inputStreamReader/outputStreamWriter后面 加一个 码表名称 "utf-8","GBK","unicode"等
new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"),"utf-8"));
3. 内存输出流 ByteArrayOutputStream
ByteArrayOutputStream:
* 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
* 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据(避免字节流读取文字乱码)
代码:
FileInputStream fis = new FileInputStream("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();// 创建时,自动再内存中创建byte数组,并且会自动增长
int b;
while((b = fis.read()) != -1) {
baos.write(b); //写到内存中
}
//byte[] newArr = baos.toByteArray(); //将内存缓冲区中所有的字节存储在newArr中,使用toByteArray 是可以制定 码表
//System.out.println(new String(newArr));
System.out.println(baos); // 直接toString,是默认码表
fis.close(); //内存输出流不需要关,因为是在内存中,没有与硬盘连接的管道