java IO流
参考链接:http://blog.csdn.net/MAGIC_JSS/article/details/51475923
java IO流
(一)含义
IO:Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输,上传文件和下载文件,Java用于操作流的对象都在IO包中。
(二)分类
(三)用法
3.1 字节文件操作流
FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
读取文件的两种方式
方式一:一次读取一个字节
// 读取f盘下该文件f://hell/test.txt //构造方法1 InputStream inputStream = new FileInputStream(new File("f://hello//test.txt")); int i = 0; //一次读取一个字节 while ((i = inputStream.read()) != -1) { // System.out.print(i + " ");// 65 66 67 68 //为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。 System.out.print((char) i + " ");// A B C D } //关闭IO流 inputStream.close();
方式二:一次读取一个字节数组
// 读取f盘下该文件f://hell/test.txt //构造方法2 InputStream inputStream2 = new FileInputStream("f://hello/test.txt"); // 字节数组 byte[] b = new byte[2]; int i2 = 0; // 一次读取一个字节数组 while ((i2 = inputStream2.read(b)) != -1) { System.out.print(new String(b, 0, i2) + " ");// AB CD } //关闭IO流 inputStream2.close();
注: 一次读取一个字节数组,提高了操作效率,IO流使用完毕一定要关闭。
FileOutputStream:字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。
将数据写入到文件
OutputStream outputStream = new FileOutputStream(new File("test.txt")); // 写入数据 outputStream.write("ABCD".getBytes()); // 关闭IO流 outputStream.close(); // 内容追加写入 OutputStream outputStream2 = new FileOutputStream("test.txt", true); // 输出换行符 outputStream2.write("\r\n".getBytes()); // 输出追加内容 outputStream2.write("hello".getBytes()); // 关闭IO流 outputStream2.close();
注:输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;输出换行符时一定要写\r\n不能只写\n,因为不同文本编辑器对换行符的识别存在差异性。
3.2 字节缓冲流(高效流)
BufferedInputStream:字节缓冲输入流,提高了读取效率。
InputStream in = new FileInputStream("test.txt"); // 字节缓存流 BufferedInputStream bis = new BufferedInputStream(in); byte[] bs = new byte[20]; int len = 0; while ((len = bis.read(bs)) != -1) { System.out.print(new String(bs, 0, len)); // ABCD // hello } // 关闭流 bis.close();
BufferedOutputStream:字节缓冲输出流,提高了写出效率。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true)); // 输出换行符 bos.write("\r\n".getBytes()); // 输出内容 bos.write("Hello Android".getBytes()); // 刷新此缓冲的输出流 bos.flush(); // 关闭流 bos.close();
3.3 高效流效率比对
测试:读取f盘下的一个视频文件到项目中:文件大小29.5 MB
方式一:
FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); int len; // 开始时间 long begin = System.currentTimeMillis(); // 一次读取一个字节 while ((len = inputStream.read()) != -1) { outputStream.write(len); } // 用时毫秒 System.out.println(System.currentTimeMillis() - begin);// 213195 //关闭流释放资源 inputStream.close(); outputStream.close();
方式二:
FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); int len; byte[] bs = new byte[1024]; // 开始时间 long begin = System.currentTimeMillis(); // 一次读取一个字节数组 while ((len = inputStream.read(bs)) != -1) { outputStream.write(bs, 0, len); } // 用时毫秒 System.out.println(System.currentTimeMillis() - begin);// 281 inputStream.close(); outputStream.close();
方式三:
InputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); BufferedInputStream bis = new BufferedInputStream(inputStream); OutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); BufferedOutputStream bos = new BufferedOutputStream(outputStream); int len; byte[] bs = new byte[1024]; // 开始时间 long begin = System.currentTimeMillis(); while ((len = bis.read(bs)) != -1) { bos.write(bs, 0, len); } // 用时毫秒 System.out.println(System.currentTimeMillis() - begin);// 78 bis.close(); bos.close();
注:由此可以看出高效缓冲流读写速度是非常快的,建议使用。
实战,请移步文章:servlet实现文件上传,预览,下载和删除
UpdateTime--2017年9月7日14:14:06
通用说明:
a.流的表现形式为int类型的数值,即字符对应的ASCII码,可以强转为单字符;
b.字节输入流InputStream是将文件转换成流,想要获取输入流中的数据需要调用read()方法;
FileInputStream fis = new FileInputStream(filePath);
如果文件不存在,会抛出异常
c.字节输出流OutputStream是将文件转换成流,想要往文件中输入内容,需将内容转换成byte数组,再调用write()方法;
FileOutputStream fis = new FileOutStream(filePath);
filePath可以为相对路径,也可以为绝对路径,推荐使用绝对路径;
输出的目的地文件不存在,则会自动创建,将文件转换成流,只能写入内容,需要调用write()方法,不能读取内容;
当创建文件输出流只传入一个文件路径参数时,形如:FileOutputStream fis = new FileOutStream(filePath);,调用fis.write(str.getBytes())时,原文件中的内容将会被覆盖掉;
不想被覆盖,只是追加内容,可以传入2个参数,形如:FileOutputStream fis = new FileOutStream(filePath, true);
输出换行符时一定要写\r\n不能只写\n,因为不同文本编辑器对换行符的识别存在差异性。
2018/11/28
当调用write()方法时,必须声明三个入参;
// 6.读取目标文件,通过response将目标文件写到客户端 // 读取文件 InputStream is = new FileInputStream(filePath); // 输入缓冲流 BufferedInputStream bis = new BufferedInputStream(is); // 输出文件 OutputStream os = response.getOutputStream(); // 输出缓冲流 BufferedOutputStream bos = new BufferedOutputStream(os); // 写文件 // 缓冲字节数 byte data[] = new byte[1024]; // 实际读取字节数 int n; while ((n = bis.read(data)) != -1) { bos.write(data,0,n); // 错误方式 // bos.write(n); } // 关闭流 bis.close(); // 清空输出缓冲流 bos.flush(); bos.close();
如果只声明一个入参,写入文件里的内容会错误!
// 写文件 // 缓冲字节数 byte data[] = new byte[1024]; // 实际读取字节数 int n; while ((n = bis.read(data)) != -1) { // 错误方式 bos.write(n); }
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/7484908.html