java(8):输入输出流

目录

8.1 流的概念

8.1.1 流的分类

8.1.2 流的处理工程

8.2 写流时用到的辅助类

8.2.1 File类

8.2.2 byte类

(1)读取时:

(2)写入时:

8.3 对字节流操作:InputStream(读取)OutputStream(写入)

8.3.1 抽象类:InputStream类(读取)

8.3.2 实例化:FileInputStream

8.3.3 抽象类:OutputStream(写入)

8.3.4 实例化:FileOutputStream

(1)覆盖式写入:

(2)续写式写入:

8.4 对字符流操作:Reader类、Writer类

8.4.1 抽象类:Reader

8.4.2 实例化:FileReader(读取)

8.4.3 抽象类:Writer(写入)

8.4.4 实例化:FileWriter

(1)覆盖式写入:

(2)续写式写入:

8.1 流的概念

Java 语言采用流的机制来实现输入/输出。所谓流,就是数据的有序排列。
而流可以是从某个源(称为流源,Source of Stream)出来,到某个目的地(称为流汇 ,Sink of Stream)去的。

8.1.1 流的分类

  1. 流向分:输入流、输出流
  2. 流源分:字符流、字节流
  3. 功能分:节点流、处理流

java 中统一将流的类放在 java.io 包下。

8.1.2 流的处理工程

有两个分别是:FileInputStream、FileoutputStream. 

1、Java 中可以使用 FileInputStream 从一个文件中读取数据,FileInputStream 就是一个流处理器

2、类似的也可以通过FileOutputStream向一个文件中写入数据。

3、Java 中提供了一种称作为链接的机制,可以将一个流处理器与另一个流处理器首尾相连,形成一个流管道的链接。

8.2 写流时用到的辅助类

8.2.1 File类

输入输出流的载体是文件

File类用于封装系统的文件和目录的相关信息。在该类中定义了一些与平台无关的方法来操作文件。例如文件的大小、修改时间、文件路径等。

//创建File对象的三种方法
new File (String pathName);
 
File file = new File("E://1.txt");
//parent :父抽象路径名   child:子路径名字符串
new File(String parent , String child);

方法:

返回方法说明
StringgetName获取文件名称
StringgetParent获取文件的父路径字符串
StringgetPath获取文件的相对路径字符串
StringgetAbsolutePath获取文件的绝对路径字符串
booleanexists判断文件或者文件夹是否存在
booleanisFile判断是不是文件类型
booleanisDirectory判断是不是文件夹类型
booleandelete删除文件或文件夹,如果删除成功返回结果为true
booleanmkdir创建文件夹,创建成功返回true
booleansetReadOnly设置文件或文件夹的只读属性
longlength获取文件的长度
longlastModified获取文件的最后修改时间
String[ ]list获取文件夹中的文件和子文件夹的名称,并存放到字符串数组中

注意:在使用delete()方法删除File对象时,如果删除的对象是目录,该目录中的内容必须为空。

8.2.2 byte类

(1)读取时:

byte byt[] = new byte[1024]; //1024是什么意思

byte数组的初始化,数组的长度为1024, 代码看来表达的是每次从文件读取1024个字节
8bit(位)是1byte(字节)
1024byte(字节)是1kb
byte[] bytes = new byte[1024]是1kb

(2)写入时:

new String(byt, 0, len); //这里的0是什么意思

这是将字节数组中角标为 0 到角标为 len-1 转化为字符串。
第一个byt参数就是你定义的数据名;
第二个0就是从数组里角标为0(也就是第一位)开始转换字符串;
第三个len就是你读取文件所读到的字节个数。

8.3 对字节流操作:InputStream(读取)OutputStream(写入)

8.3.1 抽象类:InputStream类(读取)

方法:

返回方法说明
intavailable()返回当前输入流的数据读取方法可以读取的有效字节数量
Abstract intread()从当前数据流中读取一个字节。若已达到流结尾,则返回-1
intread(byte[ ] bytes)从当前输入流读取一定的byte数据,并存取在数组中,然后返回读取的byte数据的数量,若已到达流结尾,则返回-1。
voidreset()将当前的输入流重新定位到最后一次调用mark()方法时的位置
voidmark(int readlimit)在当前输入流中做标记位置,当调用reset()方法时将返回到该位置,从标记位置开始,到再读入readlimit个字符为止,这个标记都维持有效。
BooleanmarkSupported()测试当前输入流是否支持mark()和reset()方法,只要其中一个不支持,则返回false
longskip(long n)跳过和丢弃当前输入的n个字节数据
voidclose()关闭当前输入流,并释放任何与之相关联的系统资源
createNewFile()创建同名文件!

8.3.2 实例化:FileInputStream

注意:

1、File得到文件名

2、read读取字节

3、new String(bytes2, 0, len) 实现将字节转换成字符串输出

package aaa;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * 创建OutputStream实例out,并将其赋值为System.out标准输出流,通过write方法向流中写入数据
 */
public class FileCreate {
    public static void main(String[] args) {
        File file = new File("D:/", "word.txt");  //创建文件对象
        
        try {
            FileInputStream input = new FileInputStream(file);
            byte[] bytes2 = new byte[1024];
            int len = input.read(bytes2); //获取字节长度
            System.out.println("文件中的信息是:" + new String(bytes2, 0, len)); //将字节转化成字符串输出!!!因为我们要的是字符串!
            input.close();
        } catch (FileNotFoundException e)
        {
          
           System.out.println("文件不存在或者文件不可读或者文件是目录");
        }
        catch (IOException e)
        {
           System.out.println("读取过程存在异常");
        } 
    }
}

