java基础之I/O流

流是我们程序与磁盘或内存交互的重要方式,我们可以通过流来进行读或写。首先我们可以根据读写的单位来对流进行分类,一是以字节为单位进行读写的字节流,二是以字符为单位进行读写的字符流。
I/O流文件层次

1 字节流

1.1 InputStream

InputStream是所有字节输入流的父类。基本的读取方法是:
-int read() 读取一个字节
-int read(byte[] d)尝试最多读取给定的length个字节并存入该数组,返回值为实际读取到的字节量。

1.1.1 FileInputStream

FileInputStream是文件的字节输入流,我们使用该流可以以字节为单位从文件中读取数据。它有两个常用的构造方法,即
-FileInputStream(File file)
创建一个从指定File对象表示的文件中读取数据的文件输入流。
-FileInputStream(String name)
创建用于读取指定文件系统中的路径名name所指定的文件的文件输入流。

1.1.2 BufferedInputStream

BufferedInputStream是缓冲字节输入流,内部维护着一个缓冲区(字节数组)这样就减少了读取次数,从而提高了读取效率。
public void testBis throws IOException{
FileInputStream fis=new FileInputStream("fis.txt");//用于读取数据
BufferedInputStream bis=new BufferedInputStream(fis);
byte[] bytes=new byte[1024*10];
int d=-1;
while((d=bis.read(bytes))!=-1){//批量读取
}
bis.close();
}

1.1.3 ObjectInputStream

ObjectInputStream是对对象进行反序列化的输入流。实现对象反序列化的方法为
-Object readObject()
该方法可以从流中读取字节并转换为相应对象

1.2 OutputStream

OnputStream是所有字节输出流的父类。
基本的写出方法为
-void write(int d) 写出一个字节
-void write(byte[] d) 将给定字节数组中的字节全部写出

1.2.1 FileOutputStream

FileOutputStream是文件的字节输出流,我们使用该流可以以字节为单位将数据写入文件。常用的构造方法
-FileOutputStream(File file)
创建向指定File对象表示的文件中写出数据的文件输出流。
-FileOutputStream(String fileName)
创建向具有指定名称的文件中写出数据的文件输出流。
若指定文件已经有内容,那么使用该流对其写入数据会将原数据全部清除。如果想要追加而不覆盖掉原内容则需要使用以下构造方法
FileOutputStream(File file,boolean append)
FileOutputStream(String fileName,boolean append)
若第二个参数append为true,那么通过该流写出的数据都是在文件末尾追加的。

1.2.2 BufferedOutputStream

BufferedInputStream是缓冲字节输出流,内部维护着一个缓冲区。每当我们向该流写数据时,都会先将数据存入缓冲区。当缓冲区已满时,缓冲流会将数据一次性写出。
public void testBos throws IOException{
FileOutputStream fos=new FileOutputStream("fos.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
//所有字节被存入缓冲区,等待一次性写出
bos.write("helloword".getBytes());
//关闭流之前,缓冲输出流会将缓冲区中内容一次写出
bos.close();
}

使用缓冲输出流可以提高写出效率但写出数据缺乏实时性,有时我们希望直接写出而不是等缓冲区满了才写出。这时可以通过下面这个方法来实现。
-void flush() 清空缓冲区,将缓冲区数据强制写出

1.2.3 ObjectOutputStream

对象是存在内存中的,有时候我们需要将对象保存在硬盘中,有时我们也需要将对象发送到另一台计算机上等等的操作。这时我们需要将对象转化为一个字节序列。而对象转为字节序列的过程就称为对象序列化。而字节序列转为对象的过程就称为对象反序列化的过程。
ObjectOutputStream是对对象进行序列化的输出流。实现对象序列化的方法为:
- void writeObject(Object o)
ObjectOutputStream在进行对象序列化时需要序列化的对象所属的类必须实现serializable接口。实现该接口并不需要重写任何方法。只是作为可序列化的标志。

2 字符流

字符流是以字符为单位读写数据的,其底层仍是字节流。

2.1 Reader

Reader是字符输入流的父类。常用方法有
- int read() 读取一个字节,返回的int值低十六位有效

2.1.1 InputStreamReader

InputStreamReader是字符输入流(转换流,能将字节流转为字符流)。其构造方法允许我们设置字符集。
-InputStreamReader(InputStream is,String charsetName)
示例代码:

public class TestReader {
public static void main(String[] args) throws IOException{
FileInputStream fis=new FileInputStream("fos.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
int d=-1;
while((d=isr.read())!=-1){
char c=(char) d;
System.out.print(c);
}
isr.close();
}
}

2.1.2 BufferedReader

BufferedReader是缓冲字符输入流, 其内部提供了缓冲区,可以提高读取效率。常用构造方法
-BufferedReader(Reader reader)
提供了一个可以读取一行字符串的方法
-String readLine() 可以读取一行字符串,直到读到换行符

2.2 Writer

Writer是字符输出流的父类。常用方法有
- void write(char[] chs)将给定字符数组中的所有字符写出
- void write(String str) 将给定的字符串写出

2.2.1 OutputStreamWriter

OutputStreamWriter是字节输出流。构造方法为
-OutputStreamWriter(OutputStream os,String charsetName)
示例代码:
public class TestWriter {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream(“fos.txt”);
OutputStreamWriter osw=new OutputStreamWriter(fos,”utf-8”);//使用指定字符集
osw.write(“你好”);
osw.close();
}
}

2.2.2 PrintWriter

PrintWriter是具有自动行刷新的缓冲字符输出流,提供了比较丰富的构造方法
-PrintWriter(File file)
-PrintWriter(String fileName)
-PrintWriter(OutputStream os,boolean autoFlush)
-PrintWriter(OutputStream os)
-PrintWriter(Writer writer,boolean autoFlush)
-PrintWriter(Writer writer)
其中布尔值的参数表示PrintWriter是否具有行刷新
PrintWriter提供了丰富的重载print与println方法,若PrintWriter是具有自动行刷新的,那么每当通过println写出的内容都会被实际写出而不是缓存。
示例代码:
public class TestPrintDemo2 {
public static void main(String[] args) throws IOException{
//向pw.txt文件中写入字节
FileOutputStream fos=new FileOutputStream(“pw.txt”);
//将字符按照指定编码集转化为字节
OutputStreamWriter osw=new OutputStreamWriter(fos,”utf-8”);
//提高写效率,可以以行为单位写出字符串
PrintWriter pw=new PrintWriter(osw,true);
/*
* 当printwriter带有自动行刷新时,
* 调用Println方法写出字符串会自动flush
*/
pw.println(“大家好”);
pw.println(“才是真的好”);
pw.println(“广州好迪”);
pw.close();
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值