Day20
总结
我是最棒的!基础不牢,地动山摇!
字节流
适合除了文本文件以外的其他文件,比如图片,视频等等,与byte[]密切联系
FileInputStream(文件字节输入流)
常用方法read
FileOutputStream(文件字节输出流)
常用方法write
使用以上两种流实现非文本相关文件的复制
package cn.itsource.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile {
public static void main(String[] args) {
//创建对应的输入输出流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//指定流指向的文件
fis = new FileInputStream("F:/03.jpg");
fos = new FileOutputStream("F:/03copy.jpg");
byte[] b = new byte[1024];
int read = -1;
//读到末尾
while((read = fis.read(b)) != -1){
//边读取边写出,实现复制
fos.write(b, 0, read);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//自己实现一个工具类用来关流
IOUtils.closeIO(fis, fos);
}
}
}
IOUtils
package cn.itsource.stream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
public class IOUtils {
/**
* 关流
* @param is
* @param os
*/
public static void closeIO(InputStream is,OutputStream os){
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 关流
* @param is
* @param os
*/
public static void closeIO(Reader reader,Writer writer){
try {
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
乱码问题
- 编码和解码字符集不统一
- 字节流读取文本相关的数据
解决乱码问题
- 使用统一字符集的字符流读取或写出文本数据
- 将所有环境包括工具,设置成统一字符集UTF-8
package cn.itsource.stream;
import java.io.UnsupportedEncodingException;
public class CharSetTest {
public static void main(String[] args) throws UnsupportedEncodingException {
//编码,使用GBK
String str = "wdnmd,真就白给呗";
byte[] bytes = str.getBytes("GBK");
//解码,使用其他任何方式编码都会乱码
String str2 = new String(bytes,"GBK");
System.out.println(str2);
}
}
字符流
适合处理文本相关的文件,与char[]密切联系
FileReader(文件字符输入流)
常用方法read
FileWriter(文件字符输出流)
常用方法write,append
创建FileWriter对象时可以声明append为true,这样就不是覆盖文本原来的内容,而是在文本的末尾追加内容
使用字符流复制文本相关文件
package cn.itsource.readerwriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import cn.itsource.stream.IOUtils;
/**
* 字符流,适用于对文本相关文件的操作
*/
public class FileReaderTest {
public static void main(String[] args) {
//创建流对象
FileReader fr = null;
FileWriter fw = null;
try {
//指定文件
fr = new FileReader("test.txt");
fw = new FileWriter("copytest.txt");
char[] ch = new char[1024];
int read = -1;
//复制操作
while ((read = fr.read(ch)) != -1) {
fw.write(ch, 0, read);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关流
IOUtils.closeIO(fr, fw);
}
}
}
转换流
InputStreamReader(将字节流转换为字符流)
处理文本相关文件时,如果只有字节流,就可以使用转换流来解决
OutputStreamWriter(将字符流转换成字节流)
道理同上
使用转换流解决字节流复制文本相关文件
package cn.itsource.streamRW;
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 cn.itsource.stream.IOUtils;
public class OutputStreamWriterTest {
public static void main(String[] args) {
FileInputStream fis = null;
InputStreamReader isr = null;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
try {
fis = new FileInputStream("test.txt");
isr = new InputStreamReader(fis);
fos = new FileOutputStream("test4.txt");
osw = new OutputStreamWriter(fos);
char[] ch = new char[1024];
int read = -1;
while ((read = isr.read(ch)) != -1) {
osw.write(ch, 0, read);
}
System.out.println("复制成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeIO(isr, osw);
}
}
}
JDK7关流的新特性
可以直接在try()中写要创建的流对象,格式如下,就不用再finally中关流了
package cn.itsource.readerwriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 字符流,适用于对文本相关文件的操作
*/
public class FileReaderTest {
public static void main(String[] args) {
try (FileReader fr = new FileReader("test.txt");
FileWriter fw = new FileWriter("test1.txt")
){
char[] ch = new char[1024];
int read = -1;
while ((read = fr.read(ch)) != -1) {
fw.write(ch, 0, read);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}