打印流:字节打印流PrintStream
package com.qianfeng.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
/*
* 打印流:除了拥有输出流的特点之外,还有打印的功能,比如println,print等方法。
* 分成两种:
* 字节打印流:PrintStream
* 字符打印流:PrintWriter
*
* 字节打印流:
* 可以直接关联的设备(传入的参数)
* 1.File类型的文件
* 2.字符串类型的文件
* 3.字节输出流
*
*/
public class Demo5 {
public static void main(String[] args) throws IOException {
// * 1.File类型的文件
//PrintStream printStream = new PrintStream(new File("D:\\workspace\\32\\BigData1715N21\\src\\com\\qianfeng\\test\\Demo1.java"));
// * 2.字符串类型的文件
//PrintStream printStream = new PrintStream("temp3.txt");//对于当前的文件,如果不存在,会自动创建。
// * 3.字节输出流
PrintStream printStream = new PrintStream(new FileOutputStream("temp3.txt"));
//讲解print()方法的原理
printStream.write(97);//00000000 00000000 00000000 01100001 在打印的时候将前面三个字节砍掉了,得到a
printStream.write(353);//00000000 00000000 00000001 01100001 在打印的时候将前面三个字节砍掉了,得到a
printStream.print(353);
//先将353转成字符串再转成字节数组
printStream.write(String.valueOf(353).getBytes());
printStream.close();
}
}
打印流:字符打印流PrintWriter
package com.qianfeng.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
/*
* 字符打印流:
* 可以直接关联的设备(传入的参数)
* 1.File类型的文件
* 2.字符串类型的文件
* 3.字节输出流
* 4.字符写出流
*/
public class Demo6 {
public static void main(String[] args) throws IOException {
//实例:将数据从键盘接收到控制台
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//创建字符打印流
PrintWriter printWriter = new PrintWriter(System.out);
String data = null;
while((data=bufferedReader.readLine())!=null){
printWriter.println(data);
printWriter.flush();
}
bufferedReader.close();
printWriter.close();
}
}
序列流
package com.qianfeng.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Vector;
public class Demo7{
/*
* 序列流:把多个输入流的内容一次性的打印(操作)---字节流
*/
public static void main(String[] args) throws IOException {
//创建三个输入流
FileInputStream fileInputStream1 = new FileInputStream("src\\com\\qianfeng\\test\\Demo2.java");
FileInputStream fileInputStream2 = new FileInputStream("src\\com\\qianfeng\\test\\Demo2.java");
FileInputStream fileInputStream3 = new FileInputStream("src\\com\\qianfeng\\test\\Demo1.java");
//将三个输入流放入序列流
//方式一:先放入一个Vector
// Vector<FileInputStream> vector = new Vector<>();
// vector.add(fileInputStream1);
// vector.add(fileInputStream2);
// vector.add(fileInputStream3);
//
// //得到枚举器
// Enumeration<FileInputStream> e1 = vector.elements();
//方式二:先放入一个list
ArrayList<FileInputStream> list = new ArrayList<>();
list.add(fileInputStream1);
list.add(fileInputStream2);
list.add(fileInputStream3);
//将集合转换成枚举
Enumeration<FileInputStream> e2 = Collections.enumeration(list);
//创建序列流对象并关联相关的文件--参数是一个枚举器
//SequenceInputStream sequenceInputStream = new SequenceInputStream(e1);
SequenceInputStream sequenceInputStream = new SequenceInputStream(e2);
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream("temp2.txt");
//读写
byte[] arr = new byte[1024];
int num;
while ((num = sequenceInputStream.read(arr)) != -1) {
fileOutputStream.write(arr, 0, num);
fileOutputStream.flush();
}
sequenceInputStream.close();
fileOutputStream.close();
}
}
数据流
package com.qianfeng.test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo8 {
/*
* 数据流:字节流
* DataInputStream: 数据输入流
* DataOutputStream: 数据输出流
*
* 注意:数据流要与字节输入流,输出流配合使用
*/
public static void main(String[] args) throws IOException {
//写
writeData();
//读
readData();
}
public static void writeData() throws IOException {
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("temp3.txt"));
//写
dataOutputStream.writeInt(97);//4个字节 00000000 00000000 000000000 011000001 00000001
dataOutputStream.writeBoolean(true);//1个
dataOutputStream.write(33);//1个
dataOutputStream.writeDouble(34.56);//8个
//关闭流
dataOutputStream.close();
}
public static void readData() throws IOException {
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("temp3.txt"));
//这里的boolean型和int型的数据,在读的时候由于与之前写的顺序相反了,所以读取的数据错误
/*
* 注意点:1.读的顺序要与写的顺序一致 2.类型保持一致
*/
System.out.println(dataInputStream.readBoolean());// 00000000
System.out.println(dataInputStream.readInt());//00000000 000000000 011000001 00000001
System.out.println(dataInputStream.readByte());
System.out.println(dataInputStream.readDouble());
dataInputStream.close();
}
}
内存流
package com.qianfeng.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Demo9 {
public static void main(String[] args) throws IOException {
/*
* 内存流(byte数组流):
* ByteArrayInputStream:写入内存,在内部有一个数组,数据被放在这里面
* ByteArrayOutputStream:将数据取出,放在字节数组里面
*/
//创建输入流,关联一个byte型的数组,作为缓冲区数据
ByteArrayInputStream bais = new ByteArrayInputStream("hello world".getBytes());
//创建输出流-不需要指定参数
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] arr = new byte[1024];
int num;
while ((num = bais.read(arr)) != -1) {
baos.write(arr, 0, num);
}
System.out.println(new String(arr));
bais.close();
baos.close();
//注意:将流关闭了之后,还可以调用方法,不会报错.
baos.write(45);
}
}