Java—— IO流 第一期
什么是IO流
存储和读取数据的解决方案
I:input
O:output
流:像水流一样传输数据
IO流的作用
用于读写数据(本地文件,网络)
IO流的分类
按照流向分类
输出流:程序 --> 文件
输入流:文件 --> 程序
按照操作文件的类型分类
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件(用windows系统自带的记事本打开并且能读懂的文件,例如txt文件,md文件,xml文件,lrc文件等)
字节流的实现类
操作本地文件的字节输出流FileOutputStream
可以把程序中的数据写到本地文件中
书写步骤及细节
1.创建字节输出流对象
参数是字符串表示的路径或者File对象都是可以的
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
如果文件已经存在,则会清空文件重新写
2.写数据使用write方法,参数为整数,但实际上写到本地文件中的是整数在ASCII上对应的字符
3.释放资源每次使用完流之后都要释放资源
代码演示
import java.io.FileOutputStream;
import java.io.IOException;public class Test1 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("day04\\a.txt");fos.write(97);fos.close();}
}
如何一次写入多个数据
方法名称 | 说明 |
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 一次写一个字节数组的部分数据 |
代码演示
import java.io.FileOutputStream;
import java.io.IOException;public class Test2 {public static void main(String[] args) throws IOException {//一次写一个字节数组数据//有两种定义数据的形式//直接定义byte数组,将想写入的数据的ASCII码存入数组FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");byte[] b1 = {97,98,99,100};fos1.write(b1);fos1.close();//以字符串的形式定义想写入的数据,再将字符串转换为byte数组FileOutputStream fos2 = new FileOutputStream("day04\\a.txt");String str = "asdfg";byte[] b2 = str.getBytes();fos2.write(b2);fos2.close();//一次写一个字节数组的部分数据//第二个参数是字节数组的起始索引//第三个参数是要写入数据的个数FileOutputStream fos3 = new FileOutputStream("day04\\a.txt");byte[] b3 = {97,98,99,100,101,102};fos3.write(b3,1,3);fos3.close();}
}
如何换行写
换行写:使用换行符
windows:\r\n
Linux:\n
Mac:\r
细节:
在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,也可以实现换行,java在底层会补全
建议:不要省略,还是写全了
代码演示
import java.io.FileOutputStream;
import java.io.IOException;public class Test3 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("day04\\a.txt");String str1 = "abcd";byte[] b1 = str1.getBytes();fos.write(b1);String wrap = "\r\n";byte[] b2 = wrap.getBytes();fos.write(b2);String str3 = "efgh";byte[] b3 = str3.getBytes();fos.write(b3);fos.close();}
}
如何续写
如果想要续写,打开续写开关即可
开关位置:创建字节输出流对象的第二个参数
不写默认false:表示关闭续写,此时创建字节输出流对象会清空文件
手动传递true:表示打开续写,此时创建字节输出流对象不会清空文件
代码演示
import java.io.FileOutputStream;
import java.io.IOException;public class Test4 {public static void main(String[] args) throws IOException {FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");String str1 = "abcd";byte[] b1 = str1.getBytes();fos1.write(b1);fos1.close();FileOutputStream fos2 = new FileOutputStream("day04\\a.txt",true);String str2 = "efgh";byte[] b2 = str2.getBytes();fos2.write(b2);fos2.close();}
}
操作本地文件的字节输入流FilelnputStream
可以把本地文件中的数据读取到程序中来
书写步骤及细节
1.创建字节输入流对象
如果文件不存在,就直接报错
2.读数据利用read方法读数据,读出来的是数据在ASCII上对应的数字
读到文件末尾读不到数据时,read方法返回-1
3.释放资源每次使用完流必须要释放资源。
代码演示
import java.io.FileInputStream;
import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("day04\\a.txt");int b;//空参read一次只能读取一个数据,利用循环进行读取//直到读到末尾读不到数据时返回-1,结束循环while ((b = fis.read()) != -1) {//读到的数据是ASCII字符对应的整数//通过char转化为字符类型System.out.print((char) b);}//abcdefgfis.close();}
}
如何一次读取多个数据
方法名称 | 说明 |
public int read() | 一次读一个字节数据 |
public int read(byte[] buffer) | 一次读一个字节数组数据 每次读取会尽可能把数组装满 返回读取到的数据个数,读不到返回-1 读取的数据字符在byte数组中 |
代码演示
import java.io.FileInputStream;
import java.io.IOException;public class Test6 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("day04\\a.txt");//定义字节数组接收数据byte[] b = new byte[3];int len;//返回读取到的数据个数,读不到返回-1,用len记录while ((len = fis.read(b)) != -1) {//读取的数据会存放在byte数组中//新一轮读取的数据会覆盖在byte数组中的旧数据//最后一次读取时,会出现数据读不满byte数组的情况//此时,byte数组中后面的部分数据不会被覆盖//所以需要len(读取到的数据个数),读取几个输出几个String str = new String(b, 0, len);System.out.println(str);}//abc//def//gfis.close();}
}