输入与输出流

一、什么是流?

在java中, 将一组数据的有序序列称为流。流分为输入流和输出流。一般以Java程序为基准,进入程序中的数据序列称为输入流;从程序中离开的数据序列称为输出流。或者说,程序从输入流读取数据,向输出流写入数据

二、流的分类

1、抽象父类

1.InputStream类

1)int read()throws IOException:从输入流中读一个字节,形成一个0~255的整数返回。它是一个抽象方法,必须在具体的子类中被实现。

2)int read(byte b[]):从输入流中读多个字节到数组b中。当数组满时或输入流中不再有数据时返回。返回实际读取的字节数。

3)int read(byte b[],int off,int len):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取的字节数。

4)public void close() throws IOException:关闭此输入流并释放与流关联的所有系统资源

其中前三个方法若返回-1,则表示流结束

2.OutputStream类

1)void write(int b):将指定的字节写入此输出流。要写入的字节是参数b的8个低位,b的24个高位将被忽略,即写入范围为0~255它是一个抽象方法,必须在具体的子类中被实现。

2)void write(byte[]b):将b.length个字节从指定的byte数组写入此输出流。

3)void write(byte[]b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入输出流。(往输出流依次写出字节组b中的从索引off开始的len个字节)

4)public void flush()throws IOException:刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示将这些字节立即写入他们的预期目标。

5)public void close() throws IOException:关闭此输出流并释放与流关联的所有系统资源

3.Reader类

1)int read():从输入流中读一个字符,java采用Unicode编码为每个字符分配2字节的存储空间,故read()方法将返回读取的2字节字符数据的Unicode编码,即以int型返回。如果已达末尾,则返回-1。它是一个抽象方法,必须在具体的子类中被实现。

2)int read(char[]cbuf}):从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。如果已达末尾,则返回-1

3)int read(char[]cbuf,int off,int len):读入len个字符,存入cbuf[off]开始的字符数组元素中。 如果已达末尾,则返回-1。

4)public void close() throws IOException:关闭此输入流并释放与流关联的所有系统资源。

4.Writer类

1)void write(int c):将单个指定字符输出到指定的输出流。

2)void write(char[]cbuf):将字符数组cbuf的数据输出到指定的输出流。

3)void write(char[]cbuf,int off,int len):将字符数组cbuf从off位置开始的len个字符输出到指定流。

4)void write(String str):将str字符串的字符输出到指定的输出流。

5)void write(String str,int off,int len):将str字符串从off位置开始的len个字符输出到指定流。

6)void flush():刷新该流的缓冲区。

7)public void close() throws IOException:关闭此输出流并释放与流关联的所有系统资源。

2、文件输入输出流

该类只能按照本地平台默认的字符编码规范读取数据(字符),用户不能指定其他字符编码类型。

1.FileReader

FileReader类构造方法的参数是磁盘文件,确定了数据源。其构造方法有:

1)FileReader(File file):在给定从中读取数据的文件名的情况下创建一个新的FileReader。

2)FileReader(String fileName):在给定从中读取数据的File的情况下创建一个新的FileReader。

FileReader类中可用的方法有:read()返回输入字符,read(char[]buffer)输入字符到字符数组中等。这些方法是从Reader类间接继承下来的,因此,其用法与Reader类中相应的读方法相同

2.FileWriter

FileWriter类构造方法的参数是磁盘文件,确定了数据目的地。其构造方法包括:

1)FileWriter(String fileName):根据给定的文件名构建一个FileWriter对象。

2)FileWriter(String fileName,boolean append):若使用构造器FileWriter(file, true),则目录下的同名文件不会被覆盖,在文件末尾追加内容。

3)FileWriter(File file):根据给定的File对象构造一个FileWriter对象,写入文件时目录下有同名的文件将被覆盖。

4)FileWriter(FileDescriptior fd):构造与某个文件描述相关联的FileWriter对象。

5)FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象。

package com.elif.two;
​
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
​
public class File02 {
    public static void main(String[] args) {
        String str = "春眠不觉晓\n";
        char[] ch = str.toCharArray();
        FileWriter fw = null;
        FileReader fr = null;
        try{
            fw = new FileWriter("春晓.txt");
            fw.write(ch);
            fw.write("处处闻啼鸟\n");
            fw.write("夜来风雨声\n");
            fw.write("花落知多少\n");
            fw.close();
        } catch (IOException e) {
            System.err.println("流的创建、写和关闭都有可能产生IOException");
            System.exit(-1);
        }
        try {
            fr = new FileReader("春晓.txt");
            int i;
            while ((i=fr.read()) != -1) {
                System.out.println((char) i);
            }
            System.out.println();
            fr.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到!");
            System.exit(-2);
        } catch (IOException e) {
            System.out.println("读和关闭都可能产生IOException异常。");
            System.exit(-3);
        }
    }
}

package com.elif.two;
​
import java.io.IOException;
import java.io.*;
​
public class File01 {
    public static void main(String[] args) throws IOException {
        //创建File实例,使其表示目录d:\myDir
        File myDir = new File("d://myDir");
        if(! myDir.exists())
            myDir.mkdir();
        //如果目录d:\myDir不存在,创建File实例,使其表示目录d:\myDir\myDir1
        File myDir1 = new File(myDir,"myDir1");
        if(! myDir1.exists())
            myDir1.mkdirs();
        //创建File市里面,使其表示文件d:\myDir\myDir1\my.txt
        File file = new File(myDir1,"my.txt");
        if(! file.exists())
            file.createNewFile();//如果文件不存在,创建它
        listDir(myDir);//查看目录
    }
    static void listDir(File dir) {
        File[] listF = dir.listFiles();
        //打印当前目录下包含的所有子目录和文件的名字
        String info ="目录:"+dir.getName() + "{";
        for(int i=0;i<listF.length;i++) {
            info +=listF[i].getName();
            info +="}";
        }
        System.out.println(info);
        //打印当前目录下包含的所有子目录和文件的信息
        for(int i=0;i<listF.length;i++) {
            File f = listF[i];
            if(f.isFile())
                printFileInfo(f);
            else
                listDir(f);//如果为目录,就递归调用listDir()方法
        }
    }
    static void printFileInfo(File f) {
        System.out.println("文件名:"+f.getName());
        System.out.println("文件路径:"+f.getParent());
        System.out.println("文件可读?:"+f.canRead());
        System.out.println("文件长度:"+f.length()+"字节");
    }
}
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值