JAVA中的字节流和字符流

IO的分类

根据数据的流向可分为:输入流和输出流
输入流: 把数据从其他设备读取到内存中的流
输出流: 把数据从内存写出到其他设备上的流

根据数据的类型分为:字节流和字符流
字节流: 以字节为单位,进行输入和输出的流
字符流: 以字符为单位,进行输入和输出的流


顶级父类

输入流输出流
字节流字节输入流(InputStream)字节输出流(OutputStream)
字符流字符输入流(Reader)字符输出流(Writer)

字节流

字节输出流(OutputStream)

字节输出流的基本共性功能方法

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b) :将数组写入到输出流中
  • public void write(byte[] b, int off, int len) :将指定长度的数组写入到输出流中
  • public abstract void write(int b) :将b写入到输出流。

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

FileOutputStream

构造方法

  • public FileOutputStream(File file) :根据File对象创建FileOutputStream对象
  • public FileOutputStream(String name) : 根据文件名创建FileOutputStream对象

例子

public class Main {
    public static void main(String[] args) throws IOException {
    
        //根据文件名创建文件输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt");

        //根据File对象创建文件输出流对象(若文件不存在会自动创建文件)
        File file = new File("b.txt");
        FileOutputStream fos1 = new FileOutputStream(file);
        //关闭输出流
		fos.close();
		fos1.close();
    }
}

写出字节数据

  • public void write(int b):将b写出到指定位置
  • public void write(byte b[]):将字节数组写出到指定位置
  • public void write(byte b[], int off, int len):将指定长度的字节数组写出到指定位置

例子

public class Main {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("a.txt");
        //在文件中存储--->a
        fos.write(97);
        //在文件中存储--->Hello
        fos.write("Hello".getBytes());
        //在文件中存储--->文
        fos.write("文件".getBytes(),0,3);
        //关闭文件输出流
        fos.close();
    }
}

追加续写

  • public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name, boolean append) :创建文件输出流以指定的名称写入文件。

true 表示追加数据, false 表示清空原有数据。

例子:

public class Main {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("a.txt");
        fos.write("Hello".getBytes());
        FileOutputStream fos1=new FileOutputStream("b.txt",true);
        fos1.write("文件".getBytes());
        //关闭输出流
        fos.close();
        fos1.close();
    }
}

运行两次后的结果

a.txt---->Hello
b.txt---->文件文件

写出换行

  • Windows系统里,每行结尾是 回车+换行 ,即 \r\n
  • Unix系统里,每行结尾只有换行 ,即 \n
  • Mac系统里,每行结尾是 回车,即 \r 。从 Mac OS X开始与Linux统一

例子

public class Main {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("a.txt");
        fos.write("文件".getBytes());
        fos.write("\r\n".getBytes());
        fos.write("输出".getBytes());
        fos.close();
    }
}

字节输入流

字节输入流的基本共性功能方法

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源
  • public abstract int read() : 从输入流读取数据的下一个字节
  • public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组b中

FileInputStream


构造方法

  • FileInputStream(File file) : 根据File对象创建FileInputStream对象
  • FileInputStream(String name) : 根据文件名创建FileInputStream对象

例子

public class Main throws IOException{
    public static void main(String[] args) {
        // 使用File对象创建流对象    
        File file = new File("a.txt");
        FileInputStream fis = new FileInputStream(file);
     
        // 使用文件名称创建流对象
        FileInputStream fis1 = new FileInputStream("b.txt");
		//关闭输入流
		fis.close();
		fis1.close();
    }
}

读取字节数据

  • public int read():每次可以读取一个字节的数据,转化为int类型,读取到文件末尾,返回 -1
  • public int read(byte b[]):每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1

例子

public class Main {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("a.txt");
        int len=0;
        //从文件中一个字节一个字节的读取数据
        while ((len=fis.read())!=-1){
            System.out.print((char) len);
        }
        //释放资源
        fis.close();
        System.out.println();
        FileInputStream fis1=new FileInputStream("b.txt");
        byte[] bytes=new byte[2];

        //一次性读取bytes数组长度的数据
        while ((fis1.read(bytes)!=-1)){
            System.out.print(new String(bytes));
        }
        //释放资源
        fis1.close();
    }
}

注意: 若文件中输入中文则可能会乱码,因为一个中文字符在UTF-8下占3个字节,而一个字节一个字节的读取解析不了,就会造成乱码现象

字符流

字符输入流(Reader)

字符输入流的基本共性功能方法

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 从输入流读取一个字符。
  • public int read(char[] chars) : 从输入流中读取一些字符,并将它们存储到字符数组 chars中 。

FileReader

构造方法

  • public FileReader(File file) : 根据File对象创建FileReader对象

  • public FileReader(String fileName) : 根据文件名称创建FileReader对象

例子

public class Main {
    public static void main(String[] args) throws IOException {
        //根据文件名创建对象(文件需存在)
        FileReader fr = new FileReader("a.txt");

        //根据File对象创建FileReader对象
        File file=new File("c.txt");
        file.createNewFile();
        FileReader fr1=new FileReader(file);
        //关闭输入流
        fr.close();
        fr1.close();
    }
}

读取字符数据

  • public int read():每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1
  • public int read(char cbuf[]):每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1

例子:

public class Main {
    public static void main(String[] args) throws IOException {
		//文件需存在
        FileReader fr = new FileReader("a.txt");
        int len=0;
        while ((len=fr.read())!=-1){
            System.out.print((char)len);
        }
        fr.close();
        System.out.println();
        FileReader fr1 = new FileReader("b.txt");
        char[] chars=new char[2];
        while (fr1.read(chars)!=-1){
            System.out.print(new String(chars));
        }
        fr1.close();
    }
}

字符输出流(Writer)

字符输出流的基本共性功能方法

  • void write(int c) 写入单个字符。
  • void write(char[] cbuf) 写入字符数组。
  • abstract void write(char[] cbuf, int off, int len) 写入字符数组的指定位置
  • void write(String str) 写入字符串
  • void write(String str, int off, int len) 写入字符串的指定位置
  • void flush() 刷新该流的缓冲
  • void close() 关闭此流,但要先刷新它

FileWriter

构造方法

  • public FileWriter(File file) : 根据File对象创建FileWriter对象

  • public FileWriter(String fileName) :根据文件名创建FileWriter对象

例子

public class Main {
    public static void main(String[] args) throws IOException {
        //根据文件名创建对象
        FileWriter fw=new FileWriter("a.txt");

        //根据File对象创建对象(若文件不存在会自动创建文件)
        File file=new File("b.txt");
        FileWriter fw1=new FileWriter(file);
        //关闭输出流
		fw.close();
		fw1.close();
    }
}

基本写出数据

  • public void write(int c):每次可以写出一个字符数据
  • public void write(char cbuf[]):写入字符数组
  • public void write(char cbuf[], int off, int len):写入指定字符数组
  • public void write(String str):写入字符串
  • public void write(String str, int off, int len):写入指定长度的字符串

例子:

public class Main {
    public static void main(String[] args) throws IOException {

        FileWriter fw=new FileWriter("a.txt");

        //将a写入到a.txt文件中
        fw.write(97);

        //将"Hello"写入到a.txt文件中
        fw.write("Hello".toCharArray());

        //将"Ja"写入到a.txt中
        fw.write("Java".toCharArray(),0,2);

        //将"文件"写入到a.txt中
        fw.write("文件");

        //将"进"写入到a.txt中
        fw.write("进程",0,1);
        fw.close();
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值