I/O流

来源:互联网 发布:淘宝上架宝贝教程 手机 编辑:程序博客网 时间:2024/06/04 08:32
I/O操作(输入/输出流)





流的概念
数据流向某个对象的数据序列
并且到达这个对象的过程
输入流:数据源数据流向计算机的过程
输出流:把数据从程序流向目标数据源的过程



流的分类
1.按照流向划分

2.按照处理数据的单元划分
2.1字节流(应用范围比字符流广,处理所有2进制文件)
以字节为单位来处理的流
2.11字节输入流
2.12字节输出流
2.2字符流
以字符为单位来处理的流
2.21字符输入流
2.22字符输出流




流的基类(父类)
1.输入流:以InputStream(字节输入流)Reader(字符输入流)为基类


2.输出流:以OutStream(字节输出流)Writer(字符输出流)为基类





字节流部分
InputSream


int read() 从输入流中读取单个字节,返回所读的字节数据
int read(byte[ ] b) 从输入流中读取最多b.length长度字节,并存储在字节数组b中,返回实际读取的字节数
int read(byte[] b,int off,int len) 从输入流中读取追到len长度的字节,保存到字节数组b中,保存的位置从off开始
void close() 关闭输入流





读取(输入)数据的方法
1.建立连接 2.读取数据 3.关闭连接
而只有 FileInputStream())可以和文件建立连接,BufferedInputStream的构造需要传入InputStream,BufferedInputStream有点是有缓存机制,效率更高
public class Ch01 {
/**
* 读取文件内容
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 磁盘路径2种表示方法1.双\\2./
// 因为单\也表示转义符
// 而使用这个方法会出现文件找不到的异常
// 1.建立连接2.读取3.关闭
try {
// 从文件地址中读取内容到程序中
InputStream is = new FileInputStream("E:/JREDU/iodemo/ch01.txt");
// 开始读取信息
// 先定义一个字节数组存放数据
byte[] b = new byte[10];
// 声明一个int存储每次读取的数据
int i = 0;
// 定义一个记录下标的变量
int index = 0;
// 循环读取每个数据
while ((i = is.read()) != -1) {
b[index] = (byte) i;
index++;
}
// 如何把字节数组转字符串
// String自带方法把字节转字符串
System.out.println(new String(b));
// 使用完毕之后要关闭流
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
// 存在文件没有找到的问题
e.printStackTrace();
} catch (IOException e) {
// 文件读写异常(断网、内存不够。。。)
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}



序列流实例
public class Ch08 {
// 序列流:合并多个(2个以上)
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
FileInputStream fis1 = new FileInputStream("E:/JREDU/iodemo/ch01.txt");
FileInputStream fis2 = new FileInputStream("E:/JREDU/iodemo/ch04.txt");
FileInputStream fis3 = new FileInputStream("E:/JREDU/iodemo/ch05.txt");
// 把三个流添加到集合中
Vector<FileInputStream> vector = new Vector<>();
vector.add(fis1);
vector.add(fis2);
vector.add(fis3);

// 合并在一个序列流中
SequenceInputStream sis = new SequenceInputStream(vector.elements());
byte[] b = new byte[1024];
int off = 0;
for (int i = 0; i < vector.size(); i++) {
// off数组当中存放数据的起始下标位置
off += sis.read(b, off, vector.get(i).available());

}
System.out.println(new String(b).trim());
sis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}




写入(输出)数据的方法



而构造后面加上true表示不覆盖原本来的文件,继续在后面写一遍
FileOutputStream("E:\\JREDU\\iodemo\\VN2.jpg")运行多次结果不变
FileOutputStream("E:\\JREDU\\iodemo\\VN2.jpg,true")运行多次,文件会变大,文本文件会在后面复制一边,图片只会单纯内存变大



public class Test02 {
// 图片拷贝
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\JREDU\\iodemo\\VN.jpg"));
byte[] b = new byte[bis.available()];
bis.read(b);
bis.close();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\JREDU\\iodemo\\VN2.jpg"));
bos.write(b);
bos.flush();
bos.close();
System.out.println("拷贝完成");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}





文件拷贝练习


public class Test01 {
// 文件拷贝
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
System.out.println("请输入要拷贝的源文件");
String in = sc.next();
System.out.println("请输入要拷贝的目标位置");
String out = sc.next();
bis = new BufferedInputStream(new FileInputStream(in));
byte[] b = new byte[bis.available()];
bis.read(b);
bos = new BufferedOutputStream(new FileOutputStream(out));
bos.write(b);
bos.flush();
System.out.println("写入成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println("未找到源文件");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 文件出现异常后程序不会向下运行,会导致流不能关闭
// finally不管程序有没有出现异常都会执行

try {
// 避免出现空指针错误
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}

字符流部分
读取文件实例
public class Ch04 {
// 字符流读取文件(包装流)
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("E:/JREDU/iodemo/ch04.txt");
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(f);
br = new BufferedReader(fr);
// 以字符为单位读取数据,字节流单位是字节
String str = null;
// BufferedReader特点是逐行读取
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {

try {
if (br != null) {
br.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}



写入文件实例
package com.jredu.ch22;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Ch06 {
// 字符输出流 BufferedWriter
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("E:/JREDU/iodemo/Test07.txt"));
// newLine()实现换行
bw.write("三大三大四的");
bw.newLine();
bw.write("三大三大四的\r\n");
bw.write("三大三大四的\r\n");
bw.write("三大三大四的\r\n");
System.out.println("写入成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.flush();
bw.close();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}

字节流和字符流转换
InputStreamReader的构造可以传入字节流,三重包裹流

public class Ch05 {
// 字节转字符流,输入流

public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fis = null;
// InputStreamReader的构造可以传入字节流
InputStreamReader tsr = null;
BufferedReader br = null;
try {
fis = new FileInputStream("E:/JREDU/iodemo/ch04.txt");
tsr = new InputStreamReader(fis);
br = new BufferedReader(tsr);
// 包装流
// br=new BufferedReader(new InputStreamReader(new
// InputStreamReader(fis)));
StringBuffer sb = new StringBuffer();
String str = null;
while ((str = br.readLine()) != null) {
sb.append(str + "\r\n");
}
System.out.println(sb.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}


原创粉丝点击