目录
文件内容读写的形式
字符流
字节流
文件内容操作
InputStream:以字节流的形式进行读操作
创建方式:
原码:
正确的创建方式:
InputStream inputStream = new FileInputStream();
FileInputStream的构造方法:
常用的构造方法:
1. 以File对象作为参数,对该对象指定的文件内容进行操作
2. 以文件路径(绝对路径/相对路径)作为参数,对指定文件的内容进行操作
注意:需要抛出异常:FileNotFoundException:如果操作的文件不存在就会抛出该异常
例如:
InputStream inputStream = new FileInputStream("test1/test.txt");
读操作read:
由于这个test.txt文件中没有数据,所以我们手动写入一个hello world
通过调用read方法
这里使用我们上面例子中创建的inputStream对象
inputStream.read();
原码解释说明:
这里的read有三个版本
1. 无参的read版本:read()
try(InputStream inputStream = new FileInputStream("test1/test.txt")){
//.....这里面进行inputStream这个文件对象的文件操作
while(true){
int b = inputStream.read();
if(b == -1){
//当read的返回值为-1时,说明文件数据已经被读完了
break;
}
System.out.println(b);
}
}
结果:
System.out.print((char)b;//通过char强转成字符类型显示
结果:
2. 带一个byte数组的参数版本:read(byte[] b)
3. 带三个参数的版本:read(byte[] b , int off , int len)
OutputStream:以字节流的方式进行写操作
操作和前面的InputStream基本一样
创建对象
OutputStream outputStream = new FileOutputStream("test1/test.txt")
FileOutputStream常见的构造方法
1. 以File对象作为参数,对该对象指定的文件内容进行操作
2. 以文件路径(绝对路径/相对路径)作为参数,对指定文件的内容进行操作
注意:需要抛出异常:FileNotFoundException:如果操作的文件不存在就会抛出该异常
写操作:write
使用上面创建的outputStream对象调用write方法
outputStream.write();
write方法也有几种版本
1. 无参版本:write(int b)
try(OutputStream outputStream = new FileOutputStream("test1/test.txt")){
outputStream.write(98);
}
2. 带有一个byte数组参数的版本:write(byte[] b)
3. 带三个参数的版本:write(byte[] b , int off , int len)
字符流读写操作:Reader和Writer
Reader:以字符流的形式进行读文件操作
代码:
try(Reader reader = new FileReader("test1/test.txt")){
while(true){
int b = reader.read();
if(b == -1){
break;
}
System.out.println((char)b);
}
} catch (IOException e) {
e.printStackTrace();
}
Writer:以字符流的形式进行写文件操作
代码:
try(Writer writer = new FileWriter("test1/test.txt")) {
writer.write('a');
writer.write('b');
writer.write('c');
} catch (IOException e) {
e.printStackTrace();
}
结果:
关闭文件资源释放相关
不释放资源的后果
针对文件资源泄露的情况,我们有下面两种方法:
1. 手动调用close方法进行资源关闭
inputStream.close();
2. try with resources 写法:
带有资源的try操作,会在try代码块结束,会自动对资源执行close操作
写法:
把创建InputStream等这些的I/O组类对象时,放入try中创建,再在try代码块中进行对象的文件文件操作,在退出代码块时会自动释放try中创建的I/O资源(推荐写法:自动释放不会遗忘更稳妥)
try(InputStream inputStream = new FileInputStream("test1/test.txt")){
//.....这里面进行inputStream这个文件对象的文件操作
}