IO流:System.in、SequenceInputStream合并流、内存输入输出流、数据流
1、System.in
System.out 是常用的在控制台输出数据的
System.in 可以从控制台输入数据
InputStream is = System.in
while (true) {
// 敲入a,然后敲回车可以看到
// 97 13 10
// 97是a的ASCII码
// 13 10分别对应回车换行
int i = is.read();
System.out.println(i);
字节输入流转化为字符输入流:
InputStream is =System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
2、SequenceInputStream合并流
SequenceInputStream(Enumeration<? extends InputStream> e) //整合多个输入流
SequenceInputStream(InputStream s1, InputStream s2) //整合2个输入流
整合2个输入流
public class Test03 {
public static void main(String[] args) throws IOException {
FileInputStream fis01 = new FileInputStream("d:\\text\\st01.txt");
FileInputStream fis02 = new FileInputStream("d:\\text\\st02.txt");
FileInputStream fis03 = new FileInputStream("d:\\text\\st03.txt");
//SequenceInputStream合并流,将与之相连接的流集组合成一个输入流,并从第一个输入流开始读取
SequenceInputStream sis = new SequenceInputStream(fis01, fis02);
BufferedInputStream bis = new BufferedInputStream(sis);
byte[] b = new byte[1024];
int n = 0;
while((n = bis.read(b))!=-1) {
String s = new String (b,0,n);
System.out.println(s);
}
}
}
整合多个输入流
public class Test03 {
public static void main(String[] args) throws IOException {
FileInputStream fis01 = new FileInputStream("d:\\text\\st01.txt");
FileInputStream fis02 = new FileInputStream("d:\\text\\st02.txt");
FileInputStream fis03 = new FileInputStream("d:\\text\\st03.txt");
Vector<InputStream> vt = new Vector<InputStream>();
vt.add(fis03);vt.add(fis02);vt.add(fis01);
//通过vector的elements方法,得到关于多个流的枚举
Enumeration<InputStream> en = vt.elements();
SequenceInputStream sis = new SequenceInputStream(en);
BufferedInputStream bis = new BufferedInputStream(sis);
byte[] b = new byte[1024];
int n = 0;
while((n = bis.read(b))!=-1) {
String s = new String (b,0,n);
System.out.println(s);
}
}
}
3、内存输出流ByteArrayOutputStream、内存输入流ByteArrayInputStream
①ByteArrayInputStream:
包含一个内部缓冲区,其中包含可以从流中读取的字节,内部计数器跟踪由read方法提供的下一个字节
关闭一个ByteArrayInputStream没有任何效果,该流中的方法可以在流关闭后调用,而不生成IOException
意思就是说,比如文件流的处理对象的外存中的文件,而它的处理对象是内存中的缓冲区。它是从一个内存读到另一个内存方式。
构造方法:
ByteArrayInputStream(byte[] buf);
创建一个ByteArrayInputStream实例,使用字节数组buf作为其缓冲区数组。
ByteArrayInputStream(byte[] buf,int offset,int length);
创建一个ByteArrayInputStream实例,使用字节数组buf从offset开始的len个字节作为其缓冲区数组。
主要方法:
- int available(): 输入流中可读取的字节个数
- void close(): 关闭此输入流并释放与该流有关的系统资源.
- void mark(int readlimit): 在此输入流中标记当前的位置.
- boolean markSupported(): 检测此输入流是否支持mark和reset.
- int read(): 从输入流中读取下一个字节数据.
- int read(byte[] b,int off,int len): 从输入流中读取len个字节,并将其存储在字节数组b中off位置开始的地方
- void reset(): 将此流重新定位到最后一次对此输入流调用mark方法时的位置.
- long skip(long n): 跳过和丢弃此输入流中n个字节的数据.
②ByteArrayOutputStream :
现了一个输出流,其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。
缓冲区会随着数据的不断写入而自动增长。可以使用toByteArray()和toString()方法来获取数据
关闭ByteArrayOutputStream无效,此类中的方法在关闭此流后仍可被调用,而不会产生IOException
构造方法:
ByteArrayOutputStream(): 创建一个新的byte数组输出流。
ByteArrayOutputStream(int size): 创建一个新的byte数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
主要方法:
- void close(): 无效
- void reset():
- int size(): 返回缓冲区的当前大小/返回输出流中字节个数
- byte[] toByteArray(): 将输出流中的字节数据以字节数组的形式返回
- String toString():将输出流中的字节数据转换成字符串
- String toString(String charsetName):
- void write(byte[] b,int off,int len):将指定的字节数组b 从off位置开始的len个字节 写入到此输出流中
- void write(int b):将指定的数据,写入到此输出流中(b = 97,则存入‘a’)
- void writeTo(OutputStream out):将此 byte 数组输出流的 count(缓冲区中的有效字节数) 字段重置为零,从而丢弃输出流中目前已累积的所有输出
public class Test01 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\test\\test01.txt");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int n = 0;
while((n = fis.read())!=-1) {
bos.write(n);
}
String s = bos.toString();
System.out.println(s);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
byte [] b = new byte[1024];
n = 0;
while((n = bis.read(b))!=-1) {
String ss = new String(b,0,n);
System.out.println(ss);
}
}
}
4、数据流
DataInputStream 数据输入流
DataOutputStream 数据输出流
DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取
所以DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException
DataInputStream 与 DataOutputStream 分别继承自 InputStream、OutputStream, 它属于处理流,需要分别套接在 InputStream、OutputStream 类型的节点流上面
DataOutputStream则能够直接将JAVA基本类型和String类型数据写入到其他的字节输入流。
DataInputStream能以一种与机器无关(当前操作系统等)的方式,直接从地从字节输入流读取JAVA基本类型和String类型的数据
读取数据的时候要按照写入的数据类型的顺序读取
DataOutputStream方法:
void flush() 清空此数据输出流。
int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
void write(int b) 将指定字节(参数 b 的八个低位)写入基础输出流。
void writeBoolean(boolean v) 将一个 boolean 值以 1-byte 值形式写入基础输出流。
void writeByte(int v) 将一个 byte 值以 1-byte 值形式写出到基础输出流中。
void writeBytes(String s) 将字符串按字节顺序写出到基础输出流中。
void writeChar(int v) 将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeChars(String s) 将字符串按字符顺序写入基础输出流。
void writeDouble(double v) 使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeFloat(float v) 使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeInt(int v) 将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeLong(long v) 将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeShort(int v) 将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeUTF(String str) 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
public class TestStream {
public static void main(String[] args) {
write();
read();
}
private static void read() {
File f =new File("d:/lol.txt");
try (
FileInputStream fis = new FileInputStream(f);
DataInputStream dis =new DataInputStream(fis);
){
boolean b= dis.readBoolean();
int i = dis.readInt();
String str = dis.readUTF();
System.out.println("读取到布尔值:"+b);
System.out.println("读取到整数:"+i);
System.out.println("读取到字符串:"+str);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void write() {
File f =new File("d:/lol.txt");
try (
FileOutputStream fos = new FileOutputStream(f);
DataOutputStream dos =new DataOutputStream(fos);
){
dos.writeBoolean(true);
dos.writeInt(300);
dos.writeUTF("123 this is gareen");
} catch (IOException e) {
e.printStackTrace();
}
}
}