第二十四节(Java文件流,缓冲流)

Java流
文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。 Java 中根据流的方向可
以分为输入流和输出流。
输入流是将文件或其它输入设备的数据加载到内存的过程; 输出流恰恰相反, 是将内存中的数据保存到文件或其他输出设备。
见图:

文件是由字符或字节构成, 那么将文件加载到内存或再将文件输出到文件, 需要有输入和输出流的支持,那么在
Java 语言中又把输入和输出流分为了两个,字节输入和输出流,字符输入和输出流

InputStream 是字节输入流:
InputStream 是一个抽象类, 所有继承了 InputStream 的类都是字节输入流

OutputStream(字节输出流):
继承了 OutputStream 都是字节输出流

Reader(字符输入流):
继承了 Reader 都是字符输如流

Writer(字符输出流):
继承了 Writer 都是字符输出流
文件流主要分为:文件字节输入流、文件字节输出流、文件字符输入流、文件字符输出流

FileInputStream(文件字节输入流): 主要按照字节方式读取文件

FileOutputStream(文件字节输出流): 主要按照字节方式写文件

FileReader(文件字符输入流): FileReader 是一字符为单位读取文件,也就是一次读取两个字节
FileWriter(文件字符输出流)
/*
    java.io.InputStream 字节输入流
        java.io.FileInputStream 文件字节输入流

    按照字节方式读取文件

*/

import java.io.*;

public class FileInputStreamTest01{

    public static void main(String[] args){

        FileInputStream fis = null;

        try{

            fis = new FileInputStream("C:\\work\\Java\\course\\vip\\JavaSE-Course-Arry\\chapter25\\Test01.java");

            int i = fis.read(); // 以字节的方式读取

            System.out.println("i = " + i);//读出为-1

        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        } finally{
            // 关闭文件输入流
            if(fis != null){
                try{
                    fis.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }

        }
    }

}
/*
    int read(byte[] b);

    从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

*/

import java.io.*;

public class FileInputStreamTest02{

    public static void main(String[] args){

        try{

            FileInputStream fis = new FileInputStream("C:\\work\\Java\\course\\vip\\JavaSE-Course-Arry\\chapter25\\Test01.java");

            // 准备一个byte数组
            byte[] bytes = new byte[3]; // 每一次最多读取三个字节

            // int read(byte[] b);
            int i1 = fis.read(bytes);

            System.out.println("i = " + i1);

            System.out.println(new String(bytes)); //输出乱码
            /*
                乱码,文件正常读取,但是我们的汉字乱码了,原因在于使用了字节输入流,他是一个
                一个字节读取的,所以读取一个字节就打印,那么汉字是不完整的 所以就乱码
            */

        } catch(Exception e){
            e.printStackTrace();
        }
    }

}
/*
    文件的备份(复制粘贴)

*/

import java.io.*;

public class FileOutputStreamTest01{

