Java文件IO流的操作总结

流就是管道,向管道里面写数据用输出流.write

从管道里面读数据,用输入流.read

流,按照不同的维度有不同的分类,按照从流中每次读取数据单位不同,划分为字节流字符流

按照流-对应操作的角色的不同(是IO设备,还是其他流)是否能够直接向特定的IO设备如文件、网络、磁盘等,能够直接与这些进行读写的称之为节点流,

对节点流进一步封装的流,通过封装后的流来实现读写功能,处理流也被称为高级流

流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。流中的数据只能够顺序访问。当达到流末尾时,返回-1。

请注意:

InputStream的read()方法返回一个字节大小,返回值的范围在0到255之间。

Reader的read()方法返回一个字符,会根据文本的编码,一次读取一个或者多个字节,返回值的范围在0到65535之间。

read(byte[])会尝试读取与给定字节数组容量一样大的字节数,返回值int表示已经读取过的字节数。如果InputStream内可读的数据不足以填满字节数组,那么数组剩余的部分将包含本次读取之前的数据。记得检查有多少数据实际被写入到了字节数组中。

read(byte, int offset, int length)同样将数据读取到字节数组中,不同的是,该方法从数组的offset位置开始,并且最多将length个字节写入到数组中。同样地,read(byte, int offset, int length)方法返回一个int变量,表示有多少字节已经被写入到字节数组中,所以请记得在读取数据前检查上一次调用read(byte, int offset, int length)的返回值。

示例代码

package com.lingyejun.io;

import java.io.*;

/**
 * Created by Lingye on 2018/9/27 20:15
 */
public class FileStreamOperate {

    public static final String READ_UTF8_FILE_PATH = "D:\\input-utf8.txt";
    public static final String READ_UNICODE_FILE_PATH = "D:\\input-unicode.txt";
    public static final String WRITE_BYTES_FILE_PATH = "D:\\output-bytes.txt";
    public static final String WRITE_CHARS_FILE_PATH = "D:\\output-char.txt";

