IO
-
说到IO,脑海里更是模糊一片。什么 input output 还有stream reader 之类的什么鬼。这几天终于把它搞明白了。
1.概念
流流动 流向从一端移动到另一端 源头与目的地
程序 与文件、数组、 网络、数据库 ,依程序为中心
2.io流分流
1.流向,输出流与输出流
2.数据:字节流 二进制,可以一切文件 包括纯文本 doc 音频 、视频等等
字符流:文件文本,只能处理纯文本
3。功能:节点:包裹源头的
处理流:增强功能,提供性能
三。字节流与字符流(重点)
1.字节流
输入流 inputStream read +close FileInputStream
输出流 outputstream write +flush +close FileOutputSteam
2.字符流
输入流 reader read +close FileReader()
输入流 writier write + flush + close FileWiter
四。操作
1.距离 :搬家为例 -->读取文件
1.关联房子 -- 建立与文件练习
2.选择搬家 --选择对应流
3.搬家 --读取|写出
a卡车大小 --数组大小
b.运输 --读取、写出
4。打发over --释放资源
2.操作
1.建立练习
2.选择流
3.操作 数组大小reader、witer
4.close
------上面这些是上课看的比较乱
总结一下
文件的移动过程以流形式存在,一般是两种的形式,一种是字符流,比如我们的文本对象txt,另外是字节流 比如我们的图片,音频之类的,总不可能是文本的形式给我们看吧。
相应的操作就分为两种,一种是字节流的形式对文件进行操作
设计到的类就是
输入: File | InputStream | FileInputStream
输入: File | OutputStream | FileOutputStream
这三种类。
它们的操作步骤如下代码将进行展示
package cn.hjm.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 读取文件
* @author hjm
*/
public class DemoFile01 {
public static void main(String[] args) {
//创建file对象
File file = new File("C:\\Users\\hjm\\Desktop\\有趣的句子.txt");
InputStream is =null;
try {
//创建流
is =new FileInputStream(file);
//创建数组大小
byte[] b = new byte[3];
//规定字节大小
int len=0;
try {
while(-1!=(len=is.read(b))){ //当读不到数据的时候为-1
String str = new String(b,0,len); //构建字符串
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
System.out.println("文件查找失败");
e.printStackTrace();
}finally{
while(null!=is){ //该流存在的时候,关闭它
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭输入流");
}
}
}
}
}
package cn.hjm.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* 写入文件
* @author hjm
*
*/
public class DemoFile02 {
public static void main(String[] args) {
File file = new File("C:\\Users\\hjm\\Desktop\\有趣的句子.txt");
OutputStream os = null;
try {
os = new FileOutputStream(file,true);
String str ="hello world\r\n";
byte[] b = str.getBytes();
try {
os.write(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到!");
}
}
}
----如何将文件进行拷贝,其实就是一端的流上车到另一端流的下车过车
我用比较通俗易懂的说法说明一下
有个源文件 要进行拷贝,这个就好比是上车的人,byte[] 就是那辆车,这辆车起初没人 len= 0; 后面陆续有人上车了,就是字节陆续传输上来了,然后 在开的过程中,有人不断下车 就是写出 ,知道车上的人没有了为止。
最后呢? 快到站的时候,我们要叫还没下车的赶紧下车,就要flush()一下。因为我们要到站了,最后呢,把前门 ,后门都关闭 。
代码如下
package cn.hjm.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyFile {
public static void main(String[] args) throws IOException {
//1.建立联系 源头文件(真实存在并且是文件不能是文件夹)和目的文件
File file = new File("C:\\Users\\hjm\\Desktop\\a.png");
//2.目标文件
File dest = new File("C:\\Users\\hjm\\Desktop\\b.png");
//3.选择流,输入和输出流
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(dest);
//4.准备车子
byte[] b = new byte[1024];
int len=0; //假装车上没人
//开始上车
try {
while(-1!=(len=is.read(b))){ //当车子没有满的话继续上车,车子一边开就一边有人下车
os.write(b, 0, len); //从0开始慢慢把人放下车去,有多少人放多少人
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
os.flush();//还有不想下车的赶紧催下车
is.close();//本趟车前面要关闭了
os.close();//本趟车后门要准备关闭了
}
}
}
最后我将这个进行了封装,做成了一个工具类
FileUtil.java
传送门[FileUtil-文件拷贝]