JAVAday20 IO流
一 IO流概述及其分类
1.什么是IO流
IO流用来处理设备之间的数据传输,java对数据的操作都是通过留的方式,操作的对象都在Io包中java.IO
2.IO流的分类
a:按照数据的流向(站在内存的角度)
输入流-------读入数据
输入流-------写出数据
b:按照数据类型
字节流:可以读写任何类型的文件,比如音频,视频,文本文件
字符流:只能读写文本文件
如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就是字符流;如果不知道是什么类型就用字节流。
二 IO流基类概述及FileOutStream的构造方法
1.IO流基类概述
a:字节流的抽象基类
InputStream ,OutputStream
b: 字符流的抽象基类
Reader ,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
2.字符流继承关系
writer:BufferWriter
OutputStreamWriter
PrintWriter
Reader: BufferReader
InputStreamReader
3.字节流继承关系
InputStream :FileIputStream
ByteArrayInputStream
ObjectInputStream
SequenceInputStream
OutputStream:FileOutputStream
ByteArrayOutputStream
ObjecyOutputStream
4.FileOutputStream的构造方法
public static void main(String[] args) throws IOException {
//异常的处理 File
//I/O InputStream 输入流 OutPutStream 输出流 处理设备之间的一个数据传输
//流按照流向分:分为 输入流和输出流
//按照读写文件的类型分:分为字节流(可以读写任意类型的文件)和字符流(读写文本文件)
//字节流:
//文件输入输出 流
//文件输出流:写出数据
//
//FileOutputStream(File file)
//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
//FileOutputStream(String name)
//创建一个向具有指定名称的文件中写入数据的输出文件流。
File file = new File("a.txt");
//file.createNewFile();
//输入流,所关联的文件,如果该文件不存在 ,那么会自动帮你创建
FileOutputStream out = new FileOutputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream("b.txt");
//流用完之后必须释放资源
out.close();
fileOutputStream.close();
}
}
5.FileOutputStream的三个writer()方法
public static void main(String[] args) throws IOException {
//通过文件输出流,往他所关联的件中,写出数据
FileOutputStream out = new FileOutputStream("a.txt");
//写数据
out.write(97); //一次写入一个字节
out.write(98);
out.write(99);
out.write(100);
out.write(300); //超过了一个字节,会丢弃掉多余字节
byte[] bytes = {101, 102, 103, 104};
out.write(bytes);//一次写入一个字节数组
out.write(bytes, 2, 2);//一次写入字节数组的一部分,从2索引开始,写2个字节
String str = "杨家有女初长成,养在深闺人未识";
//UTF-8 编码 一个汉字占三个字节
byte[] bytes1 = str.getBytes();//将一个字符串,转换成字节数组
out.write(bytes1);
out.close();
}
}
6.FileOutputStream写入数据实现换行和追加写入
//换行
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("b.txt");
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
out.write("\r\n".getBytes());//写入一个回车换行符
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
out.write("\r\n".getBytes());//写入一个回车换行符
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
out.write("\r\n".getBytes());//写入一个回车换行符
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
//各个平台的换行符,都不一样
//windows 平台 \r\n
//Linux \n
//Mac \r
//流用完之后,必须释放资源
out.close(); //关闭流
}
//追加写入
FileOutputStream out = new FileOutputStream("c.txt",true);
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
out.write("\r\n".getBytes());//写入一个回车换行符
out.write("回眸一笑百媚生,六宫粉黛无颜色".getBytes());
//释放资源
out.close();
}
7.FileOutputStream读取数据
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
//读取文件中的数据
int len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len);
len = in.read();//一次读取一个字节
System.out.println(len); //读取不到返回-1
in.close();//记得流用完之后,释放资源
缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快,这是加入了数组这样的缓冲区。
//一次读取一个字节数组复制文本文件
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
byte[] bytes = new byte[1024];
//读取字节数组的一部分
//把读取到的字节的一部分,装入到缓冲区中
int len = in.read(bytes, 0, 3);
String s = new String(bytes, 0, 3);
System.out.println(s);
in.close();
}
8.BufferoutputStream写入读取数据
为了缓冲方便,java直接提供了一种字节缓冲区流
//高效的字节输入输出流
private static void copyFile1() throws IOException {
BufferedInputStream bfr = new BufferedInputStream(new FileInputStream("demo.mp3"));
BufferedOutputStream bfw = new BufferedOutputStream(new FileOutputStream("demo2.mp3"));
//读取一个字节写入一个字节
int len=0;
byte[] bytes = new byte[1024 * 8];
while ((len=bfr.read(bytes))!=-1){
bfw.write(bytes,0,len);
}
bfr.close();
bfw.close();