I/O流常用复制和读取文件
文章目录
一、简介
你要把一个视频,拷贝到你的电脑硬盘里,这个可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。
1、IO的分类
根据数据的流向分为:输入流和输出流。
输入流 : 把数据从 其他设备 上读取到 内存 中的流。
输出流 : 把数据从 内存 中写出到 其他设备 上的流。
格局数据的类型分为:字节流和字符流。
字节流 : 以字节为单位,读写数据的流。
字符流 : 以字符为单位,读写数据的流。
2、顶级父类
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流 InputStream | 字节输出流 OutputStream |
字符流 | 字符输入流 Reader | 字符输出流 Writer |
二、读入文件
1、FileInputStream类方法
常用的方法:
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
读取单个字节:
FileInputStream fis = new FileInputStream("fos.txt");
int b;
while ((b=fis.read())!=-1){
System.out.println((char)b);
}
fis.close();
读取到数组中:
FileInputStream fis = new FileInputStream("fos.txt");
int len;
byte[] bytes = new byte[4];
while ((len = fis.read(bytes)) != -1) {
System.out.println(new String(bytes));
}
fis.close();
2、FileReader类方法
常用的方法
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 从输入流读取一个字符。
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
读取单个字符
FileReader fileReader = new FileReader("fos.txt");
int b;
while ((b=fileReader.read())!=-1){
System.out.println((char)b);
}
fileReader.close();
}
读取到数组中:
FileReader fileReader = new FileReader("fos.txt");
int len;
char[] chars = new char[3];
while ((len=fileReader.read(chars))!=-1){
System.out.println(new String(chars));
}
fileReader.close();
读取到数组中(按位读取)
FileReader fileReader = new FileReader("fos.txt");
int len;
char[] chars = new char[3];
while ((len=fileReader.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fileReader.close();
}
3、读一行文件:(字符缓冲流)
常用方法:
BufferedReader: public String readLine() : 读一行文字。
代码:
BufferedReader br = new BufferedReader(new FileReader("fos.txt"));
// 读取一行文件内容
String line = br.readLine();
// 循环所读文件的所有内容
String end;
while ((end=br.readLine())!=null){
System.out.println(line);
}
三、写出文件
1、FileOutputStream类方法
使用IO输出文件的方式:
FileOutputStream fos=null;
try {
//方法一:
fos = new FileOutputStream("D://fos.txt");
fos.write(97);
//方法二:
byte[] bytes = "你好吗".getBytes();
fos.write(bytes);
//方法三:
byte[] b = "abcde".getBytes();
// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
fos.write(b,2,2);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每次程序运行,创建输出流对象,都会清空目标文件中的数据。如果想要在每次是增量的输出的话,就得使用下面的两个构造方法;
public FileOutputStream(File file, boolean append) :
创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name, boolean append) :
创建文件输出流以指定的名称写入文件。
这两个构造方法,参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据。
这样创建的输出流对象,就可以指定是否追加续写了;
FileOutputStream fos = new FileOutputStream("fos.txt",true);
系统中的换行符:
Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;
Unix系统里,每行结尾只有 换行 ,即 \n ;
Mac系统里,每行结尾是 回车 ,即 \r 。从 Mac OS X开始与Linux统一。
2、FileWriter类方法
public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
public void write(int c) :写出一个字符。
public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
public void write(String str) :写出一个字符串
flush会把之前的内容收写出到文件中,每次的flush都会刷新写出到文件中,最后close关闭资源的时候,也会写出一次数据; 实时刷新数据到文件中
FileWriter fw = new FileWriter("ddd.txt");
fw.write(97);
fw.flush();
fw.write('f');
fw.flush();
fw.write('9');
fw.flush();
fw.close();
写出内容到文件
FileWriter fw = new FileWriter("test.txt");
// 写出char类型内容
fw.write(48);
fw.flush();
// 写出字符串
fw.write("好的");
fw.flush();
// 写出char型数组
char[] chars = {'1','2', '3','4','5'};
fw.flush();
// 写出字符串指定内容
fw.write(chars);
fw.write("qwert",2,3);
fw.flush();
// 写出char型数组指定内容
fw.write(chars,2,2);
fw.flush();
fw.close();
四、复制文件
1、字节流方式
// 1.创建读入的对象
FileInputStream fis = new FileInputStream("D:\\test.jpg");
//1.2 创建写出的对象
FileOutputStream fos = new FileOutputStream("test_copy.jpg");
// 2.读写数据
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b))!=-1) {
fos.write(b, 0 , len);
}
// 3.关闭资源
fos.close();
fis.close();
2、缓冲流方式
BufferedInputStream fis = new BufferedInputStream(new FileInputStream("fos.txt"));
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("copy.txt"));
int len;
while ((len=fis.read())!=-1){
fos.write(len);
}
fis.close();
fos.close();