大佬的理解->《Java IO(三) -- 字节流》
1、FileInputStream
1.1 初始化
FileInputStream(String name) |
---|
FileInputStream(File file) |
//直接通过文件地址初始化
FileInputStream fis = new ileInputStream("D:/test/test1.txt");
//通过File对象初始化
File file = new File("D:/test/test1.txt");
FileInputStream fis = new FileInputStream(file)
1.2 获取文件大小
available()
代码语言:javascript复制FileInputStream fis = new ileInputStream("D:/test/test1.txt");
fis.available(); //文件大小
1.3 读取文件内容
read() | 读取一个字节(返回对应字节的ascii码值) |
---|---|
read(byte b[]) | 根据字节缓冲数组的长度,进行读取(返回读取的字节数) |
read()
代码语言:javascript复制//文件 D:/test/test1.txt
内容
KH96abcdefghijk
代码语言:javascript复制FileInputStream fis = new ileInputStream("D:/test/test1.txt");
while (true){
//read() 方法:从输入流对象中,一次读取一个字节(返回的是对应字节的ascii码值,int类型)
int hasRead = fis.read();
//当读取到末尾,返回-1,代表文件读取结束
if(hasRead == -1){
break;
}
System.out.print((char) hasRead);
//打印文件中字符的ascii值
//转化为字符:KH96abcdefghijk
}
//最后一定要关闭资源
fis.close();
运行结果:
代码语言:javascript复制源文件的大小:15
KH96abcdefghijk
read(byte b[])
代码语言:javascript复制带缓冲字节数,读取文件内容,一次读取就不是一个字节,而是根据字节缓冲数组的长度,进行读取
错误案例
读取时通过read()来判断是否继续循环,读取到错误值
代码语言:javascript复制FileInputStream fis = new ileInputStream("D:/test/test1.txt");
//带缓冲字节数,根据字节缓冲数组的长度,进行读取
byte[] bytes = new byte[5];
//容易出错的判断方式:read()方式执行一次,就读取一个字节(没有保存,读完就扔,字节丢失),不可以作为判断条件
while(fis.read() != -1){
//循环读取内容
//带缓冲数组的读取,方法返回的是读取的字节数,不是读取的内容
//每次读取的数据,是由缓冲字节数组长度决定,每次都是从上一次读取的位置后开始继续读取,每次都是将读取的内容依次放入缓存数组
int hasRead = fis.read(bytes);
System.out.println("读取的字节数:" hasRead);
System.out.println(new String(bytes));
System.out.println("读取文件成功");
}
fis.close();
运行结果:
代码语言:javascript复制源文件的大小:15
读取的字节数:5
H96ab //K丢失
读取文件成功
读取的字节数:5
defgh //c丢失
读取文件成功
读取的字节数:2
jkfgh //i丢失,并且还多出了上一次留下 dgh,这是因为没有读满缓冲字节数组,而造成的读取上一次的值
读取文件成功
正确案例
因为带字节缓冲数组返回的时读取到的长度,所以,用读取到的长度来判断是否要继续读取,和要写入多少个字节;
代码语言:javascript复制FileInputStream fis = new ileInputStream("D:/test/test1.txt");
//带缓冲字节数,根据字节缓冲数组的长度,进行读取
byte[] bytes = new byte[5];
//正确写法
int hasRead = 0;
while((hasRead = fis.read(bytes)) > 0){
//每次读取的内容
System.out.println(new String(bytes,0,hasRead));
}
fis.close();
运行结果:
代码语言:javascript复制源文件的大小:15
KH96a
bcdef
ghijk
// 没有丢失字节
1.4 资源关闭
close();
在使用流资源的时候一定要关闭资源,否则会造成资源浪费;
放在try( ) 里面
JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源;
2、FileOutputStream
2.1初始化
FileOutputStream(File file) |
---|
FileOutputStream(File file, boolean append) |
FileOutputStream(String name) |
FileOutputStream(String name, boolean append) |
与FileInputStream类似,不过写入的文件不一定要存在,如果文件不存在,会自动创建一个空的文件;
2.2 写入方式 boolean append
boolean append 使用否以追加方式方式写入;
代码语言:javascript复制false(默认值,覆盖)
true(追加)
2.3 写入文件内容
write(byte b[]) |
---|
write(byte b[], int off, int len) |
String string = "KH96班,正在学习文件输出流,输出文件2";
//File file = new File("D:/test/test2.txt");
//JDK1.7以后,只需将资源初始化放在try()里面就可以不用手动关闭流资源,推荐使用;
try(FileOutputStream fos = new FileOutputStream("D:/test/test2.txt",true)){
//将字符串转成字节数组,写入目标文件
fos.write(string.getBytes());
//手动刷新缓冲区
fos.flush();
}catch (IOException e){
e.printStackTrace();
}