Java笔记 - IO流 - 字节流

字节流和字符流无非是处理的数据单位不一样,处理的数据格式也不一样,字符流只能处理文本文件,字节流可以处理任何格式的文件。
字节流可以抽取出两个顶层基类:InputStream和OutputStream
1. FileInputStream类和FileOutputStream类
字节流和字符流用来操作硬盘上文件的类都是在基类前面加上File,他们中的方法也大致相同
字符流创建的数组是char类型的,字节流创建的数组是byte类型的
字节流输入流有一个方法available() 可以获取到文件的字节数。

//FileOutputStream
FileOutputStream fos = new FileOutputStream("E:\\字节流.txt");
fos.write("abcdefghigk".getBytes());
fos.close();

//FileInputStream
FileInputStream fis = new FileInputStream("E:\\字节流.txt");
byte[] buf = new byte[fis.available()];
int len = 0;
while ((len = fis.read(buf))!= -1) {
    System.out.println(new String(buf,0,len));
}
fis.close();

输出结果:

abcdefghigk

字节流是不需要刷新的,因为它写的都是源码,别人怎么解析和我没有关系,所以不需要临时存储缓冲。
查看源码,其实OutputStream字节输出流中的flush和close方法其实都什么都没做,只是为了子类去实现。
FileOutputStream中的flush方法是继承自OutputStream,也是什么都没有做。close方法因为要关闭资源,所以它实现了OutputStream类中的close方法。
2. System.in和System.out
如果我们想读取键盘录入的数据,并打印到控制台上。因为键盘本身是一个标准的输入设备,系统对于这种设备都会有对应的对象,所以在System类中发现有两个字段
public static final InputStream in:“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
public static final PrintStream out:“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

InputStream in = System.in;

int ch = in.read();
System.out.println(ch);
int ch1 = in.read();
System.out.println(ch1);
int ch2 = in.read();
System.out.println(ch2);

运行程序,控制台等待我们输入数据,因为read()方法在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。这种方法称之为阻塞式方法
输入a后回车,控制台打印结果:
97
13
10
97是a的ASCII码值,13和10分别是’\r’和’\n’的ASCII码值,所以有三个值。
标准输入输出流是不需要关流的。因为其他的输入输出流我们可以通过关键字new自己来创建,但是标准输入输出流只有一个,我们不能自己创建,只能获取,关闭了之后我们再想调用的话就获取不到了。标准输入输出流会随着系统的出现而出现,随着系统的消失而消失,我们不需要担心它。

如果我们想不断的读取键盘输入的数据:

InputStream in = System.in;

int ch = 0;
while((ch = in.read())!= -1){
        System.out.println(ch);
}

你可能感兴趣的:(java)