目录
首先,我们需要知道输出流与输入流是相对于谁来说的。是相对于内存/程序来说的。
文件 -----> 内存 :输入流
内存 -----> 文件 :输出流
字节流分为InputStream(字节输入流) 和 OutputStream(字节输出流) ,这两个类都是抽象类,不能实例化出来,如果需要用的话,根据它子类来实例化对应的对象。这里主要讲操作本地文件的字节输入流和输出流
一、FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
语法:
FileOutputStream fos = new FileOutputStream(参数);
实现步骤:
1)创建字节输出流对象
细节1:参数是字符串表示的路径或者是File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会覆盖文件
2)写数据
细节:write方法的参数是整数,但实际上写到本地文件的是整数在ASCII上对应的字符
3)释放资源
每次使用完流之后都要释放资源
写数据的3中方式
方法名称 | 说明 |
---|---|
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b,int off,int len) | 一次写一个字节数组的部分数据,off:起始索引,len:个数 |
写数据的换行和续写
换行写:
再写一次换行符就可以了
Windows:\r\n
Linux: \n
Mac:\r
在Windows操作系统中,java对回车换行进行了优化,但是完整的是\r\n,但是我们写其中的一个\r或者\n也是可以的。因为java在底层会补全
续写:
第二参数表示是否要续写,默认是false表示不续写,true表示续写
案例
a.txt文件原本内容为:aaaaaa
运行程序后:
aaaaaafdasdfs
777
package myio;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamTest {
public static void main(String[] args) throws IOException {
//1、创建对象
FileOutputStream fos = new FileOutputStream("a.txt",true);
//2、写出数据
String str = "afdasdfs";
byte[] bytes1 = str.getBytes();
fos.write(bytes1);
//换行
String wrap = "\r\n";
byte[] bytes2 = wrap.getBytes();
fos.write(bytes2);
String str2 = "777";
byte[] bytes3 = str2.getBytes();
fos.write(bytes3);
//3、释放资源
fos.close();
}
}
二、FileInputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序/内存中来。
实现步骤:
1)创建字节输入流对象
如果文件不存在,就直接报错
2)读数据
1、read无参方法读出来的是数据在ASCII上对应的数字
2、从输入流中读取数据的下一个字节 ,读到文件末尾了,read方法返回-1。
3)释放资源
每次使用完流之后都要释放资源
读的三种方法
方法名称 | 说明 |
---|---|
public int read() | 一次读取一个字节数据,返回读到的字节值 |
public int read(byte[] buffer) | 一次读取一个字节数组数据,返回读取多少个字节数据 |
public int read(byte[] buffer int off,int len ) | 一次读取一个字节数组的部分数据 |
案例
a.txt文件的内容:abcde
package myio;
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
//1、创建对象
FileInputStream fis = new FileInputStream("a.txt");
//2、循环读取,效率低
int b ;
while((b = fis.read()) != -1){
System.out.print((char)b);
}
fis.close();
System.out.println("---------");
FileInputStream fis1 = new FileInputStream("a.txt");
byte[] bytes = new byte[2];
int len;//用于接收读取到了多少个字节数据
//效率相对高
while((len = fis1.read(bytes)) != -1){
String str = new String(bytes,0,len);//len值 2 2 1
System.out.print(str);//str值 ab cd e
}
fis1.close();
//错误写法 ,数据丢失
/*
FileInputStream fis = new FileInputStream("a.txt");
//2、循环读取
while( fis.read()!= -1){
System.out.print((char)fis.read());
}
fis.close();
*/
}
}