java中的I/O类(超详细)

目录

1.I/O

什么是流

I/O流的分类

2.File类

(1)概念

(2)File类中的方法

(3)拿到文件目录下的文件名

3.字节流

(1)概念

(2)InputStream

1.InputStream的方法

2.InputStream的子类FileInputStream

(3)FileOutputStream用法

4.字符流

(1)Reader

(2)Writer

(3)FileReader和FileWriter主要读字符时使用

5.处理流

(1)缓冲流

(2)缓冲流实现文本文件的复制


1.I/O

(1)Java的I/O包提供了丰富的类和方法来支持不同类型的流,输入流和输出流之间可以自由地进行转换。它们分别主要包括字节流和字符流两种类型。其中,字节流是操作二进制数据的流,可以处理任何类型的数据,常见的例如InputStream和OutputStream;字符流则是处理字符数据的流,其主要使用Reader和Writer接口。

(2)Java中的IO流可以对文件、网络套接字等的数据进行读写操作,这些操作涉及到打开、关闭、查找、修改和删除文件、创建及维护网络连接等等一系列活动。因此,掌握Java中IO流的知识,有助于我们实现更加高效准确地操作文件、网络数据等各种实用应用。

什么是流

在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)。

I/O流的分类

可以从三个不同的维度进行分类:

• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】

• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】

• 2、按照流的操作颗粒度划分

• 字节流:以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】

• 字符流:以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】

• 3、按照流的角色划分

• 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流。

• 处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能。

2.File类

(1)概念

在java包中File类是唯一一个可以代表磁盘文件的对象,File类的对象可以表示文件,还可以表示目录,通过调用File类的各个方法可以创建,删除或者重命名文件,判断某磁盘上文件是否存在等,File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作

(2)File类中的方法

File类的构造方法:

File(String pathname):通过指定的字符串类型文件路径创建一个File对象。

File f1=new File("aaa.txt");//表示在当前目录下创建一个与aaa.txt文件名相关连的文件对象.

File f2=new File("D:\\java\\Hello.java");//指明详细路径及文件名,用双斜杠或者反斜杠

举例:

(3)拿到文件目录下的文件名

3.字节流

(1)概念

InputStream 是所有的输入字节流的父类,它是一个抽象类被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。 

(2)InputStream

1.InputStream的方法

int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1

int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目

int read(byte[] b,int off,int len) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目

void close() 关闭此输入流并释放与该流关联的所有系统资源

前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取。
进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源。

2.InputStream的子类FileInputStream

(1)FileInputStream的1个字节读入法

​
package FineDeom1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDeom2 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream=new FileInputStream("D:/deom.tex");
        FileOutputStream fileOutputStream=new FileOutputStream("E:/deom.tex");
        byte[] bytes =new byte[10];
        //文件内容读取完后返回一个-1
        int size=0;//每次实际装入的元素个数
        while((size=inputStream.read(bytes))!=-1)
        {  //一次向外写出
            fileOutputStream.write(bytes,0,size);

        }
        inputStream.close();
        fileOutputStream.close();
    }


}

​

(2)7.FileInputStream的byte[]读入法

package FineDeom1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDeom2 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream=new FileInputStream("D:/deom.tex");
        FileOutputStream fileOutputStream=new FileOutputStream("E:/deom.tex");
        byte[] bytes =new byte[10];
        //文件内容读取完后返回一个-1
        int size=0;//每次实际装入的元素个数
        while((size=inputStream.read(bytes))!=-1)
        {  //一次向外写出
            fileOutputStream.write(bytes,0,size);

        }
        inputStream.close();
        fileOutputStream.close();
    }


}

(3)FileOutputStream用法

  public static void writeByteToFile() throws IOException{
        String hello= new String( "hello word!");
         byte[] byteArray= hello.getBytes();
        File file= new File( "d:/test.txt");
         //因为是用字节流来写媒介,所以对应的是OutputStream 
         //又因为媒介对象是文件,所以用到子类是FileOutputStream
        OutputStream os= new FileOutputStream( file);
         os.write( byteArray);
         os.close();
  }
4.字符流

读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾,字符流对应的类应该是Reader和Writer。

(1)Reader
public static void writeCharToFile() throws IOException{
        String hello= new String( "hello word!");
        File file= new File( "d:/test.txt");
         //因为是用字符流来读媒介,所以对应的是Writer,又因为媒介对象是文件,所以用到子类是FileWriter
        Writer os= new FileWriter( file);
         os.write( hello);
         os.close();
  }
(2)Writer
  public static void readCharFromFile() throws IOException{
        File file= new File( "d:/test.txt");
         //因为是用字符流来读媒介,所以对应的是Reader
         //又因为媒介对象是文件,所以用到子类是FileReader
        Reader reader= new FileReader( file);
         char [] byteArray= new char[( int) file.length()];
         int size= reader.read( byteArray);
        System. out.println( "大小:"+size +";内容:" +new String(byteArray));
         reader.close();
  }
(3)FileReader和FileWriter主要读字符时使用
package FileReaderDeom1;
import java.io.*;

public class CharDemo2 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader=new FileReader("D:/demo1.txt");
        FileWriter fileWriter=new FileWriter("D:/demo2.txt",true);//
        BufferedReader bufferedReader=new BufferedReader(fileReader);
        BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
        String size=null;
        while ((size=bufferedReader.readLine())!=null)
        {
            bufferedWriter.write(size);
            bufferedWriter.newLine();//插入换行符
        }
        bufferedReader.close();
        bufferedWriter.flush();
        bufferedWriter.close();
    }
}

注意:上述代码用处理流对FileReader和FileWriter进行包装,可以一行一行的读和一行一行的写。

5.处理流
(1)缓冲流

缓冲流(内部提供了一个缓冲区)能有效提高文件读写效率。

但要注意缓冲流不能直接作用于文件上,能够直接作用于文件上的是节点流(FileInputStream、FileOutputStream、FileReader、FileWriter是节点流)。处理流是套接在节点流上对节点流进行包装进行处理的流。

缓冲流有:

处理字节:BufferedInputStream、BufferedOutPutStream
处理字符:BufferedReader、BufferedWriter

(2)缓冲流实现文本文件的复制

使用BufferedReader、BufferedWriter(不能处理非文本文件)

package Work;
import java.io.*;
import java.util.*;

public class Work2 {
    public static void main(String[] args) {
        ArrayList<String> lines = new ArrayList<>();
        try {
            FileReader fileReader=new FileReader("D:/shi.txt");
            BufferedReader bufferedReader=new BufferedReader(fileReader);
            String size=null;
            while ((size=bufferedReader.readLine())!=null)
            {
                lines.add(size);
            }
            Collections.sort(lines);//排序
            File file=new File("D:/paixv.txt");
            if(!file.exists())
            {
                file.createNewFile();
            }
            FileWriter fileWriter=new FileWriter("D:/paixv.txt");
            BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
           for(String a:lines)
           {
               bufferedWriter.write(a);
               bufferedWriter.newLine();
           }
           bufferedWriter.flush();
           bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

例如对此文件中的诗句进行排序后,再复制到另一个文件中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值