什么是IO流
IO指的是Input/Output,IO流:输入输出流。 统称为数据流。(IO Stream)
在Java程序中,对于数据的输入 / 输出操作以流的方式进行;流是从起源到接收的有序数据。JDK提供了各种各样的流类,用以获取不同种类的数据;
简单来说IO流是存储和读取数据的解决方案
IO流分类
按流向分:
◦ 输入流:程序可以从中读取数据的流
◦ 输出流:程序能向其中写入数据的流
按数据传输单位分:
◦ 字节流:以字节为单位传输数据的流,可以操作所有类型的文件
◦ 字符流:以字符为单位传输数据的流,只能操作纯文本文件
什么是纯文本文件
可以用windows自带的记事本打开并且能读懂的文件
如txt md iml文件
字节流
FileOutputStream
类创建一个能从文件读取字节的InputStream类,它的两个常用的构造方法如下:
FileInputStream(Stringfilepath)
FileInputStream(FilefileObj)
这两个构造方法都能引发FileNotFoundException异常。这里,filepath是文件的绝对路径,也可是相对路径。fileObj是描述该文件的File对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:\\a.txt")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("c:\\a.txt");**
InputStream f1 = new FileInputStream(f);
注意细节
1、实例化文件对象
2、实例化输入流对象(如果文件不存在出异常,和输出流不同)
3、调用read方法读取内容到内存
4、关闭资源
File file = new File("temp/a.txt");
FileInputStream fis = new FileInputStream(file);
try {
int read1 = fis.read();
System.out.println(read1);
int read2 = fis.read();
System.out.println(read2);
int read3 = fis.read();
System.out.println(read3);
int read4 = fis.read();
System.out.println(read4);
int read5 = fis.read();
System.out.println(read5);
fis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
read()方法每次读取一个字节,返回读取到的字节,并且光标移动下一次读取的位置;所以每次read()都是读取不同的内容;
read的三种方式
第一种
FileInputStream fis = new FileInputStream(file);
int read = fis.read();
最基本的一次读取一个字节
第二种
把内容读取到一个字节数组当中;但是读取的内容长度是随机的;有可能一次性读完;也有可能读不完
byte[] bytes= new byte[4];
File file = new File("temp/a.txt");
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
String str =new String(bytes);
System.out.println(str);
所以这种方式一般结合while一起使用
查看源码这个read方法返回的是读取的长度,因为前面讲过是随机的,故而长度不是固定的;是通过read放回
第三种
read(bytes,int,int);
指定存储到bytes的固定位置---不重要
FileOutputStream
该类用来创建一个文件并向文件中写数据。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:\\a.txt")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:\\a.txt");
OutputStream fOut = new FileOutputStream(f);
注意细节
-
创建字节输出对象
①参数是字符串表示的路径或File对象都是可以的
②如果文件不存在则创建文件,前提是要保证父级路径存在
③如果文件已存在,则会清空文件
-
写数据
write方法的参数是整数,实际写道本地文件中的整数在ACSII上对应的字符
-
释放资源
每次使用完流都要释放资源
write 三种方式
第一种
一次输出一个字节
FileOutputStream fos = new FileOutputStream(file);
try {
fos.write(97);//-->a
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
第二种
一次输出多个
try {
fos.write(str.getBytes()); //自定义一个byte[]
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
第三种
方式指定内容
try {
fos.write(bytes,1,2);//下标 和长度
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
FileOutputStream的另一种写法
//文件名 :fileStreamTest2.java
import java.io.*;
public class fileStreamTest2 {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fop = new FileOutputStream(f);
// 构建FileOutputStream对象,文件不存在会自动新建
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
writer.append("中文输入");
// 写入到缓冲区
writer.append("\r\n");
// 换行
writer.append("English");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.close();
// 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
fop.close();
// 关闭输出流,释放系统资源
FileInputStream fip = new FileInputStream(f);
// 构建FileInputStream对象
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
// 构建InputStreamReader对象,编码与写入相同
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close();
// 关闭读取流
fip.close();
// 关闭输入流,释放系统资源
}
}