Granda's Blog

JAVA:IO和NIO

常用IO流

  • InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流
分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类 FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DateOutputStream

(粗体字标出的类代表节点流,必须与指定的物理节点关联)

IO读写文件实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class FileInputStreamTest {
public static void main(String[] args) throws Exception {
//创建字节输入流
FileInputStream fis = new FileInputStream("mysql.ini");
//创建字节输出流
FileOutputStream fos = new FileOutputStream("test.txt");
//创建缓冲数组
byte[] bbuf = new byte[1024];
//保存实际读取的字节数
int hasRead = 0;
while ((hasRead = fis.read(bbuf)) > 0) {
System.out.println(new String(bbuf, 0, hasRead));
fos.write(bbuf, 0, hasRead);
}
fis.close();
}
}

NIO读写文件实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class FileChannelTest {
public static void main(String[] args) throws Exception {
File f = new File("mysql.ini");
try (
//以文件输入流创建FileChannel
FileChannel inChannel = new FileInputStream(f).getChannel();
//以文件输出流创建FileChannel
FileChannel outChannel = new FileOutputStream("test3.txt").getChannel()) {
//将FileChannel中的数据全部映射成ByteBuffer
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY,0,f.length());
Charset charset = Charset.forName("GBK");
//将buffer里面的数据全部输出
outChannel.write(buffer);
buffer.clear();
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buffer);
System.out.println(charBuffer);
}catch(IOException e){
e.printStackTrace();
}
}
}
  • 文件锁:在NIO中,FileChannel的lock()/trylock()方法可以获得文件锁FileLock对象,从而锁定文件;使用release()方法释放文件锁