JAVA I/0流学习(二)
1.BufferedInputStream与BufferedOutputStream类
BufferedInputStream类可以对所有InputStream类进行带缓存区的包装以达到性能的优化。
BufferedInputStream类有两个构造方法:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
第一种形式的构造方法创建了一个带有32个字节的缓存流;第二种形式的构造方法按指定的大小来创建缓存区。一个最优的缓存区的大小,取决于它所在的操作系统、可用的内存空间以及机器配置。从构造方法可以看出,BufferedInputStream对象位于InputStream类对象之前。
BufferedOutputStream的构造方法和BufferedInputSream类似
注意:flush()方法就是用于即使在缓存区没有满的情况下,也将缓存区的内容强制写入外设。习惯上称这个过程为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效。当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。
2.BufferedReader与BufferedWriter类
BufferedReader类与BufferedWriter类分别继承Reader类和Writer类。这两个类同样具有内部缓存机制,并可以以行为单位进行输入/输出。
BufferedReader常用的方法如下:
int read() 读取单个字符。
int read(char[] cbuf,int off,int len) 将字符读入到数组的某一部分。返回读取的字符数。达到尾部 ,返回-1。
String readLine() 读取一个文本行。
void close() 关闭该流。并释放与该流相关的所有资源。
BufferedWriter常用方法如下:
void write(char ch) 写入单个字符。
void write(char []cbuf,int off,int len) 写入字符数据的某一部分。
void write(String s,int off,int len) 写入字符串的某一部分。
void newLine() 写入一个行分隔符。
void flush() 刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close() 关闭此流,再关闭前会先刷新它。
import java.io.*;public class BufferReader_and_BufferWriter {public static void main(String[] args) {String content[]={"你站在桥上看风景", "看风景的人在楼上看你", "明月装饰了你的窗子", "你装饰了别人的梦" };File file=new File("C:\\Users\\liuyue\\Desktop\\test.txt");try {FileWriter fileWriter=new FileWriter(file);BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);for (int i=0;i<content.length;i++){bufferedWriter.write(content[i]);bufferedWriter.newLine();}bufferedWriter.flush();bufferedWriter.close();fileWriter.close();}catch (Exception e){System.out.println(e);}try {FileReader fileReader=new FileReader(file);BufferedReader bufferedReader=new BufferedReader(fileReader);String s=null;int i=0;while ((s=bufferedReader.readLine())!=null){i++;System.out.println("第"+i+"行:"+s);}bufferedReader.close();fileReader.close();}catch (Exception e){System.out.println(e);}
}}
3.DataInputSteam和DataOutputStream类
DataInputStream和DataOutputStream类允许应用程序以机器无光的方式从底层输入流中读取基本java数据类型。也就是说,当读取一个数据时,不必再关心这个数值应当是哪种字节。
两者的构造方法也大同小异:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
DataInputStream的主要方法有:
int read(byte[] b) 从输入流中读取一定的字节,存放到缓冲数组b中。返回缓冲区中的总字节数。
int read(byte[] buf,int off,int len) 从输入流中一次读入len个字节存放在字节数组中的偏移off个字节及后面位置。
String readUTF() 读入一个已使用UTF-8修改版格式编码的字符串
String readLine() 读入一行
boolean readBoolean 读取一个boolbean类型的值
int readInt() 读取一个int类型的值
byte readByte() 读取一个byte类型的值
char readChar() 读取一个char类型的值
DataOutputStream的方法主要有:
void write(byte[] b,int off,int len) 将byte数组off角标开始的len个字节写到OutputStream 输出流对象中。
void write(int b) 将指定字节的最低8位写入基础输出流。
void writeBoolean(boolean b) 将一个boolean值以1-byte形式写入基本输出流。
void writeByte(int v) 将一个byte值以1-byte值形式写入到基本输出流中。
void writeBytes(String s) 将字符串按字节顺序写入到基本输出流中。
void writeChar(int v) 将一个char值以2-byte形式写入到基本输出流中。先写入高字节。
void writeInt(int v) 将一个int值以4-byte值形式写入到输出流中先写高字节。
void writeUTF(String str) 以机器无关的的方式用UTF-8修改版将一个字符串写到基本输出流。该方法先用writeShort写入两个字节表示后面的字节数。
int size() 返回written的当前值。
在这里我写了一段程序来了解每个方法,在读取中文字符时需要小心一些避免出现乱码。
在使用循环读取的时候,当读到最后会抛出EOFException错误来提示你读完了。我注释的地方智能一部分一部分的解开,不然会发成错误,因为前面的方法把东西读完了后面的方法就无法读取到东西了
import java.io.*;public class DataInputStream_and_DataOutputStream {public static void main(String[] args) {try {FileOutputStream fileOutputStream=new FileOutputStream("C:\\Users\\liuyue\\Desktop\\test.txt");DataOutputStream dataOutputStream=new DataOutputStream(fileOutputStream);dataOutputStream.writeUTF("使用writeUTF()方法写入数据");dataOutputStream.writeChars("使用writeChars()方法写入数据");dataOutputStream.writeBytes("使用writeBytes()方法写入数据");dataOutputStream.writeBoolean(true);dataOutputStream.writeInt(666);dataOutputStream.write("使用write()方法写入数据".getBytes());dataOutputStream.close();fileOutputStream.close();FileInputStream fileInputStream=new FileInputStream("C:\\Users\\liuyue\\Desktop\\test.txt");DataInputStream dataInputStream=new DataInputStream(fileInputStream);// System.out.println(dataInputStream.readUTF());// char[] chars=new char[1024];
// char c;
// int i=0;
// try {
// while ((c=dataInputStream.readChar())!=-1) {
// chars[i]=c;
// i++;
// }
// }catch (EOFException e){
// System.out.println("读完了!");
// }
// String string=new String(chars);
// System.out.println(string);// byte[] bytes=new byte[1024];
// byte b;
// int i=0;
// try {
// while ((b=dataInputStream.readByte())!=-1){
// bytes[i]=b;
// i++;
// }
// }catch (EOFException e){
// System.out.println("读完了!");
// }
// String s=new String(bytes);
// System.out.println(s);// byte[] bytes=new byte[1024];
// int len=0;
// try {
// len =dataInputStream.read(bytes);
// }catch (EOFException e){
// System.out.println("读完了");
// }
// System.out.println(new String(bytes,0,len));dataInputStream.close();fileInputStream.close();}catch (Exception e){System.out.println(e);}}
}
4.ZipInputStream和ZipOutputStream类
JAVA实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易。ZipEntry类产生的对象是用来代表一个ZIP文件内的进入点。ZipInputStream类用来读去ZIP压缩格式的文件,所支持的包括已压缩及未压缩的进入点。ZipOutputStream类用来写出ZIP压缩格式的文件,而且所支持的包括已压缩及未压缩的进入点。
ZipOutputStream(OutputStream out)
常用方法有:
void putNexEntry(ZipEntry e) 开始写一个新的ZipEntry,并将流内的位置移至此entry所指数数据的开头
void write(byte[] b,int off,int len) 将字节数组写入当前ZIP条目数据
void finish() 完成写入ZIP输出流的内容,无需关闭它所配合的OutputStream
void setComment(String comment) 可设置此ZIP文件的注释文字
在写这个程序时,我碰到了一个坑,就是重复压缩长路径,压缩出来的文件是这样的:
后来写了一个方法改变压缩的路径名才得以解决:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipOutputStream_test {private void zip(String zipFileName, File inputFile) throws Exception{ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(zipFileName));zip(zipOutputStream,inputFile,"");zipOutputStream.flush();zipOutputStream.close();}private void zip(ZipOutputStream zipOutputStream, File inputFile, String base) throws Exception {if (inputFile.isDirectory()){File[] files=inputFile.listFiles();if (base.length()!=0){zipOutputStream.putNextEntry(new ZipEntry(base+"/"));}for (int i=0;i<files.length;i++){zip(zipOutputStream,files[i],base+getLocation(""+files[i]));}}else {zipOutputStream.putNextEntry(new ZipEntry(base));FileInputStream inputStream=new FileInputStream(inputFile);int b;System.out.println(base);while ((b=inputStream.read())!=-1){zipOutputStream.write(b);}inputStream.close();}}private String getLocation(String s){String[] stringList=s.replace("\\","/").split("/");int len=stringList.length;String string="\\"+stringList[len-1];return string;}public static void main(String[] args) {ZipOutputStream_test zipOutputStreamStreamTest=new ZipOutputStream_test();try {long oldTime=System.currentTimeMillis();zipOutputStreamStreamTest.zip("C:\\Users\\liuyue\\Desktop\\test.zip",new File("C:\\Users\\liuyue\\Desktop\\longfei"));long currentTime=System.currentTimeMillis();float time=(float)(currentTime-oldTime)/1000;System.out.println("压缩完成,耗时"+time+"s");}catch (Exception e){System.out.println(e);}}
}
从这端程序可以看出,每一个ZIP文件中可能包含多个文件,使用ZipOutputStream类将文件写入目标ZIP时,必须先使用ZipOutputStream对象的putNexEntry()方法,写入个别文件的entry,将流内目标制定的位置移到该rntry所指的开头位置。
说完了压缩再来说解压缩,解压缩就简单了
ZipInputStream(InputStream in)
常用方法:
int read(byte[] b,int off,int len) 读取目标b数组内off偏移量的位置,长度是N的字节
int available() 判断是否已读完目前entry所指定的数据。已读完返回0,否则返回1
void closeEntry() 关闭当前ZIP条目并定位流以读取下一个目录
long skip(long n) 跳过当前ZIP条目中指定的字节数
ZipEntry getNexEntry() 读取下一个ZipEntry,并将流内的位置移至该entry所指数据的开头
ZipEntry createZipEntry(String name) 以指定的name参数新建一个ZipEntry对象
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;public class ZipInputStream_test {public static void main(String[] args) {File file=new File("C:\\Users\\liuyue\\Desktop\\test.zip");ZipInputStream zipInputStream;try {ZipFile zipFile=new ZipFile(file);zipInputStream=new ZipInputStream(new FileInputStream(file));ZipEntry zipEntry=zipInputStream.getNextEntry();while (((zipEntry=zipInputStream.getNextEntry())!=null)&&!zipEntry.isDirectory()){File tmp=new File("C:\\Users\\liuyue\\Desktop\\"+zipEntry.getName());if (!tmp.exists()){tmp.getParentFile().mkdir();OutputStream outputStream=new FileOutputStream(tmp);InputStream inputStream=zipFile.getInputStream(zipEntry);int count=0;while ((count=inputStream.read())!=-1){outputStream.write(count);}outputStream.close();inputStream.close();}zipInputStream.closeEntry();System.out.println(zipEntry.getName()+"解压成功");}zipInputStream.close();}catch (Exception e){System.out.println(e);}}
}
JAVA I/0流学习(二)相关推荐
- JAVA I/0 流学习(一)
java I/0流属于java基础知识,是每个java学习者必须要掌握的知识点,尤其是在学习网络编程时尤为重要. 在变量.数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失,为了能够永久地保存 ...
- 海康威视摄像机Java SDK拉流(二)开启关闭实时预览
上一篇:海康威视Java SDK拉流(一)初始化SDK 本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络S ...
- Java之IO流学习总结【上】
一.什么是流? 流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件.内存.IO设备等数据的流向. ...
- Java I/O流(二)——File,Properties,PrintWriter,IO ,RandomAccessFile,ByteBuffer,nio
File概述 文件的操作是非常重要的,我们先来看下他的基本概念 •用于将文件或者文件夹封装成对象 •方便对文件和文件夹的操作 •File对象可以作为参数传递给流的构造函数 我们写个小例子先 impor ...
- java 指针_java多线程学习二十二:::java中的指针
在上面那个图,我们看到一个特殊的变量unsafe,它的包名是 sun.misc.Unsafe;从名字看,这个类应该是封装一些不安全的操作,为什么不安全?对c语言理解的朋友就知道了,指针是不安全的,在j ...
- java打印系统参数_Java学习(二十):获取系统参数
public static void main(String[] args) { Properties props = System.getProperties(); // 系统属性 System.o ...
- 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)
马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 回忆一遥远 于 2017-8-16 07:35 编辑 Class 文件格式 Java 编 ...
- Java入门——IO流
一.File类的使用 1.1 File类的实例化 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但File 不能访问文件内容本身. ...
- # Java基础——IO流
Java基础--IO流 File类的使用(熟悉构造器和方法的使用) File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) File类的声明在java.io包下 文件和文件目录路径的抽象表示 ...
最新文章
- 打造属于自己的underscore系列 ( 一 )
- 干货 | 45张图庖丁解牛18种Queue,你知道几种?
- 自己的mongodb的CRUD封装
- 关于阻塞I/O 非阻塞I/O 同步I/O 异步I/O epoll select的学习
- 将本珊计算机组成原理,计算机组成原理,懂的老师帮忙解答下
- 0502团队项目 SCRUM团队成立
- java shiro登录实例_Shiro安全框架入门篇(登录验证实例详解与源码)
- Spring FactoryBean的开发1
- OpenFlow和SDN的历史和原理介绍
- 《MySQL——主备一致性六问六答》
- 网站服务器建设方法,如何在服务器上建立站点的方法步骤
- 猜数游戏 (10 分)
- Error:No-bean-named-springSecurityFilterChain-available
- 全球唯一标识符 System.Guid.NewGuid().ToString()
- UISlider 设置增量
- 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间
- 通过Jersey客户端API调用REST风格的Web服务
- android10下载更新功能,Android 10部分新功能曝光 感觉越来越暗黑
- 因子分析模型 - 因子分析法原理与代码实现 -(Python,R)
- Android模拟器检测体系梳理,kotlin入门
热门文章
- 多声道、高压、澎湃的影院音效——AC3
- 全球与中国电梯导靴市场现状及未来发展趋势(2022)
- layui的tree如何实现动态加载_layui tree组件如何异步加载数据,动态添加树节点...
- 网络工程师必备基础(一)
- android camera 闪光灯关闭,Android控制闪光灯的方法(打开与关闭)
- SpringCloudAlibaba 六、Sentinel 服务保护 ( 服务降级/ 熔断/ 数据持久化 / gateway 整合 Sentinel )
- sql索引--Index
- sona: Spark on Angel部署教程
- 老友记第一季23集背诵句
- android处理蓝牙数据,Android接受蓝牙数据