对流的理解:
流是输入设备与输出设备之间数据序列的传输,二进制数据。
分类:
按流向分:
输入流:程序可以从中读取数据的流。
输出流:程序能向其中写入的流
- 输入流,字节流:
InputStream:是所有输入流,字节流的超类;
流使用的基本思路:
1.构建路径
如果不存在则会出现异常
String name = "d:" + File.separator + "b" + File.separator + "b.txt";
2.获取流对象
流会自动(内部创建File对象)
利用构造方法创建流对象,但是基础都是是File对象
new FileInputStream(String name);
InputStream in=new FileInputStream(name);
也可以是 new FileInputStream(File file);
String name = "d:" + File.separator + "b" + File.separator + "b.txt";
File file=new File(name);
InputStream in1=new FileInputStream(file);
3.读写操作,读数据
方法:read() ;
read(byte[] b);
read()方法是一个字节一个字节的读,从输入流中读取一个数据,当下一个数据字节达到流的末尾时则会返回-1,因此可以利用它来作为while语句的条件,然后来读取整个文件
String name = "d:" + File.separator + "b" + File.separator + "b.txt";
InputStream in = new FileInputStream(name);
int b;
while ((b = in.read()) != -1) {
System.out.println((char) b);
}
in.close();
而read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中直至文件末尾.当读到文件末尾,文件中没有完全数据字节时,该方法会返回-1.。如果没完,则不是-1.会返回读取的有效数字,数据存放在缓冲数组bytep[] b 中,然后再去操作这个数组。当然byte数组的长度可以随便定,但是read(byte[] b)方法会一次读b.length个,如果数组长度小于文件个数则会分批次读取,当数组满了,还没有读取完文件,read会将剩下的字节覆盖存在缓冲区。所以在对数组(缓冲区)的数组来操作时注意抽取新更新的那一部分。
String name = "d:" + File.separator + "b" + File.separator + "b.txt";
InputStream in = new FileInputStream(name);
byte[] b = new byte[5];
int num;
while ((num = in.read(b)) != -1) {// 每读取读取一次数据,数据读到Byte数组中
// num判断是否读取完毕条件以及每次读取字节数
System.out.println("每次读取字节:" + num);
String str = new String(b, 0, num);
//利用String 中构造方法,在对数组(缓冲区)的数组来操作时注意抽取新更新的那一部分。
System.out.println("读取数据:" + str);
}
// 关闭资源
in.close();
System.out.println("操作完毕");
两个方法后者效率高因为利用了缓冲方法
4.关闭资源
关闭资源是为了释放内存是必然步骤
in.close();
-
输出流 字节流
输出流对应的是写操作,从程序中向目标文件写入数据
基本思路与输入流一致:// 1.构建路径 String name = "d:" + File.separator + "a" + File.separator + "b.txt"; // 2.获取流对象 OutputStream out = new FileOutputStream(name, true);// 默认指向文件头部,出现清除效果 // 3.读写操作,读数据 String str = "hello大家world"; // out.write(256);// int 但是 单位 是 字节 out.write(str.getBytes()); // 4.关闭资源 // out.close();
注意OutputStream是所有输出字节流的超类,有bug,只要每new一次他就会从文件头部开始写,因此为了避免清除效果,可以使用两个参数的构造方法 OutputStream out = new FileOutputStream(name, true),另外write(int),参数类型为int,但每次写入数据时为一个字节。因此int数据不能超出字节范围,否则会失真。
利用输入输出流可以对文件进行拷贝:
// 文件拷贝
// 构建路径
String src = "d:" + File.separator + "a" + File.separator + "a.txt";
String dest = "d:" + File.separator + "b" + File.separator + "b.txt";
InputStream in = null;
OutputStream out = null;
try {
// 获取流对象
in = new FileInputStream(src);
out = new FileOutputStream(dest, true);
// 读写操作
byte[] b = new byte[7];
int num;
while ((num = in.read(b)) != -1) {
out.write(b, 0, num);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
异常最好利用Trycatch语句来执行,当然要合理利用Throwl来终止程序,其次遵循关闭原则,先开的后关
按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
按功能来分
节点流: 用于直接操作目标设备的流
处理流: 是对一个已存在的流的链接和封装,通过对数据 进行处理为程序提供功能强大、灵活的读写功能。
**.**怎样区分节点流和处理流,处理流是以字节流为基础的。
BufferedInputStream bufferedIn = new BufferedInputStream(in);其实与节点流的区别不大但是因为他是基于数组缓存。所以效率高
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
public static void main(String[] args) throws IOException {
test1();
System.out.println("操作完毕");
}
public static void test1() throws IOException {
String src = "d:" + File.separator + "a" + File.separator + "b.txt";
String dest = "d:" + File.separator + "a" + File.separator + "c.txt";
// 节点(低级流)
InputStream in = new FileInputStream(src);
// 装饰者模式
// 处理(高级流,缓冲流)
BufferedInputStream bufferedIn = new BufferedInputStream(in);
// 取数据,从数组中获取,和从磁盘中获取?
// 取数据,从内存中,从硬盘中?
// int num = bufferedIn.read();
// System.out.println((char) num);
OutputStream out = new FileOutputStream(dest);
BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
byte[] b = new byte[1024];
int num;
while ((num = bufferedIn.read(b)) != -1) {
bufferedOut.write(b, 0, num);
// bufferedOut.flush();
}
bufferedOut.close();// flush
bufferedIn.close();// close
}
关闭资源时注意只关处理流不关节点流
因为在处理流的close()里就包含了对节点流的关闭操作
未完待续。。。
处理流与节点流的区别?
处理流和节点流区别,以及如何区分?字节流和字节流区别?