.out.println(inp.read()); // -1
}
"""
1、String第二个参数可以指定开始位置, 第三个参数可以指定结束位置, 可以用这两个参数解决第三次读取的弊端
2、并且循环改进优化代码
"""
public static void main(String[] args) throws Exception {
InputStream inp = new FileInputStream("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
byte[] arr = new byte[3];
int len;
while ((len = inp.read(arr)) != -1) {
String res = new String(arr, 0, len);
System.out.print(res); // abcd123
}
}
"""
每次读取一个数组存在的弊端:
1、读取的性能得到了提升
2、读取中文字符输出无法避免乱码问题。
一次读取全部字节
为解决中文乱码问题我们可以定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
弊端: 如果文件过大,字节数组可能引起内存溢出。
解决方案一:
自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成。
"""
public static void main(String[] args) throws Exception {
File file = new File("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
InputStream inp = new FileInputStream(file);
// 创建一个与文件大小一样的字节数组
byte[] arr = new byte[(int) file.length()];
// 读取文件, 获取读取的字节长度
int len = inp.read(arr);
System.out.println(len); // 252
// 对字节数组进行解码
String res = new String(arr);
System.out.println(res);
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
}
"""
方式二:
官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称 |
说明 |
readAllBytes() |
直接读取当前字节输入流对应的文件对象的全部字节数据, 然后装到一个字节数组返回 |
"""
public static void main(String[] args) throws Exception {
InputStream inp = new FileInputStream("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
// 获取文件的全部字节, 并返回一个字节数组
byte[] arr = inp.readAllBytes();
// 对字节数组进行解码
String res = new String(arr);
System.out.println(res);
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
// abcd123我爱Java学习Java.abcd123我爱Java学习Java.abcd123我爱Java学习Java.
}
"""
文件字节输出流
创建字节输出流
文件字节输出流: 实现类FileOutputStream
作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
构造器如下:
构造器 |
说明 |
FileOutputStream(File file) |
创建字节输出流管道与源文件对象接通 |
FileOutputStream(String filepath) |
创建字节输出流管道与源文件路径接通 |
"""
public static void main(String[] args) throws Exception {
// 写法一: 创建输出流与源文件对象接通
OutputStream oup = new FileOutputStream(new File("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt"));
}
"""
"""
public static void main(String[] args) throws Exception {
// 写法二: 创建输出与源文件路径接通(常用)
OutputStream oup = new FileOutputStream("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
}
"""
写入文件输出流
文件字节输出流写数据出去的API:
方法名称 |
说明 |
write(int a) |
写一个字节出去 |
write(byte[] buffer) |
写一个字节数组出去 |
write(byte[] buffer , int pos , int len) |
写一个字节数组的一部分出去 |
流的刷新与关闭API:
方法 |
说明 |
flush() |
刷新流,还可以继续写数据 |
close() |
关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
注意: 写入数据必须刷新数据, 流使用完成后需要关闭
写一个字节出去
"""
public static void main(String[] args) throws Exception {
OutputStream oup = new FileOutputStream("/Users/chenyq/Documents/learn_Java/code/file