Java的IO操作
Java的文件IO操作:
有两种形式:字节流和字符流,字节流传输的是字节,返回的也是字节,而字符流传输的是字符,返回的也是字符。字节流可以处理任何数据,如音视频数据,而字符流仅能处理字符数据,如文本数据。
字符流操作
写字符到文件的例子:
import java.io.File;
import java.io.FileWriter;
public class FileWriteDemo {
/**
- 文件写操作
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File f =new File(“c:” + File.separator + “test.txt”);
//2.使用FileWriter对象实例化,并链接到指定文件
FileWriter fwr =new FileWriter(f, true);
String str =" hello boy";
fwr.write(str);
fwr.flush();
fwr.close();
}
}
读取字符类型的文件:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileDemo01 {
/**
- 文件读操作
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.使用File对象指定从哪个文件读出数据
File f =new File(“c:” + File.separator + “test.txt”);
// 2.定义输入流读入指定的文件
FileReader fr =null;
if (!f.exists()) {
System.out.print(“Cannot find the file specified”);
System.exit(1);
}
try {
fr =new FileReader(f);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// 3.开始读取数据到指定的缓冲区,读完后关闭输入流
char[] buf = new char[(int) f.length()];
try {
fr.read(buf);
fr.close();
}catch (IOException e) {
e.printStackTrace();
}
// 4.打印读出的内容
System.out.print(buf);
}
}
字节流操作
写字节到文件的例子:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo02 {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义写入的文件
File f =new File(“c:” + File.separator + “test.txt”);
// 定义一个输出流对象
FileOutputStream fos =null;
try {
// 将输出流指定到文件本身
fos =new FileOutputStream(f, true);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// 指定要写入的数据,将其转化为字节数组
String str =“hello world”;
byte[] b = str.getBytes();
try {
// 写入字节数组到输出流中
fos.write(b);
// 关闭输出流
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
Java的IO操作
读字节类型的文件的例子:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileDemo02 {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义要读出的文件
File f =new File(“c:” + File.separator + “test.txt”);
// 定义一个输入流对象
FileInputStream fis =null;
// 判断文件是否存在
if (!f.exists()) {
System.out.print(“the file is not exist”);
System.exit(1);
}
try {
// 将输入流指定到文件本身
fis =new FileInputStream(f);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// 指定一个字节数组来存储读出的字节
byte[] b = new byte[(int) f.length()];
try {
// 从字节输入流中读出字节到字节数组中
fis.read(b);
// 关闭输出流
fis.close();
}catch (IOException e) {
e.printStackTrace();
}
// 打印读出的字节并转换成字符显示
System.out.print(new String(b));
}
}
附:通常在文件较大时,可以采用如下方式一个一个的读取,防止内存不够或读取缓慢:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileDemo02 {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义要读出的文件
File f =new File(“c:” + File.separator + “test.txt”);
// 定义一个输入流对象
FileInputStream fis =null;
// 判断文件是否存在
if (!f.exists()) {
System.out.print(“the file is not exist”);
System.exit(1);
}
try {
// 将输入流指定到文件本身
fis =new FileInputStream(f);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// 指定一个字节数组来存储读出的字节
byte[] b = new byte[(int) f.length()];
try {
// 一个一个字节的读取
// 定义返回的字节
int temp = 0;
// 定义一个字节数组的长度
int len = 0;
// 循环读取,直到read()返回-1,即指明文件已经到末尾,读完
while ((temp = fis.read()) != -1) {
// 将读取的字节存入到字节数组中
b[len] = (byte) temp;
len++;
}
// 关闭输出流
fis.close();
}catch (IOException e) {
e.printStackTrace();
}
// 打印读出的字节并转换成字符显示
System.out.print(new String(b));
}
}
Java的IO操作
字符流需要缓冲区的支持,而字节流不需要缓冲区的支持即可对文件本身进行读写。其实缓冲区就是一块 内存区域。如果想要强制性的清空缓冲区,可以使用FileWriter.flush()方法。一般情况下,文件多是 二进制形式,所以字节流用的较多。
下面是一个文件复制的例子: 一次性读取然后一次性写入
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 判断命令是否正确
if (args.length != 2) {
System.out.println(“wrong command”);
System.out.println(“使用命令:FileCopy 源文件路径 目标文件路径”);
System.exit(1);
}
// 定义源文件和目标文件
File sf =new File(args[0]);
File df =new File(args[1]);
// 调用filecopy方法
fileCopy(sf, df);
}
public static void fileCopy(File sf, File df) {
// 定义输入流和输出流
FileInputStream fis =null;
FileOutputStream fos =null;
// 定义一个数据传输中间变量
byte[] buf = null;
// 判断源文件是否存在
if (!sf.exists()) {
System.out.println(“The source file is not exist”);
System.exit(1);
}
// 读取指定源文件的内容并存到中间变量
try {
fis =new FileInputStream(sf);
byte[] b = new byte[(int) sf.length()];
buf = b;
int len = 0, temp = 0;
while ((temp = fis.read()) != -1) {
b[len] = (byte) temp;
len++;
}
fis.close();
}catch (IOException e) {
e.printStackTrace();
}
// 将中间变量中的内容写入到目标文件中
try {
fos =new FileOutputStream(df);
fos.write(buf);
fos.close();
System.out.println(“success”);
}catch (IOException e) {
e.printStackTrace();
}
}
}
边读边写入
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
/**
- @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 判断命令是否正确
if (args.length != 2) {
System.out.println(“wrong command”);
System.out.println(“使用命令:FileCopy 源文件路径 目标文件路径”);
System.exit(1);
}
// 定义源文件和目标文件
File sf =new File(args[0]);
File df =new File(args[1]);
// 调用filecopy方法
fileCopy(sf, df);
}
public static void fileCopy(File sf, File df) {
// 定义输入流和输出流
FileInputStream fis =null;
FileOutputStream fos =null;
// 判断源文件是否存在
if (!sf.exists()) {
System.out.println(“The source file is not exist”);
System.exit(1);
}
// 指定源文件和目标文件并挂到输入流和输出流对象中
try {
fis =new FileInputStream(sf);
fos =new FileOutputStream(df);
// 边读边写入
int temp = 0;
while ((temp = fis.read()) != -1) {
fos.write(temp);
}
fis.close();
fos.close();
System.out.println(“copy success”);
}catch (IOException e) {
e.printStackTrace();
System.out.println(“copy fail”);
}
}
}
如果您觉得这个文章有意思,那么请分享并转发,或者也可以关注一下表示您对我们文章的认可与鼓励。我有一些架构视频资料和互联网公司java程序员面试涉及到的绝大部分面试题和答案做成了文档和架构视频资料还有完整高清的java进阶架构学习思维导图免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),省大家在网上搜索资料的时间来学习。需要的可以加我的Q群(472052538)