Java学习提要——输入流与输出流基本操作

能对文件进行内容操作的只有两种途径“字符流”和“字节流

1.通过File类定义一个要操作的文件的路径; //如果操作不是文件,那么没有这一步
2.通过字节流或字符流的子类对象为父类对象实例化;
3.进行数据的读(输入),写(输出)操作;
4.数据流属于资源操作,资源操作必须关闭

java.io包定义的流
字节流(JDK1.0)InputStream、OutputStream
字符流(JDK1.1)Reader、Writer

1.输出流:Outputstream

OutputStream类是专门进行字节数据输出的一个类

//定义
public abstract class OutputStream
extends Object
implements Closeable,Flushable

可以注意到上面实现了两个接口:Closeable,Flushable

//Closeable接口,JDK1.5之后才提供
public interface Closeable
/*
JDK1.7引入自动关闭机制AutoCloseable
这个父接口定义如下:
public interface AutoCloseable {
    public void close() throws Exception ;
}
*/
extends AutoCloseable {  
    public void close() throws IOException;
}
//Flushable接口,JDK1.5之后
public interface Flushable {
    public void flush() throws IOException;
}

但是要注意的是,OutputStream类是在JDK1.0的时候就有提供的,
这个类原本就定义了close()与flush()两个操作方法
所以以上的两个接口几乎可以忽略了

//Outputstream类里面一共提供了三个输出方法
public abstract void write(int b) throws IOException;  //输出单个字节
public void write(byte[] b) throws IOException;  //输出全部字节数组
public void write(byte[] b,int off,int len) throws IOExeption;  //输出部分字节,重点!

要注意的是,OutputStream本身是一个抽象类,如果实例化操作,那么就要使用抽象类的子类,我们文件操作可以使用FileOutputStream子类:

//创建或覆盖已有文件:
public FileOutputStream(File file) throws FileNotFoundException;
//文件内容追加:
public FileOutputStream(File file,boolean append) throws FileNotFoundException;
//例子:
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
//略
public static void main(String args[]) throws Exception {  //抛出
    File file = new File("文件路径");
    //是否存在此路径,否则应先创建目录
    if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs();  //创建目录
    }
    //使用OutputStream和其他子类进行对象实例化,此时目录存在,文件还不存在
    OutputStream output = new FileOutputStream(file);  //如果要进行追加,那么就写成(file,true),就可以追加了
    //进行文件内容的输出
    String str = "good good study!";

    //1.输出单个字节
    byte data [] = str.getBytes() ;  //将字符串变成字符数组
    for (int x=0 ; x < data.length ; x++) {
        output.write(data[x]);  //将内容输出
    }

    //2.输出全部字节
    byte data [] = str.getBytes() ;  //将字符串变成字符数组
    output.write(data);  //将内容输出

    //3.输出部分字节
    byte data [] = str.getBytes() ;  //将字符串变成字符数组
    output.write(data,5,6) ;

    //资源操作最后,一定要进行关闭
    output.close();
}
/*
多说一句,如果追加换行,只要在字符串后面加上"\r、\n、\r\n"
根据不同操作系统,不一样
mac         \r
unix/linux  \n
windows     \r\n
*/

2.输入流:InputStream

程序需要进行数据的读取操作,可以利用InputStream类实现功能

//定义
public abstract class InputStream
extends Object
implements Closeable

虽然有接口Closeable,但是不用去考虑此接口的存在
在InputStream类里面,也有数据读取的方法

//读取单个字符:
public abstract int read() throws IOException;
//返回值:返回读取的字节内容,如果现在没有内容了,那么返回 -1

//将读取的数据保存在字节数组里:
public int read(byte[] b) throws IOException;
//返回值:返回读取的数据长度,但是读取到结尾,那么返回 -1

//将读取的数据保存在部分字节数组中:
public int read(byte[] b,int off,int len) throws IOexception;
//返回值:每次读取部分数据长度,如果已经读取到结尾了,返回 -1

InputStream是一个抽象类,所以如果进行文件的读取使用FileInputStream子类

构造方法:public FileInputStream(File file) throws FileNotFoundException;

//读取实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//略
public static void main(String args[]) throws Exception {
    File file = new File("文件路径");
    //判断文件是否存在
    if (file.exists()) {  //文件存在
        //使用InputStream读取
        InputStream input = new FileInputStream(file);
        byte data[] = new byte[1024] ;  //准备一个数组
        int len = input.read(data) ;  //将内容保存到字节数组里面
        //关闭输入流
        input.close();
        System.out.println("[" + new String(data,0,len) + "]");
    }
}
//单个字符读取实例:(使用while循环)
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//略
public static void main(String args[]) throws Exception {
    File file = new File("文件路径");
    //判断文件是否存在
    if (file.exists()) {  //文件存在
        //使用InputStream读取
        InputStream input = new FileInputStream(file);
        byte data[] = new byte[1024] ;  //准备一个数组
        int foot = 0;  //数组脚标
        int temp = 0;  //每次接收读取的字节数据
        while ((temp = input.read()) != -1) {  //read()方法将读取的字节内容给temp变量
            data[foot ++] = (byte) temp ;  //有内容时进行保存
        }
        //关闭输入流
        input.close();
        System.out.println("[" + new String(data,0,foot) + "]");
    }
}
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页