一、FileReader读入数据的基本操作
适用于纯文本文件,如TXT文件 使用throws的方式处理异常
package com.java.main;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestStream
{
public static void main(String []args) throws IOException // 使用throws的方式处理异常
{
// 1、实例化File类的对象,指明要操作的文件
File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
// 2、提供具体的流
FileReader fileReader = new FileReader(file);
// 3、数据的读入
// read()方法:返回读入的一个字符,用int接受的话是字符对应的ASSIC码,如果返回-1则代表读入到了文件尾
// 写法一
/*
int data=fileReader.read();
while(data != -1)
{
System.out.println((char)data);
data=fileReader.read(); // 接着读下一个
}
*/
// 写法二
int data;
while((data=fileReader.read())!=-1)
{
System.out.print((char)data);
}
// 4、流的关闭
fileReader.close(); // 关闭文件输入流
}
}
上面代码使用throws的方式处理异常,这样是不安全的,因为当中间步骤出现异常时,会终止程序,导致后面关闭流的操作无法完成,从而造成资源的浪费,所以要使用try-catch-finally的方式来处理异常。
package com.java.main;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream
{
public static void main(String []args)
{
FileReader fileReader=null;
try
{
// 1、实例化File类的对象,指明要操作的文件
File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
// 2、提供具体的流
fileReader = new FileReader(file);
// 3、数据的读入
// read()方法:返回读入的一个字符,用int接受的话是字符对应的ASSIC码,如果返回-1则代表读入到了文件尾
// 写法一
/*
int data=fileReader.read();
while(data != -1)
{
System.out.println((char)data);
data=fileReader.read(); // 接着读下一个
}
*/
// 写法二
int data;
while((data=fileReader.read())!=-1)
{
System.out.print((char)data);
}
}catch(IOException e)
{
e.printStackTrace();
}finally
{
try
{
if(fileReader!=null) // 如果为null,执行不了关闭操作
{
// 4、流的关闭
fileReader.close(); // 关闭文件输入流
}
}catch(IOException e) // 流的关闭也可能产生异常
{
e.printStackTrace();
}
}
}
}
上面的方法只能一个一个地读入字符,下面使用read函数的重载函数,实现同时读取多个字符
package com.java.main;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream
{
public static void main(String []args)
{
FileReader fileReader=null;
try
{
// 1、实例化File类的对象,指明要操作的文件
File file = new File("D:\\CODE\\codeeclipse\\Java基础\\bin\\com\\java\\main\\data.txt");
// 2、提供具体的流
fileReader = new FileReader(file);
// 3、数据的读入
/*
* read(char[] arr)方法:返回每次读入arr数组中的字符个数,如果到达文件尾,返回的是-1
*/
char[] cBuffer = new char[5];
int len;
while((len = fileReader.read(cBuffer)) != -1)
{
// 方式1 遍历数组,使用len,不能使用length
/*
for(int i=0; i<len; i++ )
{
System.out.print(cBuffer[i]);
}
*/
// 方式2 放入String
String string = new String(cBuffer, 0, len); // 使用len个字符
System.out.print(string);
}
}catch(IOException e)
{
e.printStackTrace();
}finally
{
try
{
if(fileReader!=null) // 如果为null,执行不了关闭操作
{
// 4、流的关闭
fileReader.close(); // 关闭文件输入流
}
}catch(IOException e) // 流的关闭也可能产生异常
{
e.printStackTrace();
}
}
}
}
二、FileWriter写出数据
package com.java.main;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.annotation.processing.Filer;
public class TestStream
{
public static void main(String []args)
{
// 1、提供要操作的文件
File file = new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
// 2、提供FileWriter的对象,用于数据的写出
FileWriter fileWriter=null;
try
{
// append:值为true表示在改文件原有内容后面追加,为false表示覆盖原有内容
fileWriter = new FileWriter(file, true); // 表示在原有内容之上追加
// writer(要写出的内容)
fileWriter.write("hello\n");
fileWriter.write("world");
}catch(IOException e)
{
e.printStackTrace();
}finally {
try
{
// 流的关闭
if(fileWriter!=null)
{
fileWriter.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
三、FileReader和FileWriter实现文件的复制
package com.java.main;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.annotation.processing.Filer;
public class TestStream
{
public static void main(String []args)
{
FileReader fr=null;
FileWriter fw =null;
try
{
fr = new FileReader("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
fw = new FileWriter("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt");
char[] cBuffer = new char[5];
int len;
while((len=fr.read(cBuffer)) != -1)
{
fw.write(cBuffer, 0, len);
}
} catch (IOException e)
{
e.printStackTrace();
}finally
{
if(fr != null)
{
try
{
fr.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(fw != null)
{
try
{
fw.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
四、FileInputStream处理字节流的读入
适用于非文本文件
package com.java.main;
import java.io.FileInputStream;
import java.io.IOException;
public class TestStream
{
public static void main(String []args)
{
FileInputStream fileInputStream = null;
try
{
fileInputStream = new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
// 使用字节数组
byte[] bBuffer = new byte[5];
int len;
while((len = fileInputStream.read(bBuffer)) != -1)
{
String string = new String(bBuffer, 0, len);
System.out.print(string);
}
}catch(IOException e)
{
e.printStackTrace();
}finally
{
if(fileInputStream != null)
{
try
{
fileInputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
五、FileInputStream和FileOutputStream实现非文本文件(图片)的复制
package com.java.main;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestStream
{
public static void main(String []args)
{
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try
{
fileInputStream = new FileInputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照.jpg");
fileOutputStream = new FileOutputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照fu.jpg");
byte[] bBuffer = new byte[5];
int len;
while((len = fileInputStream.read(bBuffer)) != -1)
{
fileOutputStream.write(bBuffer);
}
System.out.println("复制成功");
}catch(IOException e)
{
System.out.println("复制失败");
e.printStackTrace();
}finally
{
if(fileInputStream != null)
{
try
{
fileInputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(fileOutputStream != null)
{
try
{
fileOutputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
六、缓冲流BufferedInputStream、BufferedOutputStream
缓冲流的作用是加快普通流的读写,因为其内部提供了缓冲区。 依然以复制图片为例子
package com.java.main;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestBufferedStream
{
public static void main(String[] args)
{
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try
{
// 准备字节流
fileInputStream = new FileInputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照.jpg");
fileOutputStream = new FileOutputStream("C:\\Users\\zzps\\Pictures\\Saved Pictures\\手写签名照1.jpg");
// 准备缓冲流,包裹普通流
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
// 复制操作
byte[] bBuffer = new byte[10];
int len;
while((len = bufferedInputStream.read(bBuffer)) != -1)
{
bufferedOutputStream.write(bBuffer, 0, len);
}
System.out.println("图片复制成功");
}catch(IOException e)
{
System.out.println("图片复制失败");
e.printStackTrace();
}finally
{
// 在关闭外层的流,即BufferedInputStream BufferedOutputStream的时候,会自动关闭内层流,所以不需要手动去关闭内层流
if(bufferedInputStream != null)
{
try
{
bufferedInputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(bufferedOutputStream != null)
{
try
{
bufferedOutputStream.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
另外,FileReader、FileWriter也可以类似的操作,要使用BufferedReader、BufferedWriter
package com.java.main;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestBufferedStream
{
public static void main(String[] args)
{
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try
{
bufferedReader = new BufferedReader(new FileReader(new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt")));
bufferedWriter = new BufferedWriter(new FileWriter(new File("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt")));
// 使用字符数组,复制结果和原来的一样
/*
char[] cBuffer = new char[1024];
int len;
while((len = bufferedReader.read(cBuffer)) != -1)
{
bufferedWriter.write(cBuffer, 0, len);
}
*/
// 使用String ,复制结果不换行
String s;
while((s = bufferedReader.readLine()) != null)
{
bufferedWriter.write(s); // s+"\n" 实现换行
}
} catch (IOException e)
{
e.printStackTrace();
}finally
{
try
{
if(bufferedReader != null)
{
bufferedReader.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
try
{
if(bufferedWriter != null)
{
bufferedWriter.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
七、转换流
- 转换流属于字符流
- 作用是提供字符流与字节流之间的转换
- InputStreamReader:将一个字节的输入流转换为字符的输入流;
- OutputstreamWriter:将一个字符的输出流转换为字节的输出流。
package com.java.main;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestTrans
{
public static void main(String []args)
{
FileInputStream fileInputStream = null;
InputStreamReader inputStreamReader = null;
try
{
fileInputStream = new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt");
// 参数2指定字符集,具体要用哪个字符集,要看该文件保存时用的是什么字符集
inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
char[] cBuffer = new char[10];
int len;
while((len = inputStreamReader.read(cBuffer)) != -1)
{
String s = new String(cBuffer, 0, len);
System.out.print(s);
}
}catch(IOException e)
{
e.printStackTrace();
}finally
{
if(inputStreamReader != null)
{
try
{
inputStreamReader.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
使用转换流实现文件的读入、写出
package com.java.main;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TestTrans
{
public static void main(String []args)
{
InputStreamReader inputStreamReader = null;
OutputStreamWriter outputStreamWriter = null;
try
{
// 参数2指定字符集,具体要用哪个字符集,要看该文件保存时用的是什么字符集
inputStreamReader = new InputStreamReader(new FileInputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data.txt"), "UTF-8");
// 参数2指定要按哪种字符集将数据保存到新文件
outputStreamWriter = new OutputStreamWriter(new FileOutputStream("D:\\CODE\\codeeclipse\\Java基础\\src\\com\\java\\main\\data1.txt"), "gbk");
char[] cBuffer = new char[5];
int len;
while((len = inputStreamReader.read(cBuffer)) != -1)
{
outputStreamWriter.write(cBuffer, 0, len);
}
}catch(IOException e)
{
e.printStackTrace();
}finally
{
if(inputStreamReader != null)
{
try
{
inputStreamReader.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
if(outputStreamWriter != null)
{
try
{
outputStreamWriter.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}