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 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();

}

}

}

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

热门