8.3.3 抽象类:OutputStream(写入)

返回方法说明
voidwrite(byte[ ] b)将byte[ ] 数组中的数据写入当前输出流
voidwrite(byte[] b ,int off, int len)将byte[ ]数组下标off开始的len长度的数据写入当前输出流
Abstract voidwrite(int b)写入一个byte数据到当前输出流
voidflush()刷新当前输出流,并强制写入所有缓冲的字节数据
voidclose()关闭当前输出流

8.3.4 实例化:FileOutputStream

(1)覆盖式写入:

创建FileOutputStream流以写入数据到File对象表示的文件。 如果第二个参数为FLASE(默认),则字节将覆盖式写入。 

将内容写入文件!用的时write方法!
package aaa;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * 创建OutputStream实例out,并将其赋值为System.out标准输出流,通过write方法向流中写入数据
 */
public class FileCreate {
    public static void main(String[] args) {
        File file = new File("D:/", "word.txt");  //创建文件对象
        try {
            if (!file.exists()) {               //如果文件不存在则新建文件
                file.createNewFile();           
            }
            FileOutputStream output = new FileOutputStream(file);
            byte[] bytes = "Java数据交流管道".getBytes();  //根据上方的图可知,流之间交换的是字节,所以这句话的含义是将文字转换成字节
            output.write(bytes);                //将数组的信息写入文件中,多次运行直接覆盖之前的内容!
            output.close();  //一定要关闭!!
        } catch (FileNotFoundException e)
        {
          
           System.out.println("文件不存在或者文件不可读或者文件是目录");
        }
        catch (IOException e)
        {
           System.out.println("读取过程存在异常");
        } 
   }}

(2)续写式写入:

创建FileOutputStream流以写入数据到File对象表示的文件。 如果第二个参数为TRUE,则字节将覆盖式写入。 

实例:

8.4 对字符流操作:Reader类、Writer类

8.4.1 抽象类:Reader

方法:

返回方法说明
booleanready()判断此数据流是否准备好
intread()读入一个字符,若已读到流结尾,则返回值为-1
intread(char[ ])读取一些字符到char[ ]数组内,并返回所读入的字符的数量,若已到达流结尾,则返回-1
Abscract intread(char[ ] chars,int off,int len)读取一些字符到char[ ]数组下标从off开始到off+len的位置,并返回所读入的字符的数量,若已到达流结尾,则返回-1;
voidreset()将当前输入流重新定位到最后一次mark()方法时的位置
voidmark(int readLimit)将当前输入流中做标记,当调用reset方法时将返回到该位置,从标记位置开始,到再读入readLimit个字符为止,这个标记都维持有效
booleanmarkSupported测试当前输入流是否支持mark()方法和reset()方法。只要有一个方法不支持,则返回-1
longskip(long n)跳过参数n指定的字符数量,并返回所跳过字符的数量
Abstract voidclose()关闭字符输入流,并释放与之关联的所有资源

8.4.2 实例化:FileReader(读取)

package aaa;
 
import java.io.File;
import java.io.FileReader;
 
public class FileInAndOut {
    public static void main(String[] args) {
        //定义指定磁盘的文件的File对象
        File file = new File("D://word.txt");
        if(! file.exists()){
            System.out.println("对不起,不包含指定路径的文件");
        }else{
            //根据指定路径的File对象创建FileReader对象
            try {
                FileReader fr = new FileReader(file);
                char[] data = new char[23];         //定义char数组
                int length = 0;
                while((length = fr.read(data))>0){          //循环读取文件中的数据
                    String str = new String(data,0,length);         //根据读取文件的内容创建String 对象
                    System.out.println(str);                //输出读取内容
                }
                fr.close();                             //关闭流
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

8.4.3 抽象类:Writer(写入)

方法:

返回方法说明
voidwrite(char[ ] cbuf)将字符数组的数据写入字符输出流
Abstract voidwrite(char[ ] cbuf int off ,int len)将字符数组从下标off 开始向输入流写入长度为len的数据
voidwrite(int c )向字符输入流中写入一个字符数据
voidwrite(String str )向输入流中写入一个字符串数据
voidwrite(String str , int off ,int len)向输入流中写入一个字符串从off 开始长度为len的数据
Abstract voidflush()刷新当前输出流,并强制写入所有缓冲区的字节数据
voidclose()向输出流中写入缓冲区的数据,然后关闭当前输出流,释放所有与当前输出流相关联的系统资源

8.4.4 实例化:FileWriter

(1)覆盖式写入:

【和字节流中的一样】

FileWriter fw = new FileWriter(file);  

package aaa;
/**
 * 通过给定的String类型参数的指定文件名称与路径,创建FileWriter类
 */
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class FileWriterDemo {
    public static void main(String[] args) {
        File file = new File("D://4.txt");      //创建指定文件
        try {
        if(! file.exists()){
                file.createNewFile();               //如果指定文件不存在,新建文件
        }
        FileReader fr = new FileReader("D://4.txt");
        FileWriter fw = new FileWriter(file);               //创建FileWriter对象

        fw.write("12345");           //向文件写入数据
        fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
(2)续写式写入:

FileWriter fw = new FileWriter(file,true);  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值