Java学习之IO流
发布日期:2021-05-09 03:33:02 浏览次数:17 分类:博客文章

本文共 9987 字,大约阅读时间需要 33 分钟。

简单介绍

•概念 

  按照流的方向分为 输入流(InputStream) 与 输出流(OuputStream);

  • 输入流:只能读取数据,不能写入数据
  • 输出流:只能写入数据,不能读取数据

  因为程序是运行在内存中,以内存角度来理解输入输出概念:

  • 输入与输出是一个相对概念,数据写入文件,对于程序来说是输出流,对文件来说是输入流
  • 但一般是以程序作为中心,所以从程序写入数据到其他位置,是输出流,将数据读入程序中,则是输入流

  简单的说就是:读取数据就是输入流,写入数据就是输出流。

•分类

  • 字节流:操作的数据单元是 8位 的字节,以 InputStream , OutputStream 作为抽象基类。
  • 字符流:操作的数据单元是字符,以 Reader , Writer 作为抽象基类
  • 字节流可以处理所有数据文件,若处理的是纯文本数据,建议使用字符流

 


字节流

•InputStream

常用方法

  • InputStream.read()  : 从输入流中读取数据的下一个字节
  • InputStream.read(byte[] b)  : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
  • InputStream.read(byte[] b, int off, int len)  : 将输入流中最多 len 个数据字节读入从偏移量 off 开始的 byte 数组 b 中
  • InputStream.close()  : 关闭此输入流并释放与该流关联的所有系统资源

•FileInputStream

  我在 E 盘下新建了一个 test.txt 文本,该文本中仅包含一行文本 "ABCDEFG",接下来的操作都将围绕该文本进行。

构造方法

  • FileInputStream(File file)  : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的File对象 file 指定
  • FileInputStream(String name)  : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径 name 指定

InputStream.read()

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                InputStream input = new FileInputStream(file);        int x = 0;        while((x = input.read()) != -1) {            //字符在底层存储的是存储的数值,即字符对应的ASCII码            //所以需要通过(char)进行强制类型转换            System.out.print((char)x+" ");        }        //IO流使用完毕一定要关闭        input.close();    }}

运行结果

  

InputStream.read(byte[] b)

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                InputStream input = new FileInputStream(file);        int x = 0;        byte[] b = new byte[2];        while((x = input.read(b)) != -1) {            System.out.print(new String(b,0,x)+" ");        }        //IO流使用完毕一定要关闭        input.close();    }}

运行结果

  

InputStream.read(byte[] b, int off, int len)

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                InputStream input = new FileInputStream(file);        int x = 0;                byte[] b = new byte[100];        for(int i = 0;i < 100;i++) {//初始化 b 数组            b[i] = '#';        }                while((x = input.read(b,1,3)) != -1) {            System.out.println(new String(b,0,10));        }                //IO流使用完毕一定要关闭        input.close();    }}

运行结果

  

  上述三种代码,语句  InputStream input = new FileInputStream(file);  可改为  InputStream input = new FileInputStream("E://test.txt"); ;

•BufferedInputStream

  字节缓冲输入流,提高了读取效率;

构造方法

  •  BufferedInputStream(InputStream in)  : 创建一个 BufferedInputStream 并保存其参数,即输入流in,以便将来使用
  •  BufferedInputStream(InputStream in, int size)  : 创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流in以便将来使用

BufferedInputStream(InputStream in)

import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class TestFileInputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                InputStream input = new FileInputStream(file);        BufferedInputStream bis = new BufferedInputStream(input);        byte[] b = new byte[200];                int x = 0;        while((x = bis.read(b)) != -1) {            System.out.print(new String(b,0,x));        }                //IO流使用完毕一定要关闭        input.close();        bis.close();    }}

运行结果

  

•OutputStream

常用方法

  • OutputStream.write(byte[] b)  : 将 b 数组写入此输出流
  • OutputStream.write(byte[] b, int off, int len)  : 将 b 数组中从偏移量 off 开始的 len 个字节写入此输出流
  • OutputStream.close()  : 关闭此输出流并释放与此流有关的所有系统资源

•FileOutputStream

构造方法

  • FileOutputStream(File file)  : 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  • FileOutputStream(File file, boolean append)  : 创建一个向指定 File 对象表示的文件中追加写入数据的文件输出流
  • FileOutputStream(String name)  : 同 1
  • FileOutputStream(String name, boolean append)  : 同 2

FileOutputStream(File file)

import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;public class TestFileOutputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                OutputStream out = new FileOutputStream(file);        out.write("ABCDEFG".getBytes());                out.close();    }}

