IO流
- 概念:IO流用来处理设备之间的数据传输
JAVA对数据的操作是通过流的方式实现的 - 分类
- 内存角度:
输入流 —— 读入数据
输出流 —— 写出数据
- 数据类型
字节流 ———— 可以读写任何类型的文件 eg:音频 文本
字符流 ———— 只能读写文本文件
IO流的基类描述
- 字节流:InputStream(读) —— OutputStream(写)
- 字符流:Reader(读)—— Writer(写)
- 具体子类:FileReader —— FileWriter
OutputStream是一个抽象类 不能直接实例化 必须找到他的子类————FileOutputStream 进行实例化
字节流 ——FileOutputStream和FileInputStream
FileOutputStream(File file)——传入文件
FileOutputStream(String name)——传入文件的路径
用完记得close( ) :通知系统释放关于文件的资源 让IO流对象变成垃圾,等待垃圾回收器对其进行回收
public void write(int b):写一个字节 超过一个字节 砍掉前面的字节
public void write(byte[ ] b):写一个字节数组
public void write(byte[ ] b,int off,int len):写一个字节数组的一部分
Windows下的换行符———— \r\n
Linux下的换行符————\n
eg: FileOutputStream out = new FileOutputStream("a.txt");
out.write(97);
out.write(98);
out.write(99);
out.write(200);
byte[] bytes = {100,101,102,103,104,105};
out.write(bytes);
out.write("\r\n".getBytes());
String s = "我不愿失去每一寸泥土";
out.write(s.getBytes());
out.close();
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
FileOutputStream out = new FileOutputStream("a.txt",true);
FileInputStream(File file)———读取文件
FileInputStream(String name)————读取文件的名字
用完记得close( ) :通知系统释放关于文件的资源 让IO流对象变成垃圾,等待垃圾回收器对其进行回收
public void read() ————读取一个数据字节。
public void read(byte[ ] b) ————读取一个 byte 数组的字节
eg: byte[] bytes = new byte[1024];————创建一个字节数组 充当缓冲区
int read1 = in.read(bytes);————读取缓冲区中的字节数
System.out.println(read1);————返回的是读到的有效的字节个数
for (byte aByte : bytes) {
System.out.println(aByte);————遍历a.txt中每个字节数 1024-len 其余为0
}
public void read(byte[ ] b, int off, int len) ————读取一个字节数组的一部分
eg: FileInputStream in = new FileInputStream("b.txt");
byte[] bytes = new byte[1024];
int len = in.read(bytes, 0, 20);————一次读取一部分字节 放进缓冲区中
System.out.println(len);
for (byte aByte : bytes) {
System.out.println(aByte);——————只读取20个字节数 其余为0
}
String s = new String(bytes, 0, 10);————把字节数组中的字节数转成字符输出
System.out.println(s);————————0-20的字节数组转换成字符数组
注:若要将字节数组转换成字符数组,定义字符串时只能在字节数组的范围内转换
eg: FileOutputStream out1 = new FileOutputStream("c.txt");
FileInputStream in1 = new FileInputStream("c.txt");
int read = in1.read();
System.out.println(read);——————————输出为-1
字节流的文本文件复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo5 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("b.txt");
FileOutputStream out = new FileOutputStream("C:\\Users\\ZY\\Desktop\\b.txt");
int len = 0;
while((len = in.read())!=-1){
out.write(len);————————在赋值的文件中写出读取的第一个字节数组
//out.flush();
}
in.close();
out.close();
System.out.println("复制完成");
}
}
字节流的音频文件的复制
————————————一次读取一个字节 一次复制一个字节
import java.io.*;
public class demo6 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("C:\\Users\\ZY\\Desktop\\Blow Fever - 旋转椅 (Live).mp3");//封装文件
FileOutputStream out = new FileOutputStream("C:\\Users\\ZY\\Desktop\\Blow Fever-旋转椅.mp3");//所复制的新文件
int len = 0;
long start = System.currentTimeMillis();
while((len = in.read())!=-1){
out.write(len);
out.flush();
}
long end = System.currentTimeMillis();
in.close();
out.close();
System.out.println("复制完成 共耗时"+(end-start)+"毫秒");————输出:复制完成 共耗时54040毫秒
}
}
高效率复制——————创建一个字节数组 读取并赋值
————————————一次读取一个字节数组的大小 1024*8 并复制
import java.io.*;
public class demo7 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\ZY\\Desktop\\Blow Fever - 旋转椅 (Live).mp3");
FileInputStream in = new FileInputStream(file);
FileOutputStream out = new FileOutputStream("C:\\Users\\ZY\\Desktop\\photo\\" + file.getName());
byte[] bytes = new byte[1024 * 8];————————创建一个字节数组
int len = 0;
long start = System.currentTimeMillis();
while ((len = in.read(bytes))!=-1){
out.write(bytes,0,len);——————————一次读取1024*8个字节数并赋值
}
long end = System.currentTimeMillis();
System.out.println("复制完成 共耗时"+(end-start)+"毫秒");——————输出:
复制完成 共耗时22毫秒
in.close();
out.close();
}
}
抓取异常
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo8 {
public static void main(String[] args) {
FileInputStream in = null;
FileOutputStream out = null;
try{
File file = new File("C:\\Users\\ZY\\Desktop\\ICE - ICE (Live).mp3");
in = new FileInputStream(file);
out = new FileOutputStream("C:\\Users\\ZY\\Desktop\\JAVA练习文件\\"+file.getName());
int len = 0;
byte[] bytes = new byte[1024 * 8];
while ((len = in.read(bytes))!=-1){
out.write(bytes,0,len);
}
System.out.println("复制完成!");
}catch (IOException e){
e.printStackTrace();
}finally {
try{
if(in!=null){
in.close();
}
if(out!=null){
out.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
BufferedOutputStream———高效输出流
字节缓冲流:给基本的字节流一个包装 使其更高效的读写 需要接受一个基本字节FileInputStream流对象
- OutputStream的子子类
- 概念:实现缓冲的输出流。通过设置这种输出流,应用程序可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统
BufferedInputStream———高效输入流
不用自己创建字节数组重放缓冲流 自带缓冲流
BufferedInputStream(InputStream in)——创建缓冲输入流in
BufferedInputStream(InputStream in, int size)——创建缓冲输入流in(可指定缓冲区大小)
BufferedOutputStream(OutputStream out)——创建缓冲输出流
import java.io.*;
public class demo9 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\ZY\\Desktop\\潘玮柏 _ G.E.M. 邓紫棋 _ 艾热 - 攀登 (Live).mp3"),1024*8);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\ZY\\Desktop\\JAVA练习文件\\攀登 (Live).mp3"));
byte[] bytes = new byte[1024 * 8];
int len = 0;
long start = System.currentTimeMillis();
while((len = bis.read(bytes))!=-1){
bos.write(bytes,0 ,len);
}
long end = System.currentTimeMillis();
bis.close();
bos.close();
System.out.println("复制完成 共耗时"+(end-start)+"毫秒");
}
}