    /**
     * 按照字节流的方式读取文件内容
     *
     * Step 1.根据文件路径,构建文件对象
     * Step 2.创建输入流用来读取文件内容
     * Step 3.创建字节数组来存放读取内容
     * Step 4.关闭读取文件的输入流
     *
     * @return
     */
    public void readFileByFileInputStream() {
        System.out.println("=== readFileByFileInputStream Start ===");
        // 构建文件对象
        File inputFile = new File(READ_UTF8_FILE_PATH);
        // 初始化输入流
        InputStream inputStream = null;
        try {
            // 创建字节输入流
            inputStream = new FileInputStream(inputFile);
            // 读取到1KB字节数组中
            byte[] buffer = new byte[100];
            // 每次读取的字节数
            int readLength;
            // 读取数据并放到buffer数组中
            while ((readLength = inputStream.read(buffer)) != -1) {
                // UTF-8为变长编码,一个汉字占3个字节
                System.out.println("本次读取" + readLength + "个字节数据内容为:" + new String(buffer));
            }
        } catch (FileNotFoundException e) {
            // 文件未找到时异常处理
            e.printStackTrace();
        } catch (IOException e) {
            // 读取过程中,删除文件会出此异常
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    // 关闭流过程,也有可能出现异常
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("=== readFileByFileInputStream End ===");
    }

    /**
     * 按照字符流的方式读取文件内容
     *
     * Step 1.根据文件路径,构建文件对象
     * Step 2.创建字符输入流读取文件内容
     * Step 3.创建字符数组来存放读取内容
     * Step 4.关闭读取文件的字符输入流
     *
     * @return
     */
    public void readFileByFileReader(){
        System.out.println("=== readFileByFileReader Start ===");
        // 根据路径拿到文件对象
        File file = new File(READ_UTF8_FILE_PATH);
        // 初始化字符输入流
        Reader fileReader = null;
        // 初始化存放读取内容的字符数组
        char[] charArray = new char[100];
        // 初始化一个字符
        char once;
        try {
            fileReader = new FileReader(file);
            // 一次读取一个数组长度的字符串
            fileReader.read(charArray);
            System.out.println(charArray);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null) {
                try {
                    // 关闭流过程,也有可能出现异常
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("=== readFileByFileReader End ===");
    }

    /**
     * 通过字节流的方式写入信息到文件
     *
     * Step 1.根据文件路径,构建文件对象
     * Step 2.创建字节输出流写出信息到文件
     * Step 3.构造待写出的内容,并转为字节数组
     * Step 4.关闭读取文件的字符输出流
     */
    public void writeFileByFileOutputStream() {
        System.out.println("=== writeFileByFileOutputStream Start ===");
        // 创建写出文件
        File file = new File(WRITE_BYTES_FILE_PATH);
        // 初始化字节输出流
        OutputStream outputStream = null;
        // 写出内容
        String outInfo = "写出测试";
        // 转成字节数组
        byte[] byteArray = outInfo.getBytes();
        try {
            // 创建输出字节流
            outputStream = new FileOutputStream(file);
            outputStream.write(byteArray);
            System.out.println("按照字节流成功写出内容:"+outInfo);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    // 关闭写出流时,注意抓异常
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("=== writeFileByFileOutputStream End ===");
    }

    /**
     * 通过字符流的方式写入信息到文件
     *
     * Step 1.根据文件路径,构建文件对象
     * Step 2.创建字符输出流写出信息到文件
     * Step 3.构造待写出的内容,并转为字符数组
     * Step 4.关闭读取文件的字符输出流
     */
    public void writeFileByFileWriter(){
        System.out.println("=== writeFileByFileWriter Start ===");
        // 创建写出文件
        File file = new File(WRITE_CHARS_FILE_PATH);
        // 初始化字符输出流
        Writer fileWriter = null;
        String strInfo = "字符写出数据";
        try {
            // 创建输出字符流
            fileWriter = new FileWriter(file);
            // 写出内容
            fileWriter.write(strInfo);
            System.out.println("按照字符流成功写出内容:"+strInfo);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileWriter != null){
                try {
                    // 关闭写出流时,注意抓异常
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("=== writeFileByFileWriter End ===");
    }

    /**
     * 任意读取文件内容
     */
    public void randomAccessFile(){
        System.out.println("=== randomAccessFile Start ===");
        File file = new File(READ_UTF8_FILE_PATH);
        try {
            RandomAccessFile randomAccessFile = new RandomAccessFile(file,"r");
            // 获取文件当前的指针位置
            System.out.println("file now pointer is "+randomAccessFile.getFilePointer());
            // 将文件指针设置到指定位置(绝对位置)
            randomAccessFile.seek(3);
            // 相对位置,相对于当前的位置,
            randomAccessFile.skipBytes(3);
            System.out.println("file now pointer is "+randomAccessFile.getFilePointer());
            // 字节数组
            byte[] buffer = new byte[17];
            // off是指的写到buffer的数组的起始位置
            randomAccessFile.read(buffer,0,buffer.length);
            System.out.println(new String(buffer));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("=== randomAccessFile End ===");
    }

    /**
     * 通过字节流的方式将文件内容拷贝到另一个文件中
     *
     * Step 1.根据文件路径,构建源文件对象
     * Step 2.根据文件路径,构造目的文件对象
     * Step 3.创建字节输入流从源文件中读取信息
     * Step 4.将读入到内存的信息再写出到目的文件中
     * Step 5.拷贝完成后关闭输入输出流
     */
    public void copyFile() {
        System.out.println("=== copyFile Start ===");
        // 输入文件对象
        File inFile = new File(READ_UTF8_FILE_PATH);
        // 输出文件对象
        File outFile = new File(WRITE_BYTES_FILE_PATH);
        // 初始化输入流
        InputStream inputStream = null;
        // 初始化输出流
        OutputStream outputStream = null;
        try {
            // 将输入流怼到输入文件,使程序内存与磁盘建立联系
            inputStream = new FileInputStream(inFile);
            // 将输出流怼到输出文件,使程序内存与磁盘建立联系
            outputStream = new FileOutputStream(outFile);
            while (true) {
                // 读取信息到内存
                int temp = inputStream.read();
                // 拷贝完成
                if (temp == -1) {
                    break;
                }
                // 将内容拷贝到输出文件中
                outputStream.write(temp);
            }
            System.out.println("拷贝文件成功完成");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    // 关闭输入流异常后,也要保证输出流关闭
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (outputStream != null) {
                        try {
                            outputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        System.out.println("=== copyFile End ===");
    }

    public static void main(String[] args) {
        FileStreamOperate fileStreamOperate = new FileStreamOperate();
        // 按照字节流读取的话,一个汉字两个字节
        fileStreamOperate.readFileByFileInputStream();
        // 按照字符读取,java Unicode编码一个字符(不论字母还是汉字)两个字节
        fileStreamOperate.readFileByFileReader();
        // 采用任意读取的方式读取文件信息
        fileStreamOperate.randomAccessFile();
        // 按照字节流的方式写信息到文件
        fileStreamOperate.writeFileByFileOutputStream();
        // 按照字符流的方式写信息到文件
        fileStreamOperate.writeFileByFileWriter();
        // 拷贝文件
        fileStreamOperate.copyFile();
    }
}  

输入输出文件

执行结果

参考文章:https://blog.csdn.net/yhl_jxy/article/details/79272792

原文地址:https://www.cnblogs.com/lingyejun/p/9744509.html

时间: 2024-10-11 17:34:57

Java文件IO流的操作总结的相关文章

Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

java中IO流的操作

读取转换流--读取键盘录入中键盘录入一行数据并打印其大写,发现就是读一行数据的原理.也就是readLine方法.能不能直接使用readLine方法来完成键盘录入一行数据的读取呢?readLine方法是字符流BufferedReader类中的方法.而键盘录入的read方法是字节流InputStream的方法.那么能不能将字节流转换成字符流再去使用字符流缓冲区的readLine方法呢. public class TransStreamDemo { public static void main(St

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

java的IO流,字节流和字符流

java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 字符流(其实就是传输的颗粒,传输的基本单位) 总结:凡是处理纯文本的优先考虑字符流:其他的才考虑使用字节流

Java之IO流---字节流

1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream.Java中的IO流大抵是用于在控制台.磁盘.内存上进行数据的读写操作,完成数据的传递. 我们可以对它进行如下分类: 按处理的数据类型可分为字节流与字符流 按流的流向可分为输入流(in)与输出流(out) 按流的功能可分为节点流(Node)和过滤流(Filter) 本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的.下篇继续梳理字符流. 1.2 IO流的继承体系图 大概描述了

java的Io流学习

Java中io流的学习(一)File:https://blog.csdn.net/qq_41061437/article/details/81672859 Java中io流的学习(二)FileInputStream和FileOutputStream:https://blog.csdn.net/qq_41061437/article/details/81742175 Java中io流的学习(三)BuffereInputStream和BuffereOutputStream:https://blog.

Java之IO流用法总结

Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行.3.java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据. IO流的分类:1.按操作数据单位不同分为:字节流(8 bit), 字符流(16 bit).2.按数据流的流向不同分为:输入流,输出流.3.按流的角色的不同分为:节点

【Java】IO流简单分辨

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用到的几个流类的简易区分以及体系层次整理出来,方便记忆与辨析.本人对IO了解尚浅,文章如有错漏,恳请前辈指正,感激不尽! 字节流体系: 基类:InputStream/outputStream(抽象类,不能new) 子类: 文件IO字节流:FileInputStream/FileoutputStream

C# IO流的操作

C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             //将文件内容读到流中             Stream stream = File.Open("test.txt", File