RE:JAVA学习-基本IO操作及文本数据IO操作

来源:互联网 发布:java中的命名规范 编辑:程序博客网 时间:2024/06/16 09:34

1.输入输出(传输方向)
输入:从外界进入到程序的方向,”读取”外界的数据时,使用输入(输入是用来读取数据的)
输出:从程序发送到外界的方向,”写出”数据到外界时,使用输出(输出是用来写出数据的)

按照流是否直接与特定的地方分为(传输形式:):
节点流(低级流):可以从或向一个特定的地方(节点)读写数据
处理流(高级流):是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写
输入流 输出流
字符流 Reader Writer
字节流 InputStream OutputStream
这四个基本流都是抽象类

2.文件流
2.1 FileOutputStream
是文件的字节输出流,以字节为单位将数据写入文件
构造方法:
FileOutputStream(File file) 创建一个向指定File对象表示的文件中写出数据的文件输出流
FileOutputStream(String filename) 创建一个向具有指定名称的文件中写出数据的文件输出流
(若指定问文件已经有内容,则使用FOS写入的时候会清空原数据)
FileOutputStream(file,true)
FileOutputStream(filename,true)
用以上构造方法则不会覆盖原文件,而是在原文件后追加写入
写入方法:
void write(byte[]b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流
void write(int b) 将指定字节写入此文件输出流

2.2 FileInputStream是文件的字节输入流,以字节为单位从文件中读取数据

构造方法:
FileInputStream(File file)
FileInputStream(String name)
读取方法:
int read() 从此输入流中读取一个数据字节
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中
代码演示:实现文件的复制

/** * 使用文件流复制文件 * */public class CopyDemo {    public static void main(String[] args) throws IOException {        /*         * 使用文件输入流将原文件中的所有字节顺序的         * 读取出来再用文件输出流写入到另一个文件中         * 完成复制操作         */        FileInputStream fis            = new FileInputStream("music.mp3");             FileOutputStream fos            = new FileOutputStream("music_cp2.mp3");                byte[] buf = new byte[1024*10];        int len = -1;               while( (len = fis.read(buf)) !=-1 ){            fos.write(buf,0,len);        }           System.out.println("复制完毕");             fis.close();        fos.close();    }}

附:使用缓冲流实现文件的复制

/** * 缓冲流: BufferedInputStream:缓冲输入流,提高读取效率 BufferedOutputStream:缓冲输出流,提高写出效率 *  * @author adminitartor * */public class CopyDemo2 {    public static void main(String[] args) throws IOException {        FileInputStream fis             = new FileInputStream("test.zip");        BufferedInputStream bis            = new BufferedInputStream(fis);        FileOutputStream fos             = new FileOutputStream("test_cp.zip");        BufferedOutputStream bos            = new BufferedOutputStream(fos);        int d = -1;        long start = System.currentTimeMillis();        /*         * 缓冲流内部维护着一个缓冲区(字节数组)         * bis.read()看似读取一个字节,实际上缓冲流         * 会一次性通过fis读取一组字节,并存入内部维护         * 的字节数组中,然后将第一个字节返回。这样当         * 再次调用bis.read()读取一个字节时,会直接从         * 内部的字节数组将第二个字节返回。         * 所以缓冲流还是通过提高一次实际读取的字节量         * 减少实际读取次数提高的效率。         * 缓冲输出流也是类似原理。         */        while ((d = bis.read()) != -1) {            bos.write(d);        }        long end = System.currentTimeMillis();        System.out.println("复制完毕,耗时:"+(end-start)+"ms");        /*         * 关闭流只需要关闭最外层高级流即可。         */        bis.close();        bos.close();    }}

3.转换流
转换输出流:OutputStreamWriter 表面上展现的是字符流,实际上是以字节流形式传输的(字符转字节)

转换输入流:InputStreamReader  实际上是以字节形式读取的数据,但是以字符形式展现的(字节转字符)