我们都知道java文件操作有很多种情况,这里我们就其中很常用的方法来进行实现。
1.采用BufferedReader和BufferedWriter来进行文件的读写(按行来读写)
package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 读取一个文件,并将里面的内容处理以后保存到指定文件下
*
* @author WEI 哥
*
*/
public class Fibonacci {
public static void main(String[] args) throws IOException {
File file = new File("D://hello.txt");
File file2 = new File("D://hello2.txt");
if (!file2.exists()) {
file2.createNewFile();
}
InputStreamReader reader = null;
BufferedReader read = null;
OutputStreamWriter writer = null;
BufferedWriter write = null;
try {
reader = new InputStreamReader(new FileInputStream(file), "GBK");
read = new BufferedReader(reader);
writer = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
write = new BufferedWriter(writer);
String string = "";
while ((string = read.readLine()) != null) {
StringBuffer sb = new StringBuffer("");
String[] arr = string.split(",");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "$");
}
/*
* 将修改后的内容保存在hello2.txt
*/
write.write(sb.toString()+"\r\n");
//write.write(sb.toString()); write.newLine();
}
write.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
reader.close();
if (read != null)
read.close();
if (writer != null)
writer.close();
if (write != null)
write.close();
}
}
}
2. 采用OutputStreamWriter和InputStreamReader来读写文件(按字符来读写)
package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 读取一个文件,并将里面的内容处理以后保存到指定文件下
*
* @author WEI 哥
*
*/
public class Fibonacci {
public static void main(String[] args) throws IOException {
File file = new File("D://hello.txt");
File file2 = new File("D://hello2.txt");
if (!file2.exists()) {
file2.createNewFile();
}
InputStreamReader reader = null;
OutputStreamWriter writer = null;
try {
reader = new InputStreamReader(new FileInputStream(file), "GBK");
writer = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
int str = 0;
//当读到不存在的时候,reader.read()会返回-1
while ((str = reader.read()) != -1) {
StringBuffer sb = new StringBuffer("");
/*
* 这里需要将对应的ascii码进行回转,转化为原来的字符
*/
sb.append((char)str);
writer.write(sb.toString()+"\r\n");
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
reader.close();
if (writer != null)
writer.close();
}
}
}
3. 采用FileWriter和FileReader来实现(和方法二差不多,但是可能会出现中文乱码,解决方式就是采取第二种方式/设置文本编码格式和编译器一致,我这里都是设置的为UTF-8)
package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 读取一个文件,并将里面的内容处理以后保存到指定文件下
*
* @author WEI 哥
*
*/
public class Fibonacci {
public static void main(String[] args) throws IOException {
File file = new File("D://hello.txt");
File file2 = new File("D://hello2.txt");
if (!file2.exists()) {
file2.createNewFile();
}
FileReader reader=null;
FileWriter writer=null;
try {
reader = new FileReader(file);
writer = new FileWriter(file2);
int str = 0;
while ((str = reader.read()) != -1) {
StringBuffer sb = new StringBuffer("");
//必须设置文本的编码格式和编译器一致,否则中文会乱码
sb.append((char)str);
writer.write(sb.toString()+"\r\n");
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
reader.close();
if (writer != null)
writer.close();
}
}
}
4. 采用FileInputStream和FileOutputStream来进行读写(按字节流来读写)
package day01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 读取一个文件,并将里面的内容处理以后保存到指定文件下
*
* @author WEI 哥
*
*/
public class Fibonacci {
public static void main(String[] args) throws IOException {
File file = new File("D://hello.txt");
File file2 = new File("D://hello2.txt");
if (!file2.exists()) {
file2.createNewFile();
}
FileInputStream reader=null;
FileOutputStream writer=null;
try {
reader = new FileInputStream(file);
writer = new FileOutputStream(file2);
byte[] by=new byte[1024];
int len = 0;
while ((len = reader.read(by)) != -1) {
//String str=new String(by,0,len);
//System.out.println(str);
writer.write(by,0,len);
}
/*
* 拓展,将String对象也以字符流的方式写入到文件的最后一行
*/
String str="\r\n我是小哥哥";
byte[] by2=str.getBytes();
for(int i=0;i<by2.length;i++) {
writer.write(by2[i]);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
reader.close();
if (writer != null)
writer.close();
}
}
}
总结:首先我们知道文件在内存中都是以字节的形式存储的,所以对于任何形式的文件(文本,图片,影视等)都可以用字节流FileInputStream / FileOutputStream来读取存储。
但是慢慢我们发现,对于一些文本,我们更希望以一种直观的方式来读取,所以我们需要将字节流转换为字符流,就引入了一个OutputStreamWriter/InputStreamReader来转换,这样我们就可以直接以字符流的方式来读取存储文本(这里就限定了是文本)
后面我们又发现InputStreamReader只能对单个字符操作,而我们的阅读习惯是一行一行的,所以又引入了BufferedWriter / BufferedReader来弥补这个缺陷,这样我们就可以按行进行读取写入!