Java-IO框架-文件输入输出流

时间:2021-04-19 21:33:04

什么是数据流


如水流一样,可以流淌,搬运。
水流流动的是水,数据流流动的是数据。

》》流的概念:
在 Java 中,把所有的输入和输出都当做流来处理。
“ 流 ” 是一个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。
“ 流 ” 屏蔽了实际的输入 / 输出设备中处理数据的细节。
一个程序可以打开一个数据源上的流,然后按顺序读取这个流中的数据到程序中,这样的流称为输入流。
一个程序也可以打开一个目的地的流,然后按顺序的把程序中的数据写入到这个目地中,这样的流称为输出流。

简而言之:
读进程序来 叫 输入流。
从程序写出 叫 输出流。

特别注意

输入输出是相对程序而言的。

》》流的分类:

  • 按流向分:
    输入流: 程序可以从中读取数据的流。
    输出流: 程序能向其中写入数据的流。
  • 按数据传输单位分:
    字节流: 以字节为单位传输数据的流
    字符流: 以字符为单位传输数据的流
  • 按功能分:
    节点流: 用于直接操作目标设备的流
    过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

文件的创建
这里用到File类,引用java.io.File类
在E盘根目录下创建一个名为 test1 的 txt 文件。

package edu.gaoxinrencaishixun.prac;
import java.io.File;
import java.io.IOException;
public class FilesCreate {
public static void main(String[] args) {
File f1 = new File("E:/test1.txt");
//判断此文件在E盘根目录下是否存在
if(f1.exists()){
System.out.println("canRead:"+f1.canRead());
System.out.println("文件存在于["+f1.getPath()+"]");//getPath()获取文件路径
}//如果不存在,创建
else{
System.out.println("文件不存在");
try {
f1.createNewFile();
System.out.println("文件已经创建在["+f1.getPath()+"]");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

创建了文件之后,就可以使用输入输出流进行数据的操作了。
FileOutputStream 文件输出流
FileInputStream 文件输入流
我们要向test1.txt中添加一条数据,由程序将数据写出,显然我们要用到文件输出流。

package edu.gaoxinrencaishixun.prac;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//用字节流向创建的文件中写入数据
public class PutInToFile {
public static void main(String[] args) {
//创建文件对象,明确目的文件
File f2 = new File("E:/test1.txt");
try {
//创建输出流对象fos
FileOutputStream fos = new FileOutputStream(f2);
String str="123abc**1";
//将字符串以字节流方式
byte[] output = new byte[10];
output = str.getBytes();
try {
//写入文件
fos.write(output);
System.out.println("写入完成");
//释放资源
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

通过文件输入流,我们可以把文件的数据读出。

package edu.gaoxinrencaishixun.prac;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class OutFromFile {
//用字节流从创建的文件中读入数据
public static void main(String[] args) {
File f3 = new File("E:/test1.txt");
try {
FileInputStream fis = new FileInputStream(f3);
byte[] input = new byte[10];//这里的自己数一定要大于文件字节大小,否则不能完全读入
try {
//获取数据的字节长度
int len = fis.read(input);
//数据转换为字符串
String str = new String(input,0,len);
System.out.println(str);
System.out.println("读取完成");
//释放资源
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

通过 文件的输入输出流 我们可以 进行的文件(不仅仅是txt文档,图片,音频甚至视频)的复制。
使用字节流的进行输入输出

package edu.gaoxinrencaishixun.prac;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopybyByte {
public static void main(String[] args) {
File f4 = new File("E:/test1.txt");
//先从文件读入
try {
FileInputStream fis = new FileInputStream(f4);
FileOutputStream fos = new FileOutputStream("E:/test2.txt");//此文件会自行创建
//以字节流读进来
byte[] input = new byte[10];
try {
while(fis.read(input)!=-1){
fos.write(input);
}
System.out.println("复制完成");
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

使用字符流的进行输入输出

package edu.gaoxinrencaishixun.prac;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class FileCopyByChar {

public static void main(String[] args) {
File f5 = new File("E:/test1.txt");
try {
FileInputStream fis = new FileInputStream(f5);
FileOutputStream fos = new FileOutputStream("E:/test3.txt");
InputStreamReader isr = new InputStreamReader(fis);
OutputStreamWriter osw = new OutputStreamWriter(fos);
char[] input = new char[10];
int len ;
while((len = isr.read(input))!=-1){
osw.write(input,0,len);
}
System.out.println("复制完成");
osw.close();
isr.close();
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

使用带缓冲区的输入输出流,完成文件的复制

package edu.gaoxinrencaishixun.prac;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileCopyByBuffer {
//带缓冲区的输入输出,完成文件的复制
public static void main(String[] args) {
File f6 = new File("E:/test5.txt");
try {
FileInputStream fis = new FileInputStream(f6);
FileOutputStream fos = new FileOutputStream("C:/Users/16121/Desktop/test/543.txt");
InputStreamReader isr = new InputStreamReader(fis);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(osw);
String input;
while((input = br.readLine())!=null){
bw.write(input+"\r\n");
}
System.out.println("复制成功");
//先使用的后关闭
br.close();
bw.close();
osw.close();
isr.close();
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

相关文章