IO流学习

IO流

IO流用于处理设备之间的数据传输

Java对于数据的操作是通过流的方式

Java用于操作流的对象都在IO包中

流按操作的数据分为两种:字节流与字符流

流按流向分为:输入流和输出流

字符流的由来:字节流读取文字字节数据之后,不直接操作,而是先通过指定的编码表,获取对应的文字之后,再对该文字进行操作。

IO流常用基类

字节流的抽象基类:InputStream,OutputStream

字符流的抽象基类:Reader,Writer

上面四个类派生出来的子类的名称都是以父类名作为子类名的后缀

字符流

FileWriter

创建一个可以往文件中写入字符数据的字符输出流对象

实例化这个对象的时候,必须写明这个文件的地址+名称

如果文件不存在,就会创建一个文件

如果这个文件存在,就会覆盖这个文件(当然,创建对象的时候加入一个true参数,就是append,而不是覆盖)

void close()//关闭流,先刷新。  
void flush()//刷新流。  
void write(char[] cbuf, int off, int len)//写入字符数组的一部分  
void write(int c)//写一个字符  
void write(String str, int off, int len)//写一个字符串的一部分

注意:写入字符的时候,并不是直接写到文件当中,会首先写入一个字符缓冲区当中,当调用flush()方法的时候,才会将字符缓冲区的数据写入到文件当中

当然,在调用close()方法关闭流的时候,会先刷新一下再关闭

异常处理:
在try的外面创建流的引用对象
在try的里面获取
finally当中关闭流

FileReader

基本与FileWriter相同

使用的是父类Reader中的方法,调用一次读一个字符,读完之后会返回-1:

int ch = 0;
while((ch = fr.read()) != -1){
	System.out.println((char)ch);
}

使用read(char[])来读取字符数据:

int len = 0;
char[] buf = new char[3];
while((len = fr.read(buf)) != -1){
	System.out.println(new String(buf, 0, len));
}
字符流的缓冲区

缓冲区的出现提高了对数据的读写效率

BufferedWriter

将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。

提供了一个newLine()方法,它使用平台自己的系统属性line.separator定义的行分隔符概念。 并非所有平台都使用换行符(’\ n’)来终止行。 因此,调用此方法来终止每个输出行,因此优选直接写入换行符。

FileWriter fw = new FileWriter("asd");
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("asd");
bufw.flush();
bufw.close();

不需要关闭fw,因为在关闭缓冲区的时候,会将fw也给关闭

BufferedReader

从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

FileReader fr = new FileReader("asd");
BufferedReader bufr = new bufferedReader(fr);
String line = null;
while((line = bufr.readLine()) != null){
	System.out.println(line);
}
bufr.close();

LineNumberReader

缓冲字符输入流,跟踪行号。 该类定义方法setLineNumber(int)和getLineNumber()用于分别设置和获得当前行号

这个类是BufferedReader的子类

字节流

不仅可以操作字符,还可以操作其他媒体文件等

FileOutputStream

文件输出流是用于将数据写入到输出流File或一个FileDescriptor 。 文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileOutputStream (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败

他只能写二进制数据

FileOutputStream fos = new FileOutputStream("asd");
fos.write("asd".getBytes());
fos.close();
FileInputStream
FileInputStream fis = new FileInputStream("asd");
int ch = 0;//一次读取一个字节
while((ch = fis.read()) != -1){
	System.out.println((char) ch);
}
fis.close();



byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf)) != -1){
	System.out.println(new String(buf, 0, len));
}
fis.close();

当然,与字符流相同,字节流也可以使用BufferedInputStream和BufferedOutputStream

转换流

InputStreamReader

InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

OutputStreamWriter

OutputStreamWriter是从字符流到字节流的桥:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

需要指定编码的时候就在参数后面加上即可

流的操作规律

1.明确源和目的

源:InputStream Reader
目的:OutputStream Writer

2.明确数据是否是纯文本数据

源:
是:Reader
否:InputStream

目的:
是:Writer
否:InputStream

3.明确具体的设备

原设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket流

目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流

4.是否需要其他额外功能

如果需要高效,就加上缓冲区

File类

用来将文件或者文件夹封装成对象

方便对文件与未剪辑啊的属性信息进行操作

File对象可以作为参数传递给流的构造函数

File file = new File(“asd”);

常见功能:

1.获取

获取文件名称、路径、大小、修改时间

2.创建与删除

3.判断

4.重命名

过滤器

FilenameFilter

用于实现此接口的类的实例用于过滤文件名。 这些实例都用在过滤目录列表list类的方法File ,并通过抽象窗口工具包的文件对话框组件

boolean accept(File dir, String name)//测试指定文件是否应包含在文件列表中

Properties

该集合中的键和值都是字符串类型

集合中的数据可以保存到流中,或者从流中获取

通常该集合用于操作以键值对为形式存在的配置文件

线程安全

其他类

打印流:PrintWriter与PrintStream可以直接操作输入流和文件
为了保证输出的是原本的字符

序列流:SequenceInputStream对多个流进行合并

操作对象:ObjectInputStream与ObjectOutPutStream,被操作的对象需要时间Serializable接口

Serializable接口

SerializableL用于给被序列化的类加入ID号

用于判断类和对象是否是同一个版本

transient:非静态数据不详被序列化可以使用这个关键字来修饰

RandomAccessFile

随机访问文件,自身具备读写的方法

通过skipBytes(int x),seek(int x)连麦达到随机访问

1.该对象既能读,又能写

2.该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素

3.可以通过getFilePointer方法获取指针的位置,通过seek方法设置指针的文职

4.其实该对象就是将字节输入流和输出流进行了封装

5.该对象的源或者目的只能是文件

作用:对文件进行指定位置的读取和写入

管道流

PipedInputStream和PipedOutputstream

管道输入流应连接到管道输出流; 管道输入流然后提供写入管道输出流的任何数据字节。 典型地,数据被从一个读PipedInputStream对象由一个线程并且数据被写入到对应的PipedOutputStream通过一些其它线程。 不建议尝试从单个线程使用这两个对象,因为它可能会使线程死锁。 管道输入流包含一个缓冲区,在读取操作中将读取操作与限制内的操作相分离。 的管道被认为是broken如果正在提供的数据字节到连接的管道输出流中的线程不再存活

输入输出可以直接进行连接,通过结合线程来使用

操作基本数据类型的流对象

1.操作基本数据类型

DataInputStream与DataOutputStream

2.操作字节数组

ByteArrayinputStream与ByteArrayOutputStream

3.操作字符数组

CharArrayReader与CharArrayWrite

4.操作字符串

StringReader与StringWriter

编码表

自行了解吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值