12章(三)Java流与文件操作

 

一、字节流

1、字节输入流InputStream类

InputStream类是所有面向字节的输入流的父类,为java.io包中的抽象类。

Public abstract class InputStream extends Object

2、InputStream类中声明了用于字节流输入的多个方法

read() 从流中讲稿数据

skip() 跳过流中若干字节数

available() 返回流中可用字节数

mark() 在流中标记一个位置

reset() 返回标记过的位置

markSupport() 是否支持标记和复位操作

close() 关闭流

3、字节输出流OutputStream类

    OutputStream类为所有面向字节的输出流的父类,为JAVA.io的抽象类。

    Public abstract class OuputStream extends Object

4、OutputStream类中声明了用于字节流输出的多个方法

    write(int b) 将一个整数输出到流中

    write(byte[] b) 将数组中的数据输出到流中

write(byte[] b,int off,int len) 将数组b中从off指定的位置开始len长度的数据输出到流中。

flush() 将缓冲区中的数据强制送出。

close() 关闭流

二、文件字节输入/输出流类FileInputStream/FileOutputStream

    InputStream类和OutputStream类者是抽象类,文件数据流类FileInputStream和FileOutputStream是用于进行文件输入/输出处理的字节流类,其数据对象是文件。

1、  文件字节输入流类FileInputStream

FileInputStream用于顺序访问本地文件。

(1)       构造方法

Public FileInputStream(String name) throws FileNotFoundException

Public FileInputStream(File file) throws FileNotFoundException

注:name为文件名,file为文件类File的对象,即可以以文件名或File对象构造文件输入流对象。

    (2)读取字节的方法

        Public int read() 从输入流中读取一字节数据,返回下一字节数据,如果已达到文件末尾,则返回-1

        Public int read(byte[] b) 从输入流中将最多b.length字节的数据读入一个byte数组中,返回读入缓冲区的字节总数,如果已经到达文件末尾而没有更多的数据,返回-1

        Public int read(byte[] b,int off,int len) 从输入流中读取最多len个字节,存入字节数组b中(从off位置开始起),返回实际读入的字节数。

(2)       关闭输入流

close() 方法关闭流,并释放相关的系统资源。

三、Java的标准数据流

1、标准输入System.in

    System.in作为字节输入流类InputStream的对象,实现标准的输入,使用其read()方法从键盘接收数据。

2、  标准输出System.out

System.out是打印流类PrintStream的对象,用来实现标准输出。

3、  标准的错误输出System.err

System.err与System.out相同,以PrintStream类的对象err实现标准的错误输出。

四、例子

字节流可以操作任何数据

字符流使用的是字符数组;字节流使用的是字节数组

1、FileInputStream和FileOutputStream的使用。

FileOutputStream fos = new FileOutputStream("a.txt");

fos.write(12);//直接将数据写入到了目的地。

fos.close();//只关闭资源。

FileInputStream fis = new FileInputStream("a.txt");

//fis.available();//获取关联的文件的字节数。

//如果文件体积不是很大,可以这样操作。

byte[] buf = new byte[fis.available()];//创建一个刚刚好的缓冲区。但是这有一个弊端,就是文件过大,大小超出jvm的内容空间时,会内存溢出。

fis.read(buf);

System.out.println(new String(buf));

2、编写程序copy一个图片。

package com.hbsi.io;

import java.io.*;

public class CopyImageDemo {

    public static void main(String[] args){

       //复制---从源文件中读取数据,写入到目标文件

       //输入流---FileInputStream  BufferedInputStream    输出流---FileOutputStream  BufferedOutputStream

       FileInputStream fis=null;

       FileOutputStream fos=null;

       BufferedInputStream bis=null;

       BufferedOutputStream bos=null;

      

       try {

           fis=new FileInputStream("res/未命名.jpg");

           bis=new BufferedInputStream(fis);

           fos=new FileOutputStream("res/图片1.jpg");

           bos=new BufferedOutputStream(fos);

           int  n=0;

           while((n=bis.read())!=-1){

              bos.write(n);

           }

       } catch (FileNotFoundException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally{

           if(bis!=null){

              try {

                  bis.close();

                  bos.close();

              } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

           }

             

       }

      

    }

}

 

五、补充----转换流

    OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。字符到字节的桥梁

InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。字节到字符的桥梁

OutputStreamWriter和InputStreamReader的构造—他们本身是字符流,又具有转换的作用,因此在构造的时候,需要传入字节流对象

public OutputStreamWriter(OutputStream out)

public OutputStreamWriter(OutputStream out, String charsetName)

public InputStreamReader(InputStream in)

public  InputStreamReader(InputStream in, String charsetName)

 

操作文件的字符流FileReader和FileWriter是转换流的子类,因此从他们的继承关系就可以清楚的发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入和输出的。

注意:在使用FileReader操作文本数据时,该对象使用的是默认的编码表。如果要使用指定编码表时,必须使用转换流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值