RandomAccessFile
支持对文件的任意读取与写入。随机访问文件的行为类似存储在文件系统都一个大型byte数组。存在指向该隐藏数组的光标或索引,成为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过getFieldPointer方法读取,并通过seek方法设置。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
public static void main(String[] args) throws IOException {
String dir = "d:" + File.separator + "Ecplise-workspace" + File.separator + "JavaTest" + File.separator + "src"
+ File.separator + "IOPackage" + File.separator + "RandomAccessFileDemo.java";
File f = new File(dir);
RandomAccessFile raf = new RandomAccessFile(f, "rw");
//readLine()方法,不管保存数据的是什么编码,都会转换成ISO-8859-1,就可能会出现乱码,特别是中文字符
//所以需要进行转码
while(null != (raf.readLine())) {
System.out.println(new String(raf.readLine().getBytes("ISO-8859-1"), "utf-8"));
}
raf.close();
}
}
注意:RandomAccessFile中指针会随着你对文件的操作移动,操作的时候要注意指针的位置。
RandomAccessFile的readUTF()和writeUTF()方法,必须是成对使用的,readUTF()读的必须是writeUTF()写的。
ByteArrayInputStream和ByteArrayOutputStream
ByteArrayOutputStream在创建实例时,程序内部创建一个byte型数组的缓冲区,然后利用By特ArrayOutputStream和ByteArrayInputStream的实例向数组写入或读出byte型数据。在网络传输中我们往往要传输很多变量。可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。
ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把数组中的字节数以流的形式读出,实现对统一字节数组的操作。综合DataOutputStream和DataInputStream的作用与ByteArrayInputStream和ByteArrayOutputStream使用更方便。
ByteArrayInputStream
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class ByteArrayInputStreamTest {
public static void main(String[] args) throws IOException {
String str = "hello world";
byte[] b = str.getBytes();
//ByteArrayInputStream(byte[] buf) //使用创建者预设的buf作为其缓冲区数组,通常buf就是数据源
//ByteArrayInputStream(byte[] buf, int offset, int lenght) //使用buf作为其缓冲区数组,参数offset指定从数组中开始读取数据的起始下标位置,lenght指定从数组中读取的字节数。
ByteArrayInputStream bais = new ByteArrayInputStream(b);
int i = 0;
//读方式一:
// while((i = bais.read()) != -1) {
// System.out.print((char)i);
// }
//读方式二:
byte[] buf = new byte[1024];
while((i = bais.read(buf)) != -1) {
System.out.println(new String(buf, 0, i));
}
//close()方法无法关闭ByteArrayInputStream
bais.close();
}
}
ByteArrayOutputStream
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteOutputStream {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String str = "hello world java";
byte[] b = str.getBytes();
File f = new File("d:\\1024.txt");
FileOutputStream fos = new FileOutputStream(f);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//写出方式一:
// //读取输出流
// baos.write(b);
// //将byte数组输出流中的所有数据写到指定的输出流中
// baos.writeTo(fos);
//写出方式二:
baos.write(b);
baos.writeTo(fos);
//可以通过toString()方法将输出流转换为字符串
System.out.println(baos.toString());
fos.close();
//close()方式无效
baos.close();
}
}
DataInputStream和DataOutputStream
DataInputStream
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class DataInputStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String strFile = "d:" + File.separator + "DataOutputStream.txt";
File f = new File(strFile);
DataInputStream dis = new DataInputStream(new FileInputStream(f));
byte[] b = new byte[1024];
int buf = 0;
while(-1 != (buf = (dis.read(b)))) {
System.out.print(new String(b, 0, buf));
}
}
}
DataOutputStream
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataOutputStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String strFile = "d:" + File.separator + "DataOutputStream.txt";
File f = new File(strFile);
DataOutputStream dos = new DataOutputStream(new FileOutputStream(f));
String str = "hello world java";
dos.writeBytes(str);
//DataOutputStream要和DataInputStream配合使用
//JAVA中的char是16位的,一个char存储一个中文字符,直接用writeBytes方法转换会变为8位,直接导致高8位丢失。从而导致中文乱码。
//所以下面先字符串先转换成byte数组,中文就不会出现乱码
dos.write("写入记事本内容".getBytes());
//直接写入中文,乱码
dos.writeBytes("写入记事本内容");
dos.writeBytes("写入记事本内容");
dos.writeBytes("写入记事本内容");
dos.writeBytes("写入记事本内容");
dos.flush();
dos.close();
}
}