1.嵌套的输入流
DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream("1.dat")));
这里 需要从一个文件中读入数据,数据是数字类型,FileInputStream 没有读入数字类型的方法,也没有缓存机制,DataInputStream没有从文件中读数据的方法,
因此可以用重重嵌套构造一个新的构造器。
2.文本操作
PrintWriter 和BufferedReader(new FileReader("2.txt"))
一个典型的输入系统是:
String line;
while(line = in.readLine() != null){
do sth;
}
然而BufferedReader没有任何读入数字的处理方法,建议使用Scanner来输入文本。
3.read()方法读文件
File f = new File(path);
InputStream fis = new FileInputStream(f);
int l = 0;
byte[] buf = new byte[2]; //只有两个字节的缓冲区
while((l=fis.read(buf)) != -1){
System.out.println(new String(buf,0,l));
}
System.out.println("length:" + l);
读到文件末尾时会返回-1,作为判断条件,缓冲区只有两个字节,即一个中文,这样出来的结果 一个字一行,且 l永远为0。
四.使用nio来读取和写入文件。
在nio中,读取和写入文件都是对缓冲区进行的。读是从缓冲区中读数据,写是向缓冲区中写数据。因此,在读和写之前,总是先要创建一个缓冲区Buffer,
有不同类型的缓冲区,主要的,使用最多的是ByteBuffer,即字节缓冲区。
1.创建缓冲区方法:
ByteBuffer buf = ByteBuffer.allocate(1024);
2.nio中使用通道来执行读或取得操作。通道是双向的,能读能写,以块为数据单位。通道都是通过输入输出流来获取的,所以输入输出流还是要的,只不过
这里只是为了从它们中获取通道。
从输入输出流中获取channel
FileInputStream fin = new FileInputStream( infile );
FileOutputStream fout = new FileOutputStream( outfile );
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
3.得到了通道和缓冲区,则可以进行文件的读写了。读是使用channe从缓冲区中读,写是使用channel向缓冲区中写。我们使用上面的缓冲区和通道:
fcin.read(buf);
fcout.write(buf);
这里还要介绍缓冲区的两个方法;
每个缓冲区都有一个容量,一个当前位置。
clear() 清空缓冲区,让缓冲区可以重新使用,位置回0;
flip() 位置回0,这样使用get方法可以对缓冲区进行遍历。
4.一个例子 copyFile 复制文件
package com.wlc.nio;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import static java.io.File.separator;
public class CopyFile {
public static void main(String[] args) throws IOException {
String path = "C:" + separator + "Users" + separator + "wlc"
+ separator + "Desktop" + separator + "项目修改点.txt";
String to = "C:" + separator + "Users" + separator + "wlc"
+ separator + "Desktop" + separator + "项目修改点2.txt";
copyFiles(path, to);
}
public static void copyFiles(String from, String to) throws IOException {
FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(to);
FileChannel fcin = in.getChannel();
FileChannel fout = out.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
while (true) {
buf.clear();
int r = fcin.read(buf); //从通道中读数据到缓冲区,读一个buf,下面就写入一个buf
if (r == -1) { //如果r = -1,则说明读完数据了,就跳出了
break;
}
buf.flip(); //这里在写之前千万要记住先flip一下,不然指针指到了buf的最后,写出来的为空了
fout.write(buf); //将缓冲区中数据写入通道
}
}
}
5.缓冲区分片
我们可以对一个缓冲区进行分片,所谓分片,即从一个已有的缓冲区中分出一个片段来,实际还是原来那个缓冲区,相当于一部分,或叫子缓冲区。这个
子缓冲区可以用来执行一些特定的操作。
一个缓冲区分片的例子:
package com.wlc.nio;
import java.nio.ByteBuffer;
public class T3 {
public static void main(String[] args) {
ByteBuffer buf = ByteBuffer.allocate(10);
for(int i = 0;i < 10;i ++){
buf.put((byte) i);
}
buf.position(3); //分片起始位置
buf.limit(6); //分片区的终点位置
ByteBuffer slice = buf.slice();
for(int i = 0;i < 3;i ++){ //创建的分片位置从0开始算
int temp = slice.get(i) * 10; //给每个值乘以10
slice.put(i, (byte)temp);
}
buf.flip();
buf.limit(buf.capacity());
while(buf.hasRemaining()){
System.out.println((int)buf.get());
}
}
}
运行结果:
0
1
2
30
40
50
6
7
8
9
6.nio scatter/gather 分散和聚合
参考:点击打开链接
参考:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html点击打开链接