Java 文件流一:字节流(FileInputStream 和 FileOutputStream)

   Java文件流操作是一个非常重要的内容。下图列举了关于Java基本的文件流操作,当然目前还有NIO,这个后来会进行讨论,先看基本的文件流操作。我们主要使用的是访问文件的流和缓冲流。

  文件的流操作一般包含字符流和字节流,两者区别在于,字符流每次传播16bit数据,字节流一次读取8bit数据。这里先对Java中字节流的使用展开讨论。

  必须明确一个概念,流操作包含了输入输出流,其中,输出流指的是文件流输出,也就是将文件流输出到磁盘或者数据库;输入流是从磁盘或者数据库中读取流数据,并打印出来。下面以代码来给大家做个展示。

1 FileInputStream 文件读入

    //使用byte[]数组进行读取文件
    public void testInput() {
        File file=new File("D:\\test.txt");//此处读取的为txt文本,也可以是图片或者其他,但是打印结果会比较尴尬,具体可以试试
        FileInputStream fis=null;
        try {
            fis=new FileInputStream(file);
            byte[] b=new byte[5];//读取数据到数组,这里根据读取的问件定大小,图片或者视频可以采用1024以及其倍数
            int len;//每次读入byte的字节长度,到末尾为-1
            while((len=fis.read(b))!=-1) {
                /*这里的i的阈值一定为len 因为len不是固定的 在读到文件末尾时 len
                与每次固定读入长度(这里是 5)不一样
                */
                for(int i=0;i<len;i++) {
                    System.out.println((char)b[i]);
                }
                /*或者这样打印
                String str=new String(b,0,len);
                System.out.println(str);*/
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(fis!=null)
                try {
                    fis.close();//关文件操作 必须要有!!!
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
        }
        
    }

2 文件输出 FileOutputStream

   //文件流输出
    public void testOutput() {
        //输出目标(其目标可以不存在 可以在程序执行中自行创建,若存在会自动覆盖文件)
        File file=new File("D:test1.txt");
        //创建一个FileOutputStream对象 将file作为参数传入
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(file);
            //向文件中写东西(覆盖写法)
            fos.write(new String("I love China").getBytes());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
    }

3 有了输入和输出的样例,其实我们就可以将文件的输入输出封装为一个工具类,具体操作如下:

//其中 src dst分别为文件的 源地址和目标地址

 public void copyFile(String src,String dst) {
        //1 提供读入 输出文件(字节流)(可以为txt 或者 图片 视频等)
                File file1=new File(src);
                File file2=new File(dst);    
                //提供流对象
                FileInputStream fis=null;
                FileOutputStream fos=null;
                try {
                    fis=new FileInputStream(file1);
                    fos=new FileOutputStream(file2);
                    // 实现文件复制
                    byte[] b=new byte[10];//读取字节长度,根据所传文件大小来定,图片视频一般为1024及其倍数
                    int len;//每次读入的长度
                    while((len=fis.read(b))!=-1) {
                        //写入文件
                        fos.write(b, 0, len);
                    }
                    
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    //先关输出
                    if(fos!=null) {
                        try {
                            fos.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    //再关输入
                    if(fis!=null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
    }

方法调用:

public static void main(String[] args) {
        String src="D:\\test.txt";//源地址
        String dst="D:\\test1.txt";//目标地址
        copyFile(src,dst);//进行copy(注意这个方法在这个类里面要是静态,因为直接被main 方法调用了)
    }
就可以看到 D盘里有一个test1.txt.

【注意】这里根据字节流进行操作,读取中文时,是读不出来的,因为汉语为字符。后来会对其进行讨论。

猜你喜欢

转载自blog.csdn.net/qq_29750461/article/details/81156492