数据输入输出流
DataInputStream和DataOutputStream
特点:能够读写基本数据类型
构造方法:
DataInputStream(InputStream in)
使用指定的底层 InputStream 创建一个 DataInputStream。
DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。
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);
DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
out.writeBoolean(true);
out.writeDouble(3.14);
out.writeInt(100);
out.writeUTF("你好世界");
out.close();
内存操作流
- 操作字节数组 ByteArrayOutputStream和ByteArrayInputStream
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 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);
- 操作字符数组 CharArrayWrite和CharArrayReader
CharArrayWriter writer = new CharArrayWriter();
writer.write("abc");
writer.write("abc");
writer.write("abc");
writer.write("abc");
writer.write("abc");
//取出缓冲区中的数据
char[] chars = writer.toCharArray();
System.out.println(String.valueOf(chars));
System.out.println(new String(chars));
System.out.println(writer.toString());
- 操作字符串 StringWriter和StringReader
StringWriter stringWriter = new StringWriter();
stringWriter.write("abc");
stringWriter.append("abc");
String s = stringWriter.toString();
System.out.println(s);
使用内存操作流合并歌曲
FileInputStream in1 = new FileInputStream("许巍 - 曾经的你.mp3");
FileInputStream in2 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("歌曲大联唱.mp3");
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
//创建一个集合
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){
byteOut.write(bytes,0,len);
byteOut.flush();
}
in.close();
}
//取出两首歌的字节数据
byte[] allBytes = byteOut.toByteArray();
System.out.println(allBytes.length);
//将两首歌的字节数据,写到硬盘上
ByteArrayInputStream byteIn = new ByteArrayInputStream(allBytes);
int len2 = 0;
byte[] bytes2 = new byte[1024 * 8];
while ((len2 = byteIn.read(bytes)) != -1) {
out.write(bytes, 0, len2);
out.flush();
}
out.close();
字符打印流PrintWriter
//参数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();
字节打印流
//打印流:只操作目的地,不关联源文件
// PrintStream 字节打印流
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");
利用打印流复制文本文件
BufferedReader reader = new BufferedReader(new FileReader("内存操作流.java"));
PrintWriter printWriter = new PrintWriter(new FileOutputStream("aa.java"),true);
String line=null;
while ((line=reader.readLine())!=null){
printWriter.println(line);
}
reader.close();
printWriter.close();
随机访问流RandomAccessFile
此流的特点,能读能写,有一个文件指针,能够记录文件读写的位置
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;
rw 模式,可读可以写
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);