IO流
IO流定义:对文件的输入和输出。从内存中写入到硬盘,就是输出流;从硬盘写到内存里面,就是输入流。
字节流
以字节为单位进入输入输出流;一般操作英文、图片、视频。
字节输入流
package com.demo.day02;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class FileInputStreamDemo {
public static void main(String[] args) {
InputStream fis = null;
try {
//字节流
fis = new FileInputStream("D:\\hmj.txt");
int data;
//read()取到每一个字节通过Ascll转换到的数是0-255之间的整数,没有值返回-1
while((data=fis.read())!=-1){
//因为中文的字符可能是一个字节、两个字节,所以以字节为单位中文会乱码
//10进制转换成对应的字符
System.out.print((char)data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节输出流
package com.demo.day02;
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) {
OutputStream fos = null;
//创建字节输出流对象
try {
//如果第二个参数是true,代表输出会在之前的内容尾部追加,否在覆盖
fos = new FileOutputStream("D:\\hmj.txt",true);
String str = "aaaa";
//把字符串转换成字节数组
byte[] words = str.getBytes();
//将words.length个字节从指定的words字节数组写入此文件输出流
fos.write(words, 0, words.length);
System.out.println("写入成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流
一般的中文可能占两个或者三个字节,以字节去输入输出可能会造成乱码,所以字符流对字符输入输出最合适。
字符输入流
package com.demo.day04;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class BufferWriterDemo {
public static void main(String[] args) {
Writer fr = null;
BufferedWriter bw = null;
try {
//创建字符流输出对象
fr = new FileWriter("D:\\hmj.txt",true);
//设置BufferWrite缓存区
bw = new BufferedWriter(fr);
bw.write("江西南昌");
bw.newLine();
//刷新流
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符输出流
package com.demo.day03;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class BufferReaderDemo {
public static void main(String[] args) {
Reader fr = null;
BufferedReader br = null;
try {
//创建字符输入流对象
fr = new FileReader("D:\\hmj.txt");
//BufferedReader设置缓存区,把字符一个个取到后先放到缓存区够够一行再去获取
br = new BufferedReader(fr);
//获取一行数据
String line = br.readLine();
while(line!=null){
//输出
System.out.println(line);
//新建一行数据
line = br.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二进制流
依赖字节流存在
package com.demo.day06;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class DdataInputStreamDemo {
public static void main(String[] args) {
InputStream fis = null;
OutputStream fos = null;
DataInputStream dis = null;
DataOutputStream dos = null;
try {
//创建字节输入流
fis = new FileInputStream("D://tu1.png");
//创建字节输出流
fos = new FileOutputStream("D://tu2.png");
//依据字节流对象创建二进制输入流
dis = new DataInputStream(fis);
//依据字节输出流对象创建二进制输出流
dos = new DataOutputStream(fos);
int date;
while((date=dis.read())!=-1){
dos.write(date);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
InputStreamReader
扩充:通过InputStreamReader设置字符流的编码格式。
package com.demo.day07;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class InputStreamReaderDemo {
public static void main(String[] args) {
InputStream fis = null;
BufferedReader br = null;
InputStreamReader isr = null;
try {
fis = new FileInputStream("D:\\hmj.txt");
//依赖字节流创建InputStreamReader流,设置编码格式
isr = new InputStreamReader(fis,"UTF-8");
br = new BufferedReader(isr);
String line = br.readLine();
while(line!=null){
System.out.println(line);
//进行下一行
line = br.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
练习
package com.demo.day05;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class FileDemo {
public static void main(String[] args) {
File f1 = new File("D:\\hell.txt");
File f2 = new File("D:\\hell2.txt");
/**
* 复制f1文件内容到f2文件
*/
FileOutputStream fos = null;
FileInputStream fis = null;
try {
//创建输出流
fos = new FileOutputStream(f2);
//创建输入流
fis = new FileInputStream(f1);
//创建数组
byte words[] = new byte[1024];
int data;
while((data=fis.read(words))!=-1){
//通过read(byte[] b)方法把读取的数据存入words数组
fis.read(words);
}
//把words数组写入
fos.write(words, 0, words.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}