概述
首先,InputStream和OutputStream是最基础的两个流接口。
InputStream:
abstract int read() 读取一个字节,返回读入的字节,在遇到流结尾时返回-1.
OutputStream:
abstract void write(int b) 写出一个字节。
上面两个接口的两个方法在执行的时候都会将当前线程阻塞,直到字节被读入或写出。不过在当前线程阻塞的时候可以让其他线程做事。
available是InputStream借口的方法,作用是检查当前可用读入的字节数量。
在使用流的使用应该注意使用完毕后调用close方法来关闭它,以释放珍贵的操作系统资源。而输出流在被关闭的时候,也会将输出流的缓存区给清空,并且将所有临时置于缓冲区中,以便用更大的包的形式传递的字符在关闭输出流时将被送出。如果不关闭文件,那么输出的缓存区将不会被送出。
虽然read和write方法是原生的但是我们操作的数据并不是字节所以我们需要扩展这些方法。
抽象类Reader和Writer类,用于处理Unicode文本,也是具有read和write方法,不过返回的不是字节,而是Uncoide码元(一个 0~65535的整数),这两个类的子类可以很好的处理文本数据的读写。
一些流可以从文件或者其他位置地方获取字节,另一些流则可以将字节变成有用的数据类型,这样一来可以将流嵌套来使用,达成更强大的功能。
下面来介绍一些流
FileInputStream:用于读取文件。
BufferedInputStream:带缓冲区的读入流。
PushbackInputStream:可回推流,可以预读数据,并且判断是否是所需要的。
ByteArrayInputStream:从内存中读数据。
FileOutputStream:用于文件的写入。
BufferedOutputStream:带缓冲区的写出流。
ByteArrayOutputStream:将数据输出到内存中。
其中,带缓冲区的流是比较好的,因为它会在内存中预置一块空间,存储数据,当数据到一定数量的时候,它才会一次性写出,这样如果是与外部设备交互的话,效率更好。
文本输入与输出:
在保存数据的时候,一个数字,例如:123,我们可以存成文本形式的123,也可以存储成二进制数据,存储为二进制数据可以更高效的利用,唯一的缺点是不容易看。所以选择哪个完全是视情况而定。
下面是文本操作的相关类:
PrintWriter:
FileWriter:
OutputStreamWriter:
BufferedWriter:
InputStreamReader:
BufferedReader:
在使用Writer和Reader子类的时候需要注意的时字节转成字符是需要字符编码的。
Charset:字符集类,采用IANA字符集注册中心标准化的字符集名字。
static SortedMap availableCharsets() 可以返回虚拟机所有可用的字符集SortedMap是一个映射表,键是字符集的名字,值是字符集。
static Charset forName(String name) 获取给定名字的字符集。
Set aliases() 返回这个字符集的别名集
ByteBuffer encode(String str) 将给定的字符串编码为字节序列
CharBuffer decode(ByteBuffer buffer) 解码给定的字节序列。无法识别的输入将被转换成Unicode的“替代字符”('uFFD')
ByteBuffer:字节缓存区
byte[] array() 返回这个缓冲区管理的字节数组
static ByteBuffer wrap(byte[] bytes)
static ByteBuffer wrap(byte[] bytes, int offset, int length)
返回管理给定的字节数组或给定字节数组的某个范围的字节缓存区
CharBuffer:字符缓冲区
char[] array() 返回这个缓冲区所管理的码元组
char charAt(int index) 返回给定索引处的码元
String toString() 返回由这个缓冲区所管理的码元构成的字符串
二进制数据读写
DataOutput和DataInput用于二进制与基本数据类型的转换
随机访问文件
RandomAccessFile:这个类同时能完成读写操作,读写操作都是实现DataOutput和DataInput来的,可以通过seek来跳到指定的位置。
RandomAccessFile(String file, String mode)
RandomAccessFile(File file, String mode)
参数:
file 打开的文件
mode "r"表示只读 "rw"表示读写模式 "rws"表示每次更新都对数据和元数据的写磁盘操作进行同步的读写模式 rwd表示每次更新时,支队数据的写磁盘操作进行同步的读写模式。
long getFilePointer()
返回文件指针当前位置
void seek(long pos)
将文件指针从文件的开始设置到pos个字节处
long length()
返回文件按照字节来度量的单位
ZIP文档读写
ZipInputStream
ZipEntry getNextEntry()
为下一项返回ZipEntry对象,在没有其他项的时候返回null
void closeEntry()
关闭这个zip文件中打开的项。之后可以通过使用getNextEntry()读入下一项。
ZipOutputStream
void putNextEntry(ZipEntry ze)
将给定的ZipEntry中的信息写出到六中,并定位用于写出数据的流,然后这些数据可以通过write()写出到这个流中。
void closeEntry()
关闭这个ZIP文件中当前打开的项。使用putNextEntry方法可以开始下一项。
void setLevel(int level)
设置后续的各个DEFLATED项的默认压缩级别。这里默认值是Deflater.DEFAULT_COMPRESSION。如果级别无效,则抛出IllegalArgumentException。
参数:
level 压缩级别。从0(NO_COMPRESSION)到9(BEST_COMPRESSION)
void setMethod(int method)
与ZIP相关的另外两个类,ZipFile,ZipEntry。
对象流与序列化
至于这个,感觉只需要了解类需要实现Serializable接口,使用ObjectInputStream和ObjectOutputStream来进行对象的读写。 还有序列化类的版本。在克隆中使用可以实现深拷贝。
文件管理
File对象代表了一个文件或者文件夹。只需要使用File类中的方法就可以实现文件的基本操作。在使用File对象来迭代文件夹下的文件时,有时需要过滤方法,这时可以在调用list方法时传递一个FilenameFilter类型的的参数,FilenameFilter是一个接口,用于匹配文件的。
转载于:https://blog.51cto.com/hmdebk/1354707
最后
以上就是欢喜红酒为你收集整理的IO流与文件的小总结的全部内容,希望文章能够帮你解决IO流与文件的小总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复