目录
字符流:只能操作纯文本文件(Windows自带的记事本打开并且能读懂的文件 如txt/md/xml/lrc)
File字节输入流:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
IO流:存储和读取数据的解决方案
I:input O:output
作用: 用于读写文件中的数据(可读写文件,或网络中的数据)
输入写出的参考对象是程序本身
--程序中的数据写到文件中输出output
--将文件中的数据加载读取到程序中读取input
IO流的分类:
按照流的方向:
输入流:读取---从文件中读取
输出流:写出---写出到文件
按照操作文件类型:
字节流:可以操作所有类型的文件
字节输入流: LnputStream 读取数据
操作本地文件的字节输入流:FileInputStream
操作对象的字节输入流:ObjectInputStream
带有缓冲区的字节输入流:BufferedInputStream
字节输出流:OutputStream 写出数据
操作本地文件的字节输出流:FileOutputStream
操作对象的字节输出流:ObjectOutputStream
带有缓冲区的字节输出流:BufferedOutputStream
字符流:只能操作纯文本文件(Windows自带的记事本打开并且能读懂的文件 如txt/md/xml/lrc)
字符输入流:Reader
操作本地文件的字符输入流:FileReader
操作缓冲区的字符输入流:BufferedReader
带有行号的字符输入流:LineNumberReader
字符输出流:Writer
操作本地文件的字符输出流:FileWriter
操作缓冲区的字符输出流:BufferedWriter
带有行号的字符输出流:LineNumberWriter
LnputStream OutputStream Reader Writer 都是抽象类无法直接创建对象,,只能创建其子类对象如FileInputStream
File字节输出流:
书写步骤:
1.创建字节输出流对象
参数是字符串表示的路径或是File对象都是可以的
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
如果文件已经存在则会清空文件并重写
2.写数据
write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
如果要写整数的话用''括号即可
写数据方法:
void write(int b) 一次写一个字节数据
void write(byte[] b) 一次写一个字节数组数据
void write(byte[] b,int off,int len) 一次写一个字节数组的部分数据
参数一:装有数据的数组
参数二:off表示起始索引
参数三:个数
换行写:两个write中间再次写出一个换行符
Windows系统: \r\n 回车换行
Linux系统: \n 换行
Mac系统: \r 换行
在Windows操作系统中java对回车换行进行了优化,完整的是\r\n 但仅仅只写一个\r或\n也可实现换行因为java会在底层进行补全
续写:
FileOutputStream() 第二个参数是续写开关
开关位置:创建对象时的第二个参数
默认false表示关闭续写,此时创建对象会自动清空文件
可以手动传递一个true表示打开续写
3.释放资源
每次使用完流之后都要释放资源
File字节输入流:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
书写步骤:
1.创建字节输入流对象
如果文件不存在直接报错--因为如果自动创建的话是空文件读取不到有效数据,无意义!
2.读数据
read()方法读取数据,读取一次就移动一次指针,循环读取时无需做计数操作
一次读取一个字节,读出来的是数据在ASCII上对应的数字
读取到文件末尾了无数据了,read()方法返回一个-1
3.释放资源
每次使用完流之后必须释放资源
--先开的流最后释放
//创建对象------建立通道
FileOutputStream fos = new FileOutputStream("D:\\桌面\\java_File_test\\a.txt");
//写出数据------数据传输
fos.write('9');//写出的数据会把当前数字转换为字符
//释放资源-------切断通道
//fos.close();
byte[] bys = {97,98,99,100,101,102,103,104,105,106,107,108};
fos.write(bys,2,3);
//fos.close();
FileOutputStream fos1 = new FileOutputStream("D:\\桌面\\java_File_test\\b.txt",true);
String str = "songbinzuishuai";
byte[] by1 = str.getBytes(); //字符转换为字节数字
fos1.write(by1);
//换行操作
String swrap = "\r\n";
byte[] wrap = swrap.getBytes();
fos1.write(wrap);
fos1.write('2');
System.out.println(Arrays.toString(by1));
fos.close();
//字节输入流
FileInputStream fis = new FileInputStream("D:\\桌面\\java_File_test\\b.txt");
//读数据
int b1 = fis.read(); //读取的是文件中第一个数据的ASCII整数表达形式
System.out.println((char)b1);
//循环读取
int b;
while((b = fis.read()) != -1) { // !=-1 说明未读取到末尾,=-1条件达到结束循环
System.out.print((char)b);
}
fis.close();