Java中的IO流主要分为四类:字节流、字符流、字节缓冲流和字符缓冲流
输入和输出
字符流
字符流是专门为读取文本数据而生的
FileReader类
这是字符输入流,用来将文件中的字符数据读取到程序中来
创建字符输入流通道
FileReader(File file) 创建字符输入流管道与源文件接通
FileReader(String pathname) 创建字符输入流管道与源文件接通
FileReader读取文件的步骤如下:
//第一步:创建FileReader对象与要读取的源文件接通
//第二步:调用read()方法读取文件中的字符
//第三步:调用close()方法关闭流
read()
每次读取一个字符返回,没有发现没有数据可读会返回-1
read(char[] buffer)
每次会一个字符数组去读取数据,返回字符数读取了多少个字符,如果没有发现数据可读会返回-1
read()的应用
public class FileReaderTest1 {
public static void main(String[] args) {
try (
// 1、创建一个文件字符输入流管道与源文件接通
Reader fr = new FileReader("text.txt");
){
// 2、一个字符一个字符的读(性能较差)
// 记住每次读取的字符编号。
int c;
while ((c = fr.read()) != -1){
System.out.print((char) c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
read(byte[] buffer)的应用
public class FileReaderTest1 {
public static void main(String[] args) {
try (
//创建一个文件字符输入流管道与源文件接通
Reader fr = new FileReader("io-app2\\src\\itheima01.txt");
){
//每次读取多个字符。(性能是比较不错的!)
char[] buffer = new char[3];
int len; // 记住每次读取了多少个字符。
while ((len = fr.read(buffer)) != -1){
// 读取多少倒出多少
System.out.print(new String(buffer, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileWriter类
它可以将程序中的字符数据写入文件
FileWriter往文件中写字符数据的步骤如下:
第一步:创建FileWirter对象与要读取的目标文件接通
第二步:调用write(字符数据/字符数组/字符串)方法读取文件中的字符
第三步:调用close()方法关闭流
创建字节输出流管道与源文件对象接通
//会覆盖原文件内容
FileWriter(File file) 创建字节输出流管道与源文件对象接通
FileWirter(String filePath) 创建字节输出流管道与源文件对象接通
//可以追加内容
FileWriter(File file,boolean append) 创建字节输出流管道与源文件对象接通 可以追加内容
FileWirter(String filePath,boolean append) 创建字节输出流管道与源文件对象接通 可以追加内容
write(int c)
写一个字符
write(String str)
写一个字符串
write(String str,int off,int len)
写一个字符串的一部分
wirte(char[] cbuf)
写入一个字符数组
wirte(char[] cbuf,int off,int len)
写入字符数组的一部分
前提
try (
// 0、创建一个文件字符输出流管道与目标文件接通。
// 覆盖管道
// Writer fw = new FileWriter("io-app2/src/itheima02out.txt");
// 追加数据的管道
Writer fw = new FileWriter("io-app2/src/itheima02out.txt", true);
){
//下面内容
} catch (Exception e) {
e.printStackTrace();
}
write(int c)的应用
// 1、public void write(int c):写一个字符出去
fw.write('a');
fw.write(97);
//fw.write('磊'); // 写一个字符出去
fw.write("\r\n"); // 换行
write(String str)的应用
// 2、public void write(String c)写一个字符串出去
fw.write("我爱你中国abc");
fw.write("\r\n");
write(String str,int off,int len)的应用
// 3、public void write(String c ,int pos ,int len):写字符串的一部分出去
fw.write("我爱你中国abc", 0, 5);
fw.write("\r\n");
wirte(char[] cbuf)的应用
// 4、public void write(char[] buffer):写一个字符数组出去
char[] buffer = {'黑', '马', 'a', 'b', 'c'};
fw.write(buffer);
fw.write("\r\n");
wirte(char[] cbuf,int off,int len)
// 5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
fw.write(buffer, 0, 2);
fw.write("\r\n");
字节流
字节流就是以字节为单位操作数据的流。
FileOutputStream
创建字节流输出通道
FileOutputStream(File file) //基于一个File封装一个FileOutputStream对象
FileOutputStream(String pathName) //基于一个字符串格式的文件路径封装一个FileOutputStream对象
write(int b)
把指定的内容写入文件
write(byte[] b)
一次写一个字节数组数据到指定位置(文件)
write(byte[] b,int off,int len)
一次写一个字节数组的部分到指定位置(文件)
前提
常见一个字节输出流
FileOutputStream fos = new FileOutputStream("a.txt",true);
write(int b)的应用
//写出数据,每次写一个字节
// void write(int b) 把指定的内容写入文件
fos.write(97);
fos.write(98);
fos.write(99);
fos.write(48);
write(byte[] b)的应用
//写出数据,每次写一个字节数组
// void write(byte[] b) 一次写一个字节数组数据到指定位置(文件)
fos.write(new byte[]{97,98,99});
write(byte[] b,int off,int len)的应用
一次写一个字节数组的部分到指定位置(文件)
// fos.write(new byte[]{-28, -72, -83, -27, -101, -67},0,3);
fos.write(new byte[]{-28, -72, -83, -27, -101, -67},3,3);
注意事项
创建字节输出流(
FileOutputStream
)对象,会去关联一个文件并进行一些基础的操作。- 如果文件不存在,就创建空白文件;
如果文件存在且有内容,默认清空文件内容;
- 如果不想文件内容被清空,就在创建对应输出流对象的时候,指定第二个参数为
true
,表示追加写入。
- 如果不想文件内容被清空,就在创建对应输出流对象的时候,指定第二个参数为
写数据
- 写出的整数,实际写出的是整数作为编码值在码表上对应的字符;
- 可以写入多个字节(一个字节数组或者一个字节数组的部分内容);
- 如果需要换行就写入
"\r\n".getBytes()
释放资源
Java
程序操作文件时会独占关联的文件,每次使用完流必须要释放资源。否则其他程序将不能正确访问该文件;
FileInputStream
基于一个字符串格式的文件路径封装一个FileInputStream对象
read()
从文件中读取一个字节,值为字节的编码值
read(byte[] bytes)
从文件中读取一个字节数组的内容,并传入形参,返回读取到的字节数,否则为-1
readAllBytes()
读取文件中所有内容并转换为字节数组返回
前题
FileInputStream fis = new FileInputStream("a.txt");
read()的应用
int read() 从文件中读取一个字节,返回值为字节的码表值
read(byte[] bytes)的应用
byte[] bytes = new byte[1024];
int len = fis.read(bytes);
// 打印字节数组,看到大量的默认值0 bytes = [97, 98, 99, 100, 101, 102, 103, 0, 0, ...]
// System.out.println("bytes = " + Arrays.toString(bytes));
// 转换成字符串,会出现大量乱码 abcdefg后面有一大堆方块
// String str = new String(bytes);
// 不想出现乱码,就要控制转换的长度,只转换读取到的有效内容 str = abcdefg
String str = new String(bytes,0,len);
System.out.println("str = " + str);
readAllBytes()的应用
// byte[] readAllBytes() 读取文件中所有内容并转换为字节数组返回
byte[] allBytes = fis.readAllBytes();
String str = new String(allBytes);
注意事项
创建字节输入流(
FileInputStream
)对象,会去关联一个文件并进行一些基础的操作。- 如果文件不存在,就报错;
读数据
- read():读取的内容默认得到的是该数据的编码值,读取到文件末尾则返回-1
- read(byte[] bytes):读取到多个字节并存入字节数组中,返回成功读取的字节个数;读取到文件末尾返回-1
在使用返回的数组时,一定要注意使用读取到的有效字节个数,否则数据有误。
释放资源
Java
程序操作文件时会独占关联的文件,每次使用完流必须要释放资源。否则其他程序将不能正确访问该文件。