IO中的各种流
数据输入输出流
(1)特点:
能够读写基本类型
怎么写的就怎么读,顺序不能乱
(2)格式
DataInputStream
DataOutputStream
(3)举例
public class Demo {
public static void main(String[] args)throws IOException {
writeData();
DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
boolean b = in.readBoolean();
double v = in.readDouble();
int i = in.readInt();
String s = in.readUTF();
System.out.println(b);
System.out.println(v);
System.out.println(i);
System.out.println(s);
in.close();
}
private static void writeData() throws IOException {
DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
out.writeBoolean(true);
out.writeDouble(3.14);
out.writeInt(100);
out.writeUTF("你好世界");
out.close();
}
}
结果:
true
3.14
100
你好世界
内存操作流
(1)概述:
内存操作流,不关联任何文件,只是内存中对数据进行读写
(2)格式
a:
操作字节数组
ByteArrayOutputStream
ByteArrayInputStream
此流关闭无效,所以无需关闭
b:
操作字符数组
CharArrayWrite
CharArrayReader
c:
操作字符串
StringWriter
StringReader
ByteArrayOutputStream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray () 和 toString () 获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
(3)举例
public class 内存操作流 {
public static void main(String[] args) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write("横眉冷对千夫指".getBytes());
out.write("俯首甘为孺子牛".getBytes());
//取出缓冲区中的数据
byte[] allBytes = out.toByteArray();
String s = new String(allBytes);
System.out.println(s);
ByteArrayInputStream in= new ByteArrayInputStream(allBytes);
byte[] bytes=new byte[1024*8];
int len = in.read(bytes);
String s1 = new String(bytes, 0, len);
System.out.println(s1);
}
}
多个文件合为一个
public class 把多个文件合成一个文件2 {
public static void main(String[] args) throws IOException {
FileInputStream in1 = new FileInputStream("许巍 - 曾经的你.mp3");
FileInputStream in2 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("歌曲大联唱2.mp3");
ArrayList<FileInputStream> list = new ArrayList<>();
list.add(in1);
list.add(in2);
int len = 0;
byte[] bytes = new byte[1024 * 8];
for (FileInputStream in : list) {
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
in.close();
}
out.close();
}
}
字节打印流
(1)概述:
只操作目的地,先关联源文件
(2)格式
PrintStream 字节打印流
(3)举例
public class 字节打印流 {
public static void main(String[] args) throws IOException {
PrintStream printStream = new PrintStream(new FileOutputStream("b.txt"));
printStream.write("字节打印流".getBytes());
printStream.print(true);
printStream.println(100);
printStream.close();
PrintStream out = System.out;
out.write("abc".getBytes());
out.println(3.14);
System.out.println("abc");
}
}
字符打印流
(1)特点
先关联文件,给参数二写true可以自动刷新,但是仅限于println,printf或format方法
(2)格式
PrintWriter
(3)举例
public class 字符打印流 {
public static void main(String[] args) throws IOException {
//参数2:true 自动刷新
//如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
PrintWriter writer = new PrintWriter(new FileOutputStream("c.txt"),true);
//writer.write("字符打印流");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.println("abc");
writer.flush();
writer.close();
}
}
随机访问流
(1)概述
RandomAccessFile 随机访问流,此流的特点,能读能写,有一个文件指针,能够记录文件读写的位置
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;
rw 模式,可读可以写
你怎么写的,就怎么读取 顺序不要乱
seek():设置指针位置
(2)举例
public class Demo {
public static void main(String[] args)throws IOException {
writeData();
//你怎么写的,就怎么读取 顺序不要乱
RandomAccessFile ra = new RandomAccessFile(new File("e.txt"), "rw");
boolean b = ra.readBoolean();
//获取文件指针的位置
long filePointer = ra.getFilePointer();
System.out.println(filePointer);//1
double v = ra.readDouble();
filePointer = ra.getFilePointer();
System.out.println(filePointer);//9
int i = ra.readInt();
filePointer = ra.getFilePointer();
System.out.println(filePointer);//13
char c = ra.readChar();
filePointer = ra.getFilePointer();
System.out.println(filePointer);//15
String s = ra.readUTF();
filePointer = ra.getFilePointer();
System.out.println(filePointer);//
System.out.println(b);
System.out.println(v);
System.out.println(i);
System.out.println(s);
//设置指针的位置
ra.seek(15);
String s1 = ra.readUTF();
System.out.println(s1);
}
private static void writeData() throws IOException {
RandomAccessFile ra = new RandomAccessFile(new File("e.txt"), "rw");
ra.writeBoolean(true);
ra.writeDouble(3.14);
ra.writeInt(100);
ra.writeChar('a');
ra.writeUTF("字符串");
ra.close();
}
}