IO中自带的方法:
listFiles();仅加载当前文件甲下的文件
内存流:一次性先把数据读取到内存流中,再进行操作,如写到文件流中
ByteArrayInputStream
byte[] buf = "we are all good child".getBytes(); // 数据源 假设成是从网络上下载的字节数组
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
int r;
while((r = bais.read()) != -1) {
System.out.print((char)r);
}
ByteArrayOutputStream
byte[] buf = new byte[1024];
ByteArrayOutputStream bais = new ByteArrayOutputStream();
FileOutputStream fos = new FileOutputStream("e:\\test\\");
int r;
while( (r=bis.read() ) != -1){
bais.write(b,0,r);
}
bais.writeTo(fos);
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符,数组和行的高效读取。(可以指定缓冲区的大小,或者使用默认的大小。大多数情况下,默认值就够大了。)
通常Reader所做的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。并且在调用read() 或 readLine()从文件中读取时,都要转换为字符后返回,但是这是效率及其低下的。
所以应当用BufferedReader包装所有其read()操作可能开销很高的Reader(如FileReader 和 InputStreamReader)
InputStreamReader 是字节通向字符的桥梁,它使用charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显示给定,或者接受平台默认的字符集。
例如:磁盘文件里读取内容时
首先获取文件定义:FileInputStream fis = new FileInputStream(path);
因为这是读取字节,所以要把它转换为字符-InputStreamReader(fis);
最后使用BufferedReader()包装它们:
BufferedReader br = new BufferedReader(new InputStreamReader(file))
RandomAccessFile ra = RandomAccessFile("存放写入/读取地址","rw/r")//后面的参数是代表以什么方式打开文件的。第一个是读写,第二个是读。
方法:ra.seek(0)//表示回到下表为0的位置
ra.skipBytes(字节数);//表示跳过的字节数
如果要保证查的到信息,最好使每条信息的长度相等(day20)
RandomAccessFile里面有一个自带的指针,当程序运行到哪,指针自动指向那个地方的下表
现象:
用Java程序读写含中文的txt文件时,读出或写入的内容出现乱码。
原因:
出现乱码的原因是操作系统和Java程序使用的编码格式不同。中文Windows OS默认使用的是GBK编码,而Eclipse IDE的Encode默认使用的是UTF-8编码。在OS下手动创建并写入的txt文件使用的是GBK编码,用Java程序直接去读时用的是UTF-8编码,所以会出现乱码。为了避免可能的中文乱码问题,最好在读写文件的时候显式指定编码格式。
解决方法:
在读写文件的时候显式指定编码格式。
获取读文件的字符流:
- InputStreamReader isr = new InputStreamReader(new FileInputStream(file),"UTF-8");
- BufferedReader br = new BufferedReader(isr);
获取写文件的字符流:
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
- BufferedWriter bw = new BufferedWriter(osw);