## Java专题十一(1):IO
[TOC]
> IO是基于字节流和字符流操作的
![](https://img.kancloud.cn/f7/62/f7622fae823b204d6c5a23bb595ac1bc_674x749.png)
**IO基类**:
| | Reader |Writer |InputStream |OutputStream |
| --- | --- | --- | --- | --- |
| 字符流 | ✔ | ✔ | | |
| 字节流 | | | ✔ | ✔ |
| 输入流 | ✔ | | ✔ | |
| 输出流 | | ✔ | | ✔ |
**各种资源IO类**:
| | Reader |Writer |InputStream |OutputStream |
| --- | --- | --- | --- | --- |
| File | FileReader | FileWriter| FileInputStream | FileOutputStream |
| Buffer | BufferReader | BufferWriter | BufferedInputStream | BufferedOutputStream |
| Pipe | PipedReader | PipedWriter| PipedInputStream | PipedOutputStream |
| String | StringReader | StringWriter| | |
| ByteArray | ByteArrayReader | ByteArrayWriter| ByteArrayInputStream | ByteArrayOutputStream |
| CharArray | CharArrayReader | CharArrayWriter| | |
| Object | | |ObjectInputStream | ObjectOutputStream |
| Filter | FilterReader | FilterWriter| FilterInputStream | FilterOutputStream |
| Data | | | DataInputStream | DataOutputStream |
### 1.字节流转换成字符(InputStreamReader)
```
public static String byte2Char(InputStream is, String charsetName)
throws IOException {
if (charsetName == null || !Charset.isSupported(charsetName)){
charsetName = DEFAULT_CHARSET;
}
InputStreamReader isr = new InputStreamReader(is, charsetName);
char[] cbuf = new char[DEFAULT_BYTE_SIZE];
StringBuilder sbf = new StringBuilder();
int readCount;
while((readCount = isr.read(cbuf)) > 0){
sbf.append(cbuf, 0, readCount);
}
return sbf.toString();
}
```
### 2.从文件中读取字符(FileReader)
```
public static String readCharFromFile(String path) throws IOException {
File fi = new File(path);
if (fi.exists() && fi.isFile()){
FileReader fr = new FileReader(fi);
char[] cbuf = new char[DEFAULT_CHAR_SIZE];
int readCount;
StringBuilder sbf = new StringBuilder();
while((readCount = fr.read(cbuf)) > 0){
sbf.append(cbuf, 0, readCount);
}
return sbf.toString();
}
throw new FileNotFoundException();
}
```
### 3.字节流输出到文件(FileOutputStream)
```
public static File writeByteToFile(InputStream is, String path, boolean append) throws IOException {
File fi = new File(path);
// create file first if not exists
if (!fi.exists()) {
fi.createNewFile();
append = false;
}
FileOutputStream fos = new FileOutputStream(fi, append);
byte[] buf = new byte[DEFAULT_BYTE_SIZE];
int readCount;
while((readCount = is.read(buf)) > 0){
fos.write(buf, 0, readCount);
}
fos.close();
is.close();
return fi;
}
```
### 4.字符输出到文件(FileWriter)
```
public static File writeCharToFile(String content, String path, boolean append) throws IOException {
File fi = new File(path);
// create file first if not exists
if (!fi.exists()) {
fi.createNewFile();
append = false;
}
FileWriter fw = new FileWriter(fi, append);
fw.write(content, 0, content.length());
fw.close();
return fi;
}
```
字节流转换成字符流,文件与字节,文件与字符转换操作完整代码见:
[IOTools](https://github.com/15045120/git-docs/blob/master/tools/IOTools.java)
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化