博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO流总结
阅读量:4179 次
发布时间:2019-05-26

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

IO流概述

可以将数据传输的操作,看作一种数据流动,按照流动的方向分为输入Input和输出Output。

Java中的IO操作主要指的是Java.io包下的一些常用类的使用。这些常用类通常操作的是对数据的读取(输入Input)和写出(输入Output)。

使用总结:只要处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

io.File

操作的是对文件的

创建:creatNewFile()、mkdir()、mkdirs()

删除:delete()

获取大小:length()

获取名称;getName()

获取路径:getAbsolutePath()、

得到文件数组:listFile()

......

IO流的分类

按照流的方向来分

输入流和输出流

按照流动的数据类型来分

字节流和字符流

字节流

           输入流:顶级父类-InputStream

           输出流:顶级父类-OutputStream

字符流

           输入流:顶级父类-Reader

           输出流:顶级父类-Writer

字节流

输出流:顶级父类-OutputStream

将内存中的变量写到文件中

常用方法:

close() : 关闭流

flush():刷新缓冲

write(byte[] b)  :写出一个字节数组的所有内容

write(byte[] b,int off ,int len)  :写出一个字节数组,从off下标开始,写len个

write(int b)  :虽然传的是int,当作字节使用

最常用子类:FileOutputStream,其他所有子类写出的方法都是上面的write(..)方法;

每个FileOutputStream对象就表示向某个文件输出的流管道,可以通过对象向指定文件输出内容

使用方法:

直接创建对象,没有文件自动创建文件:

1.一次写一个字节

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象fos.write(65);//写1个字节  字节65对照askII码表对应为'A'fos.close();//关闭流

2.一次写一个字节数组 

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象byte[] b = {65,66,67,68,69}//创建一个字节数组fos.write(b);//写出1个字节数组fos.close();//关闭流

3.追加模式写 

FileOutputStream fos = new FileOutputStream("C://a.txt",true);//new对象,追加模式byte[] b = {65,66,67,68,69}//创建一个字节数组fos.write(b);//写出1个字节数组fos.close();//关闭流

没有追加的话(append=true),每次写出都会清空原文件内容

4.一次写一个字节数组的一部分

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象byte[] b = "ABCDEFG".getBytes();//创建一个字节数组,这里调用了字符串的getBytes()方法将字符串转换成了字节数组fos.write(b,1,2);//写出1个字节数组的一部分,从1下标开始写,写两个元素fos.close();//关闭流

输入流:顶级父类-InputStream

将硬盘中文件的内容读到程序中来

常用方法:

close() : 关闭流

flush():刷新缓冲

read():从文件中读取一个字节数据

read(byte[] b):将文件中的内容读取到字节数组中

最常用子类:FileInputStream

使用方法:

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde byte b = (byte) fis.read();//读取一个字节,返回是int类型需强转System.out.println(b);//97   与a对应//可以转成字符再打印System.out.println((char)b);//abyte b1 = (byte) fis.read();//再读取一个字节,返回是int类型需强转System.out.println(b1);//98  与b对应fis.close();

可以看到每次只能打印1个字节,解决办法,利用循环

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde while(true){    byte b = (byte)fis.read();    if(b==-1){//读到空的内容会返回-1        break;    }    System.out.println((char)b);//abcde}fis.close();

 一次读一组字节(常用)

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcdefghijklmnopqistuvwxyz //按照字节数组的长度进行读取byte[] b = new byte[10];//创建个长度10的字节数组//注意:每次读取的字节长度返回为int类型的变量int len = fis.read(b); //读取10个结果并放到数组中。结果是abcdefghijSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10len = fis.read(b); //读取10个结果并放到数组中。结果是klmnopqistSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10len = fis.read(b); //读取6个结果并放到数组中。结果是uvwxyzSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容6fis.close();

字符流

 输入流:顶级父类-Reader

常用方法:

close() : 关闭流

flush():刷新缓冲

read():读取一个字符,读取一组字符,注意:返回值int,返回的是读取的字符个数,如果读到文件尾部时返回-1

最常用子类:FileReader

输出流:顶级父类-Writer

常用方法:

close() : 关闭流

flush():刷新缓冲

write():这个方案可以传的参数有字符、字符数组、字符数组的一部分、字符串、字符串的一部分

append():追加一段文字,可以一直.append

最常用子类:FileWrite

转换流

将字节流转换为(装饰为)字符流:使用了装饰者设计模式

InputStreamReader  :将字节输入流转换为字符输入流

public class InputStreamReaderDemo {    public static void main(String[] args) throws IOException {        //将字节流转换为字符流        FileInputStream fis = new FileInputStream("D://a.txt");//假设这行代码是你从服务器获取到的字节流数据        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//参数1:是需要转换的对象,参数2:可以指定编码格式        while (true){            int c = isr.read();//read方法返回int类型,代表读取的字符个数,如果为-1,代表已经读完            if (c == -1){                break;            }            System.out.println((char) c);        }    }}

OutputStreamWrite   :将字节输出流转换为字符输出流

public class OutputStreamWriteDemo {    public static void main(String[] args) throws IOException {        FileOutputStream fos = new FileOutputStream("D://a.txt");        OutputStreamWriter osw = new OutputStreamWriter(fos);        osw.write("床前明月光");        osw.flush();        osw.close();    }}

方法2:采用打印流转换---PrintWriter

(字符输出)打印流

printStream
PrintStream printStream = new PrintStream("D://a.txt");        printStream.println("哈哈哈");        printStream.println("嘿嘿嘿");
PrintWriter----需要flush()刷新缓存
PrintWriter printWrite = new PrintWriter("D://a.txt");        printWrite.println("哈哈哈哈");        printWrite.flush();

缓存读取流

将字符输入流 转换为带有缓存 可以一次读取一行的缓存字符读取流

BufferedReader

可以读取一行字符 readLine();

转载地址:http://ghlai.baihongyu.com/

你可能感兴趣的文章
JS最佳实践——单例模式
查看>>
为php添加gd库支持
查看>>
$'\r': command not found
查看>>
bash脚本:一键安装MYSQL5.6
查看>>
javascript实现压缩图片
查看>>
webpack教程
查看>>
安装composer时出现 failed to open stream: HTTP request failed!的错误
查看>>
禁用HBuilderX自动更新
查看>>
C++字符串函数
查看>>
mknod详解
查看>>
linux中的run-level何解?
查看>>
Linux内核编译详解(转自linuxSir)
查看>>
实模式,保护模式与V86模式
查看>>
628. Maximum Product of Three Numbers(排序)
查看>>
Linux内核-------同步机制(一)
查看>>
485. Max Consecutive Ones(数组)
查看>>
287. Find the Duplicate Number(数组)
查看>>
Linux内核-------同步机制(二)
查看>>
面试题31-------连续子数组的最大和(数组)
查看>>
epoll 实现Chat
查看>>