1. Java I/O类基本架构
Java I/O包下java.io大概可以分为以下4种类型
- 基于字节操作的I/O接口:InputStream和OutputStream
- 基于字符操作的I/O接口:Write和Reader
- 基于磁盘操作的I/O接口:File
- 基于网络操作的I/O接口:Socket(不在io包下)
前两个字节和字符操作是传输数据的数据格式,后两个磁盘和网络是传输数据的方式。I/O的核心问题要么是数据格式影响I/O的操作,要么是传输数据方式影响I/O操作,将什么样的数据写到什么地方。
1.1基于字节的I/O操作
分为输入和输出InputStream、OutputStream
方法 | 描述 |
---|---|
int read() | 从输入流中读取下一个字节数据(0-255),已达最后没有可读数据时返回-1 |
read(byte[]b) | 从输入流中读取b.length的字节到字节数组b中,并返回实际读取的字节数 |
int read(byte[]b,int off,int len) | 读取字节保存在字节数组b中的下标off到len-1处,到最后返回-1 |
long skip(long n) | 从输入流中跳过并丢弃n字节的数据,返回实际跳过的字节数 |
int available() | 返回可以从输入流中读取的字节数(估计值) |
void close() | 关闭输入流,释放占用的任何系统资源 |
void write(int b) | 将指定字节写入到字节流中 |
void write(byte[]b) | 将字符数组中的内容写入到输入流中 |
write(byte[]b,int off,int len ) | 将字节数组中从下标off到len-1的字节元素写入到输出流中 |
void flush() | 清除输出流中的缓存,强制写出任何缓冲的输出字节 |
void close() | 关闭输出流,并释放占用的任何系统资源 |
InputStream示例:
public class InputStreamStudy {
public static void main(String[] args) throws Exception {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("读取文件路径");
// int by = 0;
// while ((by = inputStream.read()) != -1) {
// System.out.print((char) by);
// }
byte[] bytes = new byte[1024];
int readCount = 0;
while((readCount =inputStream.read(bytes))!=-1 ){
//讲将byte数组转换成字符串输出
System.out.println(new String( bytes,0,readCount));
}
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
}
OutputStream示例:
public class OutputStreamStudy {
public static void main(String[] args) throws Exception {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream("输出路径");
String str = "你好";
outputStream.write(str.getBytes());
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
}
1.2基于字符的I/O操作
方法大致和字节操作的类似
Reader示例:
public class ReaderStudy {
public static void main(String[] args) throws Exception {
FileReader fileReader = new FileReader("读取文件路径");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String str = bufferedReader.readLine();
while (str != null && !"".equals(str)) {
System.out.println(str);
str = bufferedReader.readLine();
}
bufferedReader.close();
}
}
Writer示例:
public class WriterStudy {
public static void main(String[] args) throws Exception {
FileWriter fileWriter = new FileWriter("/Users/wanghuaikun/Desktop/ordertem10-09.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("你好");
bufferedWriter.newLine();
bufferedWriter.write("嘻嘻");
bufferedWriter.newLine();
bufferedWriter.write("哈哈");
bufferedWriter.close();
}
}
1.3字节自符的转化
数据持久或网络传输都是以字节进行的,java提供了字符和字节之间的相互转换。
InputStreamReader是字节到字符转换的桥梁,从InputStream到Reader的过程是要制定编码字符集,如果使用操作系统默认字符集,可能会出现乱码。StreamDecoder是完成字节到字符解码的过程。
FileReader类就是按照这个流程来读取文件,FileReader继承了InputStreamReader,实际上读取的是文件流,通过SteamDecoder解码成char。
public class ByteCharTransReader {
public static void main(String[] args) throws Exception{
StringBuffer stringBuffer = new StringBuffer();
char[] chars = new char[1024];
FileReader fileReader = new FileReader("读取文件路径");
while (fileReader.read(chars)>0){
stringBuffer.append(chars);
}
System.out.println(stringBuffer.toString());
fileReader.close();
}
}
OutPutStreamWrite也是类型过程,由StreamEncoder来完成编码过程