IO流:是用来操作文件内容的的技术,输入输出都是针对程序而言的
I(in)输入:向程序中输入数据,一般是从文件中读取数据到程序中
O(out)输出:程序向外部输送数据,一般是将数据输出到文件中
下图为IO继承体系图
IO流可以分为两类,分别是字节流和字符流
字节流可以分为字节输出流,字节输入流和字节缓冲流
字符流可以分为字符输出流,字符输入流和字符缓冲流
主要使用到的类为表所示:
分类 | 输出流 | 输入流 | 缓冲输入流 | 缓冲输出流 |
---|---|---|---|---|
字节流 | FileInputStream | FileOutputStream | BufferedInputStream | BufferedOutputStream |
字符流 | InputStreamReader | OutputStreamWriter | BufferedReader | BufferedWriter |
使用FileOutputStream需要指定文件路径名的,也可以使用File类进行传递
FileOutputStream(File file)
FileOutputStream(String name)
//字节输出流
FileOutputStream fos = new FileOutputStream("E:\\test.txt");
如果我们想往文件中写入数据,可以使用以下几种方式:
方法名 | 作用 |
---|---|
void write(int b) | 将指定的字节写入文件,一次一个字节 |
void write(byte[] b) | 将b.length字节写入指定文件,一次写一个字节数组的数据 |
void write(byte[] b,int off,int len) | 将指定的字节数据,以一定的偏移量写入文件 |
下面用上述的方法吧数据写入到文件中:
//字节输出流
FileOutputStream fos = new FileOutputStream("E:\\test.txt");
//吧数据写入到文件中
byte[] b = {97,98,99};
fos.write(b);
//关闭输出流
fos.close();
下图为执行结果:
如果想吧自定义的字符串写进去,可以通过String中的getBytes()方法吧字符串转为字节数组
//字节输出流
FileOutputStream fos = new FileOutputStream("E:\\test.txt");
//吧数据写入到文件中
String s = "你好,世界!";
fos.write(s.getBytes());
//关闭字节输出流
fos.close();
输出流每次写数据的时候都会先吧文件清空再写进数据,如果向往文件中追加数据,可以使用下面的构造方法:
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
第二个表示的是是否需要追加内容,true表示追加,false表示不追加
//字节输出流
FileOutputStream fos = new FileOutputStream("E:\\test.txt",true);
//吧数据写入到文件中
String s = "你好,世界!";
fos.write(s.getBytes());
//关闭字节输出流
fos.close();
运行结果如下:
如果想实现换行,可以在写完数据后写入换行符
对于不同的系统换行符不同
Windows:\r\n
Linux:\n
使用FileInputStream的时候依然是需要传递文件路径
FileInputStream(File file)
FileInputStream(String name)
//字节输入流
FileInputStream fis = new FileInputStream("E:\\test.txt");
读取文件中的数据可以使用下面的方法:
方法名 | 作用 |
---|---|
int read() | 一次读取一个字节的数据,返回字节码 |
int read(byte[] b) | 一次读取一个字节数据的数据,返回读取数据的长度 |
主要是使用第二种方式居多:
//字节输入流
FileInputStream fis = new FileInputStream("E:\\test.txt");
//通过字节数据进行读取
byte[] b = new byte[1024];
int len = 0;
//读取数据
while((len = fis.read(b)) != -1) {
String s = new String(b,0,len);
System.out.println(s);//打印结果:你好,世界!你好,世界!
}
//关闭流
fis.close();
使用字节数组读取数据时,建议大小使用1024及其倍数
因为不知道数据有多少,所以可以使用循环进行读取,如果读取到文件的末尾,就会返回-1,所以可以作为循环结束的条件
读取的数据会放入到字节数组中,并返回读取到的长度,所以可以使用字符串的构造方法将数据读取出来,这里建议使用偏移量进行字节数组转字符串
使用缓冲流,可以提高我们读取和写入数据的效率,所以缓冲流推荐使用
字符缓冲输入流和字节缓冲输出流的操作和一般的字节流操作相同,但是使用时传递的参数不同
BufferedInputStream(InputStream in)
BufferedOutputStream(OutputStream out)
//创建缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\test.txt"));
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test.txt"));
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
字节缓冲流仅仅提供缓冲区,而真正的读写数据还是要依靠基本的字节流对象进行操作
这里可以做个拷贝文件的案例:
//创建缓冲输入流,指定需要拷贝的文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\test.txt"));
//创建缓冲输出流,,指定拷贝文件到哪里
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test01.txt"));
//创建存储的字节数组
byte[] b = new byte[1024];
int len = 0;
//循环读写数据
while((len = bis.read(b)) != -1) {
//讲字节写入
bos.write(b, 0, len);
}
//释放流
bos.close();
bis.close();
由于字节流操作中文不是很方便,所以Java提供了字符流
字符流 = 字节流 + 编码
使用字符流的时候是可以指定字符集的,但还是需要通过字节流来指定文件
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,String charsetName)
//创建字符输出流,指定字符集
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test.txt"),"utf8");
如果要写入数据,可以使用下面的方法:
方法名 | 作用 |
---|---|
void write(int c) | 一次写一个字符 |
void write(char[] c) | 一次写一个字符数组 |
void write(char[] c,int off,int len) | 写字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str,int off,int len) | 写字符串的一部分 |
通过上述方法进行写入中文数据:
//创建字符输出流,指定字符集
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\test.txt"),"utf8");
//通过字符数据写入
char[] c = {'你','好'};
//写入
osw.write(c);
//关闭流
osw.close();
运行结果如下:
如果没有写进去数据,可能是没有刷新流或者关闭流
刷新流可以使用flush()方法
字符输入流依然可以指定字符集
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
如果想读入数据可以使用下面的方法:
方法名 | 作用 |
---|---|
int read() | 一次读一个字符数据 |
int read(char[] c) | 一次读取一个字符数组的数据 |
通过上面的方法读入数据:
//创建字符输入流
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test.txt"),"utf8");
//通过字符数组放数据
char[] c = new char[6];
int len = 0;
//循环读取数据
while((len = isr.read(c)) != -1) {
String s = new String(c,0,len);
System.out.println(s);//打印结果:你好
}
//关闭流
isr.close();
字符串的构造方法也可以吧字符数组转为字符串
构造方法:
BufferedReader(Reader in)
BufferedWriter(Writer out)
构造方法要求我们给的是字符流的对象
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("E:\\test.txt")));
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("E:\\test.txt")));
字符缓冲流中特有的功能:
BufferedReader:String readLine():读取一行,并把结果以字符串的形式返回
BufferedWriter:void newLine():进行换行操作
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("E:\\test.txt")));
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("E:\\test.txt")));
//写入数据并换行
bw.write("你好呀!");
//换行
bw.newLine();
bw.write("世界!");
//刷新流
bw.flush();
//读取数据
String s = br.readLine();
System.out.println(s);//打印结果:你好呀!
//释放资源
bw.close();
br.close();
具有自动刷新的缓冲字符输出流,特点是可以按行写出字符串,并且可以自动换行刷新。
java.io.BufferedWriter是缓冲字符输出流,内部有缓冲区可以进行块写操作提高效率,
而PrintWriter就是通过连接它实现的缓冲功能
构造方法我们可以传递一个字节流
PrintWriter(OutputStream out)
//创建缓冲输出流
PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\test.txt"));
如果要写入数据就可以使用熟悉的打印了
//创建缓冲输出流
PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\test.txt"));
//写入数据(换行)
pw.println("你好呀");
//写入数据(不换行)
pw.print("java");
//吸入数据(不换行)
pw.print("世界");
//关闭流
pw.close();
今天的分享就到这里了,如果有错误的地方,欢迎大家来指点!