IO流:
字节流:
InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
字符流:
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter
文件复制:
是否是文本文件:
是:字符流
是否高效:
是:带Buffer缓冲的流。
否:字节流
代码体现:
复制文本文件(5种方式)
//用字节流复制的两种方式
import java.io.FileInputStream;
public class CopyFileDemo{
public static void main(String[] args) throws IOException {
// 封装数据源
FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");
FileOutputStream fos = new FileOutputStream("d:\\Copy.java");
// 方式1,一次读取一个字节
int by = 0;
while ((by = fis.read()) != -1) {
fos.write(by);
}
// 方式2,一次读写一个字节数组
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 释放资源
fos.close();
fis.close();
}
}
//用字符流复制的三种方式:
import java.io.FileReader;
public class CopyFileDemo2{
public static void main(String[] args) throws IOException {
// 封装数据源
FileReader fr = new FileReader("FileOutputStreamDemo.java");
// 封装目的地
FileWriter fw = new FileWriter("d:\\Copy.java");
// 方式3,一次读取一个字符
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
// 方式4,一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
//方式5,使用字符缓冲流
// 封装数据源
BufferedReader br = new BufferedReader(new FileReader("FileOutputStreamDemo.java"));
// 封装目的地
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\Copy.java"));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 释放资源
fw.close();
fr.close();
}
}
复制二进制流文件(图片 4种方式)
public class CopyImageDemo3{
public static void main(String[] args) throws IOException {
method();
}
// 用字节流(2种)
private static void method() throws IOException {
FileInputStream fis = new FileInputStream("123.jpg");
FileOutputStream fos = new FileOutputStream("成龙.jpg");
// 方式1
int by = 0;
while ((by = fis.read()) != -1) {
fos.write(by);
}
//方式2
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
fos.close();
fis.close();
}
// 用字符流复制(2种)
private static void method2() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("456.jpg"));
BufferedWriter bw = new BufferedWriter(new FileWriter("李连杰.jpg"));
//方式1
int ch = 0;
while ((ch =bw.read()) != -1) {
bw.write(ch);
}
//方式2
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
转换流:
(1)一般来说,不需要用转换流。
(2)应用场景:
A:字节流 -- 字符流
B:字符编码问题
(3)转换的基本使用:
InputStreamReader:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("fis.txt")));
OutputStreamWriter:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fos.txt"));
3:字符编码:
(1)编码表:
由字符及其对应的数值组成的一张表。
常见的码表:
ASCII
ISO-8859-1
GB2312
GBk
GB18030
BiG5
UTF-8
(2)转换流的编码问题
字符流 = 字节流 + 编码表。
InputStreamReader(InputStream is,String charsetName);
OutputStreamWriter(OutputStream os,String charsetName);
(3)字符串的编码问题
编码:把看得懂变成看不懂的
String -- byte[]
解码:把看不懂的变成能看懂的
byte[] -- String
代码体现:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import cn.itcast.dao.UserDao;
import cn.itcast.pojo.User;
public class UserDaoImpl implements UserDao {
private static final File file = new File("user.txt");
public boolean isLogin(String username, String password) {
boolean flag = false;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null) {
// admin=admin
String[] datas = line.split("=");
if (datas[0].equals(username) && datas[1].equals(password)) {
flag = true;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
public void regist(User user) {
/*
* 我将来数据在文件中的存储格式: 用户名=密码
*
* 用户名:admin 密码:admin
*
* admin=admin
*/
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, true));
bw.write(user.getUsername());
bw.write("=");
bw.write(user.getPassword());
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public boolean checkUsername(String username) {
boolean flag = false;
/*
* 读取文本文件的每一个对象,并获取每一行的用户名,然后比较,如果有,则修改标记为true。
*/
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null) {
// admin=admin
String[] datas = line.split("=");
if (datas[0].equals(username)) {
flag = true;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
}