观察文本内容

  

FileOutputStream(File file, boolean append)

import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFileOutputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");                OutputStream out = new FileOutputStream(file,true);        out.write("\r\n".getBytes());        out.write("hello".getBytes());                out.close();    }}

观察文本内容

  

注意

  输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;

  输出换行符时一定要写  \r\n  不能只写  \n  ,因为不同文本编辑器对换行符的识别存在差异性。

•BufferedOutputStream

  字节缓冲输出流,提高了写出效率;

构造方法

  •  BufferedOutputStream(OutputStream out)  : 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
  •  BufferedOutputStream(OutputStream out, int size)  : 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流

BufferedOutputStream(OutputStream out)

import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class TestFileOutputStream {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");        OutputStream output = new FileOutputStream(file,true);        BufferedOutputStream bos = new BufferedOutputStream(output);                bos.write("\r\n".getBytes());        bos.write("nice to meet you".getBytes());        bos.flush();//刷新此缓冲的输出流                output.close();        bos.close();    }}

观察文本内容

  

 


字符流

•Reader

常用方法

  • Reader.read()  : 读取单个字符
  • Reader.read(char[] cbuf)  : 将字符读入数组
  • Reader.read(char[] cbuf, int off, int len)  : 将字符读入数组的某一部分
  • Reader.close()  : 关闭该流并释放与之关联的所有资源

•InputStreamReader

  将 test.txt 的文本内容更改为 "ABCDEFG";

构造方法

  •  InputStreamReader(InputStream in)  : 创建一个使用默认字符集的 InputStreamReader
  •  InputStreamReader(InputStream in, Charset cs)  : 创建使用给定字符集的 InputStreamReader

InputStreamReader(InputStream in)

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestInputStreamReader {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");        InputStream in = new FileInputStream(file);                InputStreamReader reader = new InputStreamReader(in);        int x = 0;        while((x = reader.read()) != -1){            System.out.print((char)x+" ");        }        reader.close();    }}

运行结果

  

InputStreamReader(InputStream in, Charset cs)

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestInputStreamReader {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");        InputStream in = new FileInputStream(file);                InputStreamReader reader = new InputStreamReader(in,"utf-8");        int x = 0;        while((x = reader.read()) != -1){            System.out.print((char)x+" ");        }        reader.close();    }}

运行结果

  

•BufferedReader

  字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法

  •  BufferedReader(Reader in)  : 创建一个使用默认大小输入缓冲区的缓冲字符输入流
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class TestBufferedReader {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");        InputStream in = new FileInputStream(file);        InputStreamReader inputReader = new InputStreamReader(in);                BufferedReader reader = new BufferedReader(inputReader);                String s;        while((s = reader.readLine()) != null) {//一次性读取一行            System.out.println(s);        }                reader.close();            }}

运行结果

  

•Writer

常用方法

  •  OutputStreamWriter.write(char[] cbuf)  : 写入字符数组
  •  OutputStreamWriter.write(char[] cbuf, int off, int len)  : 写入字符数组的某一部分
  •  OutputStreamWriter.write(char c)  : 写入单个字符
  •  OutputStreamWriter.write(String str)  : 写入字符串
  •  OutputStreamWriter.write(String str, int off, int len)  : 写入字符串的某一部分
  •  OutputStreamWriter.append(char c)  : 将指定字符添加到此 writer
  •  OutputStreamWriter.append(CharSequence csq)  : 将指定字符序列添加到此 writer
  •  OutputStreamWriter.append(CharSequence csq, int start, int end)  : 将指定字符序列的子序列添加到此 writer.Appendable
  •  OutputStreamWriter.flush()  : 刷新该流的缓冲
  •  OutputStreamWriter.close()  : 关闭此流,但要先刷新它

•OutputStreamWrite

构造方法

  • OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, Charset cs) : 创建使用给定字符集的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, CharsetEncoder enc) : 创建使用给定字符集编码器的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, String charsetName) : 创建使用指定字符集的 OutputStreamWriter

特有方法

  • String getEncoding() : 返回此流使用的字符编码的名称
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;public class TestOutputStreamWrite {    public static void main(String[] args) throws IOException{                File file = new File("E://test.txt");        OutputStream out = new FileOutputStream(file);                OutputStreamWriter writer = new OutputStreamWriter(out);        writer.write("abcdefg");        writer.append('@');        writer.append("abc");                writer.flush();        writer.close();    }}

观察文本内容

  

•声明

参考资料

  • 【】
  • 【】

 

上一篇:Android学习之文件存储
下一篇:ANDROID : NEW IDEA

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月20日 14时06分38秒