目录
字节流 与 字符流
字节流 可以处理所有类型的数据,如MP3、图片、文字、视频等。在读取时,读到一个字节就返回一个字节。
在java 中对应的类都以 "Stream" 结尾。
字符流 仅能处理纯文本数据,如 txt 文本等。在读取时,读到一个或者多个字节,先查找指定的编码表,然后将查到的字符返回。
在java 中对应的类都已 "Reader" 或 "Writer" 结尾。
字节流 小例子
-
ReadByteStream (普通的输入流)
try { FileInputStream fis = new FileInputStream("F:/docekr.docx"); byte input[]=new byte[1024]; while (fis.read(input)!=-1) fis.read(input); String string = new String(input); System.out.println(string); }catch (Exception e){ }
-
WriteByteStream(普通的输出流)
FileOutputStream fos = new FileOutputStream("F:/text.txt"); String outString = "wirte 213456写出数据"; byte output[] = outString.getBytes("UTF-8"); fos.write(output); fos.close();
-
ReadByBufferByteStream(使用带有缓存的输入流)
注意:后打开先关闭,先打开后关闭
优点: 使用缓存后可以减少访问磁盘的次数,提高效率FileInputStream fis = new FileInputStream("F:/2015-12-14 175731.mov"); // 设置缓冲区大小,可以有效的减少访问磁盘的次数 BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream("F:/movenew.mov"); BufferedOutputStream bos = new BufferedOutputStream(fos); // 大型文件对应的数组可以大一些, 小文件对应的数组小一些 byte input[] = new byte[100]; long before = System.currentTimeMillis(); while(bis.read(input)!=-1){ bos.write(input); } // 后打开的先关闭,先打开的后关闭 bis.close(); bis.close(); bos.close(); fos.close(); System.out.println(System.currentTimeMillis()-before+"ms"); System.out.println(count);
字符流 小例子
- RWByBufferedChar
注意:在使用 BufferedWriter 读取数据时,虽然读取的是一行数据,但是并不包含换行符,
所以此时我们可以用 PrintWriter 进行读取,
并加上 pw.flush() 或 bw.flush() , 为防止 缓冲区 内容不写入,使用 flush 缓冲区内容 强制输出。FileInputStream fis = new FileInputStream("F:/docekr.txt"); FileOutputStream fos = new FileOutputStream("F:/docekr_new.txt"); InputStreamReader isr = new InputStreamReader(fis); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedReader br = new BufferedReader(isr); //BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(osw); String input; while((input= br.readLine())!=null){ // bw.write(input); pw.println(input); } // 为防止 缓冲区 内容不写入,使用 flush 缓冲区内容 强制输出。 pw.flush(); //bw.flush(); //bw.close(); pw.close(); br.close(); osw.close(); isr.close(); fos.close(); fis.close();
- RWChar 使用字符流读取文件,和写入文件
File file = new File("F:/docekr.txt"); FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream("F:/docekr_new.txt"); // 将字节流转换为字符流 InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); char input[] = new char[100]; // 为防止最后一次数组还有空间继续读取 int len =0; while((len=isr.read(input))!=-1){ // System.out.println(new String(input,0,len)); osw.write(input,0,len); } isr.close(); fis.close(); osw.close(); fos.close();
- FileReaderWriter
FileReader: 用于读取字符文件的便利类。对于读取原始字节流,可以考虑使用 FileInputStream。
注意:因为 bw.readLine 没有换行符,所以我们可以写入的时候手动添加 换行符 "\n"// FileReader 是读取文件 FileReader fr = new FileReader("F:/docekr.txt"); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter("F:/docekr_new.txt"); BufferedWriter bw = new BufferedWriter(fw); String line; while((line=br.readLine())!=null){ bw.write(line+"\n"); } bw.close(); fw.close(); br.close(); fr.close();
多线程
使用 RandomAccessFile 进行多线程的下载或多线的文件传输
public class MultiWriteFie {
/**
* 使用 RandomAccessFile 进行多线程的下载或多线的文件传输
*/
static File file= new File("F:/text.txt");
public static void main(String[] args) {
if (file.exists()){
file.delete();
}
new WriteFile(file,1).start();
new WriteFile(file,2).start();
new WriteFile(file,3).start();
new WriteFile(file,4).start();
new WriteFile(file,5).start();
}
}
public class WriteFile extends Thread{
File file;
int block;
int len = 100;
public WriteFile(File f,int b){
this.file=f;
this.block=b;
}
@Override
public void run() {
try {
RandomAccessFile raf = new RandomAccessFile(file,"rw");
raf.seek((block-1)*len);
raf.writeBytes("This is block"+block);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 Apache 的 库:
选择一个版本下载就行
可以提高你的开发效率