IO流---纯小白自己声明给自己的---勿喷

来源:互联网 发布:淘宝店招图片在哪里找 编辑:程序博客网 时间:2024/06/11 00:26

Java IO简介

IO也写作“I/O”,可以理解为In和Out,即输入与输出

所以,IO体系的基本功能就是:读和写


IO流

作用:读写设备上的数据,硬盘文件,内存,键盘,网络...


根据数据的走向,可分为:输入流、输出流

根据处理的数据类型,可分为:字节流、字符流

字节流:可以处理所有的数据,如MP3、图片、文字、视频等。在读取时,读到一个字节就返回一个字节。

在Java中队形的列都以“Stream”结尾

字符流:仅能够处理纯文本书记,如txt文本等。在读取时,读到一个或者多个字节,先查找指定的编码表,然后将查到的字符返回。

在Java中队形的类都以“Reader”或“writer”结尾


字符、字节与编码

字节(Byte)
字节是通过网络传输信息或在硬盘或内存中存储信息的单位,是计算机信息技术用于计量存储容量和传输容量的一种计量单位。
1个字节=8位二进制,即一个8位的二进制数,是一个很具体的存储空间。
如0×01,0×45,0×FA,……
字符(Char)
字符是人们使用的记号,抽象意义上的一个符号。
如‘1’,‘中’,‘a’,‘$’,‘¥’,……





 使用字节流读写数据

1、读取文档以字符串格式输出(写入)
FileInputStream fis = new FileInputStream(“text.txt”); // 读取文件数据
byte input[] = new byte[21];
fis.read(input); // 将数据读取到字节型数组中
String inputString = new String(input,"UTF-8");
System.out.println(inputString);
fis.close();

2、写出文件
FileOutputStream fos = new FileOutputStream("text1.txt");
String outString = "写入的内容”;
byte output[] = outString.getBytes("UTF-8"); // 指定编码格式
fos.write(output);
fos.close(); // 关闭流

3、通过字节流拷贝文件
FileInputStream fis = new FileInputStream(“text.txt”); 
FileOutputStream fos = new FileOutputStream("text1.txt");
byte input[] = new byte[50];
while (fis.read(input) != -1){ // 只要有数据就循环写入
fos.write(input);
}
fos.close();
fis.close();
System.out.println("拷贝完成”);

带有缓冲的字节流(适用大的文件读取,优化过后读写效率非常高)

读写速度快,
FileInputStream fis = new FileInputStream(“text.txt”); 
BufferedInputStream bis = new BufferedInputStream (fis);
byte input[] = new byte[50]; // 大小可以决定读取的速度,根据文件的大小去定,无固定数值,优化用。
int count = 0;
while (fis.read(input) != -1){ 
count++; // 能看到总共读取了即便
}
bis.close();
fis.close();
System.out.println("读取了:" + count + "次");

缓冲输出流:BufferedOutputStream (fos,200); // 200:可以指定缓冲区的大小,调大增加读写速度


使用字符流读写数据

字符流用到InputStreamReader读数据,跟带有缓冲的字节流用法一样,只需将BufferedInputStream换掉即可,直接可以输出,默认就是字符,字符串等……

判断文件是否存在:
if(file.exists()){
}
输入流字符流:
File file = new File("java.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char input[]  = new char[100];
int l =0; // 
while((l = isr.read(input)) != -1){  // 根据读取到的实际数据量去操作
System.out.println(new String(input,0,l)); // 偏移量和长度,也就是说从零到当前的长度
}
isr.close();
fis.close();
拷贝字符流:
FileInputStream fis = new FileInputStream("java.txt");
FileOutputStream fos = new FileOutputStream("java_new.txt");
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fis,"UTF-8");
char input[]  = new char[100];
int l =0; // 
while((l = isr.read(input)) != -1){ // 读取到多少字符就写入多少字符
osw.write(input,0,l);
}
isr.close();
fis.close();
osw.close();
fos.close();

带有缓冲的字符流

FileInputStream fis = new FileInputStream("java.txt");
  FileOutputStream fos = new FileOutputStream("java_new.txt");
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fis,"UTF-8");
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); // 可以直接打印出换行后的文档
}
pw.flush(); // 将所有缓冲区的内容强制输出(保证文件的内容一定是完整的)
br.close();
// bw.close();
pw.close();
isr.close();
fis.close();
osw.close();
fos.close();

FileReader与FileWriter(读取文件的文本数据)

操作纯文本非常方便

RandomAccessFile随机文件读写

可以为每一个线程指定一个固定的写入区域,用于多线程的下载多线程的文件传输等等,在读取的时候也可以指定的让RandomAccessFile读取文件中的特定内容


Apache IO库操作IO与文件

可以观看极客学院视频详细讲解:http://www.jikexueyuan.com/course/215_9.html?ss=1(使用谷歌浏览器观看)








原创粉丝点击