一、换行
windows:\r\n
linux:\n
mac:\r
getBytes()方法可以将字符串的码找出来从而在写文件时更方便
二、追加写入
在创建字节流对象时,在路径后面加上true就是追加写入模式
三、异常处理
finally块用来执行所有清除操作,比如这里IO流的释放资源
被finally控制的语句一定会执行,除非JVM退出
四、字节流读数据
FileInputStream()字节输入流
read()读一个字节,并且转换成ASCII码,要想读出得强制转换成char型
read一次读一个,读到末尾返回-1
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class InputTest {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("C:\\data\\word.txt");//在目录后面加上true就会变成追加模式,不会覆盖原文件了
// getByte方法简化了写文件
fos.write("abc".getBytes());
// 仍然可以通过换行符换行,但是注意操作系统
fos.write("\n".getBytes());
fos.write("hello".getBytes());
fos.write("\n".getBytes());
fos.write("world".getBytes());
fos.close();
FileInputStream fis=new FileInputStream("C:\\data\\word.txt");
// 一次只读一个字节,剩下的下次read在读
System.out.println((char) fis.read());
int f;
// 从结果可以看出,第一行的a在上面读了,循环里就没有读它
// 循环条件里,被括号包着的每次循环都给f赋值了,简化了代码
while((f=fis.read())!=-1){
System.out.print((char) f);
}
fis.close();
}
}
结果
追加:一次读一个byte数组的数据
创建数据输入流对象:FileInputStream fis=new FileInputStream("")
先定义一个字符数组:byte[] bye=new byte(int)
再读取出一个数组的数据:fis.read(bye)
注意:由于读出的数据先存放进数组中,所以再次读取时后面的数据会覆盖之前的数据
并且它的返回值是读取数据的长度,而不是数组的长度,这就会导致读取到最后几个数
据的时候,数组中会留有上一次读取的数据,而返回值确实这一次读取数据的长度
下面是一个练习
import java.io.FileInputStream;
import java.io.IOException;
public class readTest {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("C:\\data\\test.txt");
/*
* 文件test中的数据为
* hello
* world
* */
// 第一次读取,这个数组只能读5个,说以读了hello,返回5
byte[] bye=new byte[5];
int len=fis.read(bye);
System.out.println(len);
System.out.println(new String(bye));
// 第二次读取,仍然读取5个,这次读取的是\r\n加上wor,从结果那里换了一行可以看出来
len=fis.read(bye);
System.out.println(len);
System.out.println(new String(bye));
// 第三次读取只剩下ld可以读取,所以返回了2,并且覆盖掉了数组前两个数据,所以数组中现在是ldwor
len=fis.read(bye);
System.out.println(len);
System.out.println(new String(bye));
}
}
结果