    public static void main(String[] args){

        FileInputStream fis = null;
        FileOutputStream fos = null;

        try{

            fis = new FileInputStream("C:\\work\\keke.jpg");
            fos = new FileOutputStream("C:\\work\\Java\\keke.jpg");

            System.out.println("文件复制开始进行中 ........");

            // 一边读,一边写
            int temp = 0; // 临时变量
            while((temp = fis.read()) != -1){
                fos.write(temp);
            }

            System.out.println("文件复制完毕 !");

        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            if(fis != null){
                try{
                    fis.close();
                } catch(Exception e){
                    e.printStackTrace();
                }
            }
            if(fos != null){
                try{
                    fos.close();
                } catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

}
/*
    FileReader 文件的字符输入流

        是以字符为单位读取文件,也就是一次读取两个字节

*/

import java.io.*;

public class FileReaderTest01{

    public static void main(String[] args){

        FileReader fr = null;

        try{

            fr = new FileReader("C:\\work\\ming.txt");

            int temp = 0;
            while((temp = fr.read()) != -1){
                // 输出字符
                System.out.println(temp);
            }

            // 为什么不乱码? 因为采用了字符输入流 读取文本文件
            // 所以汉字就不乱码了(一次读取两个字节<即一个字符>)

        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            try{
                if(fr != null){
                    fr.close();
                }
            } catch(IOException e){
                e.printStackTrace();
            }
        }

    }

}
/*
    FileWriter 文件字符输出流

java.lang.Object
  继承者 java.io.Writer
      继承者 java.io.OutputStreamWriter
          继承者 java.io.FileWriter

*/

import java.io.*;

public class FileWriterTest01{

    public static void main(String[] args){
        FileWriter fw = null;
        try{
            // true表示 在文件后面追加
            fw = new FileWriter("C:\\work\\ming.txt",true);

            // 换行(\r\n)
            fw.write("\r\n\r\n太棒了!电子科技大学中山学院");

        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            try{
                if(fw != null){
                    fw.close();
                }
            } catch(IOException e){
                e.printStackTrace();
            }
        }

    }

}
/*
    采用字节缓冲流改造文件复制代码
*/

import java.io.*;

public class BufferedStreamTest01{

    public static void main(String[] args){

        BufferedInputStream bis =  null;
        BufferedOutputStream bos = null;

        try{

            // FileInputStream fis = new FileInputStream("C:\\work\\arry.txt");

            bis = new BufferedInputStream(new FileInputStream("C:\\work\\keke.jpg"));

            // FileOutputStream fos = new FileOutputStream("C:\\work\\Java\\course\\arry.txt.bak");
            bos = new BufferedOutputStream(new FileOutputStream("C:\\work\\Java\\course\\keke.jpg"));

            System.out.println("文件复制开始进行中 .....");

            int temp = 0;
            while((temp = bis.read()) != -1){
                bos.write(temp);
            }

            // 刷新
            bos.flush();

            System.out.println("文件复制成功 !");
        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        } finally{
            try{
                if(bis != null){
                    bis.close();
                }
                if(bos != null){
                    bos.close();
                }
            } catch(IOException e){
                e.printStackTrace();
            }
        }

    }

}
时间: 2024-11-29 09:19:14

第二十四节(Java文件流,缓冲流)的相关文章

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

centos mysql 优化 第二十四节课

centos mysql  优化  第二十四节课 f

第二十四节,自定义函数

第二十四节,自定义函数函数是将要实现的功能写在函数里,在要使用此功能的地方调用此函数即可实现功能,这样大大减少编程重复书写同样的代码,在多个要使用同样功能的地方调用函数即可不需要重复写同样的代码函数式编程最重要的是增强代码的重用性和可读性 函数的定义主要有如下要点: def:表示函数的关键字函数名:函数的名称,日后根据函数名调用函数函数体:函数中进行一系列的逻辑计算,如:发送邮件.计算出 [11,22,38,888,2]中的最大数等...参数:为函数体提供数据return:返回值:当函数执行完毕

【php增删改查实例】第二十四节 - 文件上传在项目中的具体应用

文件上传在项目中,一般有两个用武之地,分别为设置用户的头像和上传附件.本节我们演示如果进行用户头像的上传. 因为一个用户单独并且唯一对应了一个头像,是一对一的关系,所以我们需要去给tm_users表添加一个头像字段 – header . 点击保存按钮,完成表字段的添加. 本节中的头像上传,可以对图像进行裁剪,最终上传到服务器的是一个经过裁剪后的图像. 图像是保存在磁盘上的,数据库只负责保存头像的地址. 现在把 5-10上课资料文件夹中的imageUpload文件夹拷贝到5-10文件夹中. ima

Scala入门到精通——第二十四节 高级类型 (三)

作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在scala中,类(class)与类型(type)是两个不一样的概念.我们知道类是对同一类型数据的抽象,而类型则更详细. 比方定义class List[T] {}, 能够有List[Int] 和 List[String]等详细类型

[ExtJS5学习笔记]第二十四节 Extjs5中表格gridpanel或者表单数据后台传输remoteFilter设置

本文地址:http://blog.csdn.net/sushengmiyan/article/details/39667533 官方文档:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.Store-method-getFilters 本文作者:sushengmiyan ----------------------------------------------------------------------------------

第二十四节 让web服务器支持WSGI协议

import socket import multiprocessing import re # import dynamic.mini_frame import sys # 通过sys.argv在cmd命令行给实例对象传参 class WSGIServer(): def __init__(self, port, app, static_path): self.application = app self.static_path = static_path self.web_socket = s

centos mysql 实战 第二十四节课

f

Egret入门学习日记 --- 第二十四篇(书中 9.12~9.15 节 内容)

第二十四篇(书中 9.12~9.15 节 内容) 开始 9.12节 内容. 重点: 1.TextInput的使用,以及如何设置加密属性. 操作: 1.TextInput的使用,以及如何设置加密属性. 创建exml文件,拖入组件,设置好id. 这是显示密码星号处理的属性. 创建绑定类. 实例化,并运行. 但是焦点在密码输入框时,密码是显示的. 暂时不知道怎么设置 “焦点在密码框上时,还是显示为 * 号” 的方法. 至此,9.12节 内容结束. 开始 9.13节 . 这个,和TextInput的使用