字节流
Java中的字节流主要包含两个抽象的流类型:
- java.io.InputStream 是所有字节输入流的超类(最终父类)
- java.io.OutputStream 是所有字节输出流的超类
常见子类
- FileInputStream
- FileOutputStream
- ByteArrayInputStream
- ByteArrayOutputStream
- BufferedInputStream
- BufferedOutputStream
InputStream&OutputStream
实例
public class InputStreamDemo {
public static void main(String[] args) throws IOException {
//获取文件(标准文件)对象
File f = new File("d:/tempfile/a.txt");
//根据提供的文件获取一个文件输入流
InputStream is = new FileInputStream(f);
int byts = is.available();
System.out.println("可读字节数:"+byts);
//声明一个字节数组
byte[] b = new byte[byts];
//将流中的所有字节读入字节数组中
int i = is.read(b);
//将字节数组转换为字符串
String s = new String(b);
System.out.println(s);
}
}
字符流
Java中的字符流主要包含以下两个抽象类型
- java.io.Reader
- java.io.Writer
常见子类
- FileReader
- FileWriter
- InputStreamReader
- InputStreamWriter
- BufferedReader
- BufferedWriter
Reader&Writer
实例
public class ReaderDemo {
/**
* 使用字符流实现文本文档拷贝
* FileReader
* FileWriter
* @param args
*/
public static void main(String[] args) {
Reader reader = null;
Writer writer = null;
try{
//声明源文件的字符输入流
reader = new FileReader("D:\\tempfile\\a.txt");
//声明目标文件的输出流
writer = new FileWriter("c:/a.txt");
//声明字符数组作为缓冲区
char[] c = new char[50];
//用于表示真实读取字符数的临时变量
int len = 0;
//循环读取流中的字符到字符数组中,并判断是否有读到文件末尾
while((len = reader.read(c)) != -1) {
//将字符数组转换为字符串输出
//String s = new String(c,0,len);
//System.out.print(s);
//通过字符输出流输出
writer.write(c, 0, len);
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭资源
if(reader != null) {
reader.close();
}
if(writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
处理流
节点流
节点流也是低级流,主要用于跟输入输入源直接对接,常见的节点流:
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- ByteArrayInputStream
- ByteArrayOutputStream
- CharArrayReader
- CharArrayWriter
处理流
处理流也称之包装流,用于将节点流或者其他流进行包装,以提高数据的传输效率或者转换流的类型,常见的处理流:
- InputStreamReader
- OutputStreamWriter
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
转换流&缓冲流
转换流用于字节字符流进行相互转换
实例
字节转字符
public static void main(String[] args) throws IOException {
//获取标准输入流(字节流)
InputStream is = System.in;
//字节流转换为字符流(转换流可以实现字节流和字符流之间的转换;不能转换流向)
InputStreamReader isr = new InputStreamReader(is,"utf-8");
//将字符流包装为字符缓冲流(装饰器模式)
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s = br.readLine()) != null) {
if("quit".equals(s)) {
System.out.println("bye !!!");
System.exit(0);
}
System.out.println(s);
}
}
字符转字节
public static void main(String[] args) throws IOException {
//需要写入文件的内容
String msg = "长江长江,我是黄河,收到请回答!!!!";
//目标文件
File f = new File("d:/tempfile/b.txt");
//字节输出流
FileOutputStream fos = new FileOutputStream(f,true);
//将字节流包装为字符输出流
OutputStreamWriter osw = new OutputStreamWriter(fos);
//将字符输出流包装为缓冲字符输出流
BufferedWriter bw = new BufferedWriter(osw);
bw.write(msg);
//使用字符流时需要使用flush将缓冲区的数据强行写入目标输出源
bw.flush();
bw.close();
}