IO流基础
一、概念
数据的交换
程序与文件,数组,网络资源,数据库资源的数据传输与交换。
<br />
二、IO流的分类
- 流向:输出流与输入流(以程序为中心判断)
- 数据:字节流:二进制,可以传输任何文件。
字符流:文本文件,只能处理纯文本 - 功能:节点:包裹源头
处理:增强功能,提高性能
<br />
三、字符流与字节流(重点区分)
- 字节流
输入流:InputStream
输出流:OutputStream - 字符流
输入流:Writer
输出流:Reader
<br />
四、操作
1)、建立联系
2)、选择流
3)、操作 数组大小+read、write
4)、释放资源
字节流基本操作之文件读取,写出,追加,拷贝
<br />
一、文件读取
- 建立联系:File对象
- 选择流 文件输入流:InputStream接口的实现类FileOutputStream
- 操作:byte[] car=new byte[数组大小]+read+读取大小,输出
- 关闭资源
示例程序
public static void fileIn() {
// 1.关联文件
File f = new File("F:/javaIotest/poetry.txt");
// 2.选择流
InputStream is = null;// 提升作用域
try {
is = new FileInputStream(f);
// 3.操作
byte[] car = new byte[20];// 缓冲数组
// 这里定义每次读取的文件的长度,
// 如果不定义的话,如果到最后长度不够填满数组,那么只会改变前面的部分,后面的还是上次读取的内容
// 输出也没办法确定输出到哪里结束
int len = 0;
while (-1 != (len = is.read(car))) {// is.read()方法会返回整形,表示本次读取的长度
// 每次只输出本次读取的字节,到最后就不会多输出了
String str = new String(car, 0, len);
// 打印
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("读取文件失败");
} finally {
// 4.关闭资源
if (null != is)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭流失败");
}
}
}
<br />
二、文件写出
<br />
操作同上
选择流的FileInputStream 多一个参数,是表示追加还是覆盖。false为覆盖,true为追加。如果不写该参数的话,默认为覆盖的。
还有个要注意的,文件输出需要使用flush()方法强制刷新一下。如果不刷新视频里说是等输出总线满了,才会往外推。虽然在finally里关闭流的时候也会自动刷新,但是推荐养成使用这个方法的习惯。
public static void outFile() {
File f = new File("F:/javaIotest/test01.txt");
OutputStream os = null;
try {
// 选择文件输出流,构造器里,最后一个参数为追加或者覆盖,false为覆盖
os = new FileOutputStream(f);
String str = "Viking is very handsome ! Do you agry ?";
// 字符串转为字符数组
byte[] b = str.getBytes();
os.write(b, 0, b.length);
os.flush();// 强制刷新,虽然在流关闭时也会,但推荐加一个这个
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件无法创建或者为目录");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件写入失败");
} finally {
if (null != os)
// 关闭资源
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("流关闭失败");
}
}
}
<br />
三、文件拷贝
<br />
建立联系阶段,源必须存在,且必须为文件。目的文件可以不存在,但也必须是文件。
示例程序
public static void fileCopy(File src, File dest) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(src);
os = new FileOutputStream(dest);
byte[] b = new byte[20];
int len = 0;
while (-1 != (len = is.read(b))) {
os.write(b, 0, len);
}
os.flush();
} catch (FileNotFoundException e) {
System.out.println("文件未找到");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件读取或写出失败");
e.printStackTrace();
} finally {
try {
os.close();
is.close();
} catch (IOException e) {
System.out.println("流关闭失败!");
e.printStackTrace();
}
}
}
<br />
四、文件夹的拷贝。
即利用listFiles方法获取目录下文件,如果是文件则拷贝,是目录则递归调用。因为都是完全的拷贝。所以要注意新文件的关联的建立。目录则需要手动创建。文件可以自己建立。
示例程序
public static void dirCopy(File src, File dest) {
// 先判断源是否是文件,如果再判断目的,如果是目录,就新建个同名的文件
// 如果是文件直接拷贝。如果源是目录则调用私有方法拷贝目录。
if (src.isDirectory()) {
// 这里是在目的地下面新建个同名文件夹,即整个源一起拷贝进去
File f = new File(dest, src.getName());
dirCopyDetils(src, f);
} else if (dest.isDirectory()) {
File copyFile = new File(dest, src.getName());
fileCopy(src, copyFile);
} else {
fileCopy(src, dest);
}
}
private static void dirCopyDetils(File src, File dest) {
// 建立文件夹
if (!dest.exists())
dest.mkdirs();
File[] files = src.listFiles();
// 遍历源目录下文件
for (File temp : files) {
// 如果是目录,调用自身,拷贝到上层目录下的同名文件夹
if (temp.isDirectory()) {
dirCopyDetils(temp, new File(dest, temp.getName()));
} else {
// 如果是文件,建立新的文件关联,复制时自动创建文件
File copyFile = new File(dest, temp.getName());
fileCopy(temp, copyFile);
}
}
}
<br />
字符流
<br />
字符流只能用于处理纯文本。
操作与字节流类似
字符流的节点流:
- Reader 文件读取(FileReader)
- Writer 文件写出(FileWriter)
区别在于,用char数组来接收而不是用byte数组
写出操作,write方法形参可以是字符数组也可以是字符串,还多个append方法表示追加。