Java学习笔记-IO

IO流学习总结

IO流其实都是四个抽象类衍生出来的。
1.字节输入流:InputStream
2.字节输出流:OutputStream
3.字符输入流:Reader
4.字符输出流:Writer
以Stream结尾的都是字节流,以Writer或是Reader结尾的是字符流。
(图片,视频等二进制文件只能用字节流读写)。能用字符流的一定能用字节流,而能用字节流的不一定能用字符流。

字符流FileWriter和FileReader

创建方式:
FileReader a = new FileReader(file file);
FileReader a = new FileReader(String filename);
FileWriter a = new FileWriter(file file);
FileWriter a = new FileWriter(String filename);
这两个的方法主要是读一个字符或是一个字符数组

FileReader fr=new FileReader("C:\\Test\\copyfrom.txt");
 FileWriter fw=new FileWriter("C:\\Test\\copyto.txt");//创建两个对象
 //方法1:读单个字符
 			int ch;
         while((ch=fr.read())!=-1) {//读数据
             fw.write(ch);//写数据
         }
         fw.flush();
 //方法2:读字符数组
  char chs[]=new char[1024];
35         int len=0;
36         while((len=fr.read(chs))!=-1) {//读数据
37             fw.write(chs,0,len);//写数据
38         }
39         fw.flush();

字符缓冲流BufferedWriter和BufferedReader

缓冲区的工作原理:
1、使用了底层流对象从具体设备上获取数据,并将数据存储到缓冲区的数组内。
2、通过缓冲区的read()方法从缓冲区获取具体的字符数据,这样就提高了效率。
3、如果用read方法读取字符数据,并存储到另一个容器中,直到读取到了换行符时,将另一个容器临时存储的数据转成字符串返回,就形成了readLine()功能。

创建对象
BufferedReader br=new BufferedReader(new FileReader(“C:\Test\copyfrom.txt”));
BufferedWriter bw=new BufferedWriter(new FileWriter(“C:\Test\copyto.txt”));
一般使用方法:

        BufferedReader reader = new BufferedReader(new FileReader("src/c.txt"));
        BufferedWriter writer = new BufferedWriter(new FileWriter("src/a.txt"));
        String s = null;
        while((s = reader.readLine()) != null){
            System.out.println(s);
            writer.write(s);
            writer.newLine();
            writer.flush();
        }

要注意的是缓冲流必须经过刷新才能得到结果

字节流FileInputStream和FileOutputStream

创建对象:
与FileReader和FileWriter相似
FileInputStream a= new FileInputStream (file file);
FileInputStream a = new FileInputStream (String filename);
FileOutputSteam a = new FileOutputSteam (file file);
FileOutputSteam a = new FileOutputSteam (String filename);
用法也和字符流基本相同


         FileInputStream fin=new FileInputStream("C:\\Users\\Administrator\\Desktop\\Img.jpg");
         FileOutputStream fout=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\ImgCopy.jpg");
         int len=0;
         byte[] buff=new byte[1024];
         while((len=fin.read(buff))!=-1) {
             fout.write(buff, 0, len);
         }
         fin.close();
         fout.close();

字节缓冲流BufferedInputStream和BufferedOutputStream

创建对象
BufferedInputStream a = new BufferedInputStream(new FileInputStream(“src/c.txt”));
BufferedOutputStream b = new BufferedOutputStream(new FileOutputStream(“src/a.txt”));

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。
普通使用与FileInputStream和FileOutputStream相同

 BufferedInputStream bfin=new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\Img.jpg"));
         BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\ImgCopybuff.jpg"));
         int len=0;
         byte[] buff=new byte[1024];
         while((len=bfin.read(buff))!=-1) {
             bfout.write(buff, 0, len);
         }
         bfin.close();
         bfout.close();

缓冲字节流的特点就在于mark()和reset()这两个方法
mark可以跳转到要读的字节的位置,而reset可以跳回到mark的位置,不过用的不多。

转换流:InputStreamReader和OutputStreamWriter

主要用来进行字符与字节的转换
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));//重要
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); 重要

打印流PrintWriter和PrintStream

创建对象:
PrintWriter pw = new PrintWriter(new FileWriter(“src/c.txt”),true);

(1)向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。不能输出字节,但是可以输出其他任意类型。

(2)与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

(3)此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。

    pw.write("测试打印流");
             pw.println("此句之后换行");
             pw.println("特有功能:自动换行和自动刷新");
             pw.println("利用构造器设置自动刷新");
            pw.close();

PrintStream
没发现有什么用
A PrintStream为另一个输出流添加了功能,即能够方便地打印各种数据值的表示。 还提供了另外两个功能。 与其他输出流不同, PrintStream从不抛出IOException ; 相反,异常情况只是设置一个可以通过checkError方法测试的内部标志。 可以选择一个PrintStream ,以便自动刷新; 这意味着flush字节数组写入方法后自动调用,所述一个println方法被调用时,或者一个新行字符或字节( ‘\n’ )被写入。
由印刷的所有字符PrintStream被转换成使用平台的默认字符编码字节。 在需要编写字符而不是字节的情况下,应使用PrintWriter类。

对象操作流ObjectInputStream和ObjectOutputStream

特点如名字可以创建和读取对象
*注意:如果Student没有序列化,会抛出java.io.NotSerializableException
*Serializable:序列号,是一个标识接口,只起标识作用,没有方法
*当一个类的对象需要IO流进行读写的时候,这个类必须实现接口

//写对象
public static void writeObject() throws FileNotFoundException, IOException {
         //创建对象输出流的对象
         FileOutputStream fos=new FileOutputStream("a.txt");
         ObjectOutputStream oos=new ObjectOutputStream(fos);
         //创建学生对象
         Student s1=new Student("张三",20);
         Student s2=new Student("李四",30);
         Student s3=new Student("王五",10);    
         //写出学生对象
         oos.writeObject(s1);
         oos.writeObject(s2);
         oos.writeObject(s3);
         //释放资源
     }
 }


//读取
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
         //读取对象
         try {
             while(true){
                Object obj=ois.readObject();
                 System.out.println(obj);
             }
         }catch(EOFException e){
             System.out.println("读到了文件末尾");
         }
         
         //释放资源
         ois.close();

随机读写文件流RandomAccessFile

该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。

在这个类中的所有读取例程通常都是如果在读取所需的字节数之前到达文件结尾,则抛出一个EOFException (这是一种IOException )。 如果任何字节由于除文件末尾之外的任何原因而无法读取,则抛出IOException以外的EOFException 。 特别地,如果流已经被关闭,则可以抛出IOException 。

创建对象
RandomeAccessFile a = new RandomAccessFile(“filename”,“rw”);
rw表示可读写 r是只读 w是只写
有各种读和写的方法,可以去看API
特点就是可以用seek()方法来改变开始读的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值