- 如何读写文件?
通过流来读写文件:流是指一连串流动的字符,是以先进先出方式发送信息的通道 - 读入(read Input);
- 写出(write Output);
- java中一个字符(Unicode2个字节),一个二进制字节(8位);
一、JAVA流的分类:
二、用FileInputStream和FileOutStream读写文本文件(字节流):
①用FileInputStream读入文件:
测试:把文件中的信息读取到计算机内存中,现在在f盘有一个txt文件,要将它在控制台输出
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class FileInputDemo {
public static void main(String[] args) {
// 1.创建字节输入流
InputStream fis = null;
try {
fis = new FileInputStream("f:/这是一个文件.txt");
// 2.实现读取操作
int data;// 存储读到的字节
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 3.关闭流
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
输出结果:
使用字节数组方式:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class FileInputDemo {
public static void main(String[] args) {
// 1.创建字节输入流
InputStream fis = null;
try {
fis = new FileInputStream("f:/这是一个文件.txt");
// 2.实现读取操作
// int data;// 存储读到的字节
// while ((data = fis.read()) != -1) {
// System.out.print((char) data);
// }
int len;// 存储读入数组的长度
byte[] words = new byte[1024];
while ((len = fis.read(words)) != -1) {
System.out.println(fis.available());
System.out.print(new String(words, 0, len));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 3.关闭流
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
InputStream类常用方法(抽象):
- int read();//返回读到的字节(以十进制显示出来)
- int read(byte[] b);//把读到的字节暂储到字节数组中(返回的是读入的字节数组的长度)
- int read(byte[] b,int off,int len);//从off作为起始位置读入len长度的字节数组
- void close(); // 关闭一个流
- int avaailable();//当前还有多少字节没有读
子类FileInputStream常用的构造方法:
- FileInputStream(File file); //还用File对象进行构造
- FileInputStream(String name);//直接使用文件路径进行构造
②用FileInputStream写出文件:
测试:现在尝试写出数据,使用代码在f盘创建一个Hello.txt文件,并尝试向其中写入数据:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class FileOutputStreamDemo {
public static void main(String[] args) {
// 1.创建字节输出流
OutputStream fis = null;
try {
fis = new FileOutputStream(new File("f:/Hello.txt"));
//fis = new FileOutputStream(new File("f:/Hello.txt"),true);//追加写
// 2.执行写操作
String str = "好好学习Java吧!";// 要写出的字符串
byte[] words = str.getBytes();// 将字符串转换为字节数组
fis.write(words);
//fis.write(words, 0, words.length);//也可以用write的重载方法写
System.out.println("Hello文件已更新!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("创建文件时出错!");
} finally {
// 3.关闭流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
测试结果:
OutputStream类常用方法:
- void write(itn c);
- void write(byte[] bug);
- void write(byte[],int off,int len);
- void close();
子类FileOutputStream常用的构造方法:
- FileOutputStream(File file);
- FileOutStream(String name);
- FileOutputStream(String name,boolean append);
1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容。
2.创建FileOutStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
三、用FileInputStream和FileOutStream实现copy功能(字节流):
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class InputAndOutputFile {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 创建输入流对象,负责读取f:/晚上好.txt
fis = new FileInputStream("f:/晚上好.txt");
// 创建输出流对象,
fos = new FileOutputStream("f:/Hello.txt", true);
// 创建中转站数组,存放每次读取的内容
byte[] words = new byte[1024];
int len;// 记录读取的长度
// 通过循环实现文件读取
while ((len = fis.read(words)) != -1) {
fis.read(words);
fos.write(words, 0, len);
}
System.out.println("复制完成,请产看文件。");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样就将f:/晚上好.txt文件中的数据赋值到f:/Hello.txt文件中啦!代码中避免了先吃一个数据和输出多余空格两个问题。