Java IO流:字节流
流
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。
Java对数据的操作是通过流的方式。
IO流
所谓的IO就是指流的读(input输入)和写(output输出)操作的简称。
IO流用来处理设备之间的数据传输。
注意:Java用于操作流的对象都是IO包中。
IO流分类
根据数据流向不同分为:输入流和输出流
根据处理数据类型的不同:字节流和字符流
流向:
- 输入流 读取数据
- 输出流 写出数据
数据类型:
- 字节流
- 字节输入流 读取数据 InputStream
- 字节输出流 写出数据 OutputStream
- 字符流
- 字符输入流 读取数据 Reader
- 字符输出流 写出数据 Writer
InputStream/OutPutStream:字节流基类
FileInputStream/FileOutputStream:处理文件类型
ByteArrayInputStream/ByteArrayOutputStream:字节数组类型
DataInputStream/DataOutputStream:装饰类
BufferedInputStream/BufferedOutputStream:缓冲流
具体程序使用那种类型的流
如果操作的数据是文本数据,就用字符流。把你要操作的文件用windows自带的记事本打开,如果打开数据你是可以读懂的,就可以使用字符流。如果不能读懂,就用字节流。如果什么都分不清楚,就用字节流。
字节输入流操作步骤:FileInputStream
- 创建字节输入流对象
- 调用read()方法读取数据,并把数据显示在控制台
- 释放资源
FileInputStream fis = new FileInputStream("d://a.txt");
byte[] buffer = new byte[1024];
int x = fis.read(buffer,0,buffer.length);
String str = new String(buffer);
System.out.println(str);
System.out.println(x);
fis.close();
字节输出流操作步骤:FileOutputStream
- 创建字节输出流对象
- 写数据
- 释放资源(关闭此文件输出流并释放与此流有关的所有系统资源)
FileOutputStream fos = new FileOutputStream("fos.txt");
FileOutputStream创建字节输出流对象了做了三件事情:
1.用系统功能去创建文件
2.创建fos对象
3.把fos对象指向这个文件
fos.write("hello,IO".getBytes());
fos.close();
为什么一定要close()呢?
让流对象变成垃圾,这样就可以被垃圾回收器回收了。
通知系统去释放跟该文件相关的资源。
如何实现数据的换行?
不同的系统针对不同的换行符号识别是不一样的
windows:\r\n
linux:\n
Mac:\r
而一些常见的个高级记事本,是可以识别任意换行符号的。
如何实现数据的追加输出?
FileOutputStream(File file,boolean append);
加入异常处理的字节输出流操作
FileOutputStream fos = null;
try {
fos = new FileOutputStream("fos4.txt");
fos.write("java".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 如果fos不是null,才需要close()
if (fos != null) {
// 为了保证close()一定会执行,就放到这里了
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲区类(高效类)
以文件存取为例,为了减少对硬盘的存取,通常从文件中一次读入一定长度的数据,而写入时也是一次写入一定长度的数据,这可以增加文件存取的效率。
既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
读数据:BufferedInputStream
写数据:BufferedOutputStream
构造方法为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
复制文本文件
public static void copy(String srcString, String destString) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString));
byte[] bys = new byte[1024];
int len = 0;
bis.read(bys);
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
计算机是如何识别什么时候该把两个字节转换为一个中文呢?
在计算机中中文的存储分两个字节:
- 第一个字节肯定是负数。
- 第二个字节常见的是负数,可能有正数,但是没影响。
在计算机中英文的存储是正数。
下一篇: Java中的IO流