Java的I/O流

一 JAVA语言中主要通过流来完成IO操作。

流:计算机的输入输出之间流动的数据序列,也是类的对象。java中的流方式就像是建立在数据交换源和目的之间的一条通信路径。

数据源:计算机中的数据源是指可以提供数据的地方,包括键盘,磁盘文件,网络接口等。

输入流:从程序外部传向程序的流。输入流只能从中读数据。

输出流: 从程序传到外部的流。输出流只能向其写入数据。

所谓的输入和输出是以程序为中心的,数据流向程序即输入流,数据从程序中流出即输出流。



二 字节流

字节流是以字节为传输单位的数据读写形式,用于直接读取二进制数据,如图像和声音文件等。

InputStream和OutputStream分别为面向字节的输入流类的父类和输出流类的父类。InputStream和OutputStream都是抽象类。

FileInputStream和FileOutputStream是文件流类,他们是InputStream和OutputStream的子类。

FileInputStream类的一般用法是:先创建一个FileInputStream对象关联到要读取的文件,然后调用read方法读取字节数据到程序中,再进行其他处理。因为read方法是按字节的读入的,所以汉字被读入时会出现乱码。

FileOutputStream类的一般用法是:先创建一个FileOutputStream对象关联到要写入的文件,然后调用write方法将字节数据写到程序中。如果进行写操作的文件不存在,则自动创建该文件,但是如果文件所在的路径也不存在,则运行时会报错。


字节流:一次读入或读出是8位二进制。

字符流:一次读入或读出是16位二进制。


例如 FileOutputStream fos = new FileOutputStream("D:\\test.txt");是不会报错的,

      FileOutputStream fos = new FileOutputStream("D:\\tmp\\test.txt");如果之前在D盘中没有tmp这个文件夹,那么此时运行这条语句会报错。

package 文件操作_FileInputStream和FileOutputStream;


package 文件操作_FileInputStream和FileOutputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("D:\\test.txt");
            int  ch = fis.read();
            while (ch != -1) {
                System.out.print((char) ch);
                ch = fis.read();
            }
//            byte[] buffer = new byte[8];
//            fis.read(buffer);
//            for (int i = 0; i < buffer.length; i++) {
//                System.out.print((char) buffer[i]);
//            }
            FileOutputStream fos = new FileOutputStream("D:\\test1.txt");
            byte[] b = {'a', 'c', 'd', 'e', 'x'};
            fos.write(b);
            fis.close();
            fos.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

}

缓存流 BufferedInputStream 和 BufferedOutputStream

使用缓存流可以提高大文件的读写效率。例如从文件读入数据时,每次从输入流中读取较大的数据量存入内存缓冲区,具体的读操作针对该缓冲区进行;执行缓冲输出时,每次将输出流中的数据写入到内存缓冲区,知道缓冲区写满,才将数据写入到最终的介质中。

使用缓存流的缺点:当计算机突然关闭时,可能会丢失数据。通过清空缓冲区的数据可以减少这种情况的发生,使用flush()方法即可。

代码如下

package 文件操作_BufferedInputStream;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("D:\\test.txt");
            BufferedInputStream bis = new BufferedInputStream(fis); //默认的输入缓冲区是2048B
            int ch = bis.read();
            while (ch != -1) {
                System.out.print((char)ch);
                ch = bis.read();
            }
                    
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

三 字符流

Reader 和 Writer类是所有字符流的父类。一次读取或是写入两个字节,16位,即一个Unicode字符,因此可以使用字符流直接读写汉字内容。

BufferedReader 和 BufferedWriter类的用法示例

package 文件操作_字符流_BufferedReader和BufferedWriter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedDemo {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("D:\\test.txt");
            BufferedReader br = new BufferedReader(fr);
            FileWriter fw = new FileWriter("D:\\test1.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            String str = br.readLine();
            while (str != null) {
                bw.write(str);
                bw.newLine();
                str = br.readLine();
            }
            br.close();
            bw.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

四 File文件类

File aa = new File(aaName); 这里的aa可以指向文件,也可以指向文件夹


在进行文件的操作时,若操作的对象是文件,那么在进行文件的创建,删除,复制之前,

(1)需要判断文件是否存在,
(2)以及File所指向的对象是一个文件还是一个文件夹(目录)
(3)该文件所在的文件夹是否存在,file.getParentFile().exists()
 (4)若文件所在的文件夹不存在,需要建立其父文件夹,若未建立成功,返回false
       if (!file.getParentFile().mkdirs()) return false;

在对文件夹(目录)进行操作时,

(1)首先判断 dirName 是不是以文件分隔符 File.separator结尾,如果不是,

     则 dirName += File.separator;

(2)需要判断 File dir = new File(dirName) 中的dir是不是存在以及指向的是不是一个文件夹 dir.exists() dir.isDirctory();
(3) 在对文件夹进行复制,删除等操作时,一般会用到递归,因为文件夹里面有时候会存在子文件夹。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值