JavaIO(一)

I/O流的基本概念
第一 什么是I/O流?
I: Input,输入
O: Output,输出
流: 数据的流向


I/O流: 输入/输出流


数据流按流动的方向分为:输入流与输出流
数据流按字符和字节分为:字节流与字符流
读/写二进制数据称为字节流
读/写字符数据称为字符流
字符:abcdefl....1234234!@#%!^$&!%*@#$ 中国


计算机编码:
什么叫“编码”? 计算机只认识0/1,假设要在计算机上存放字母"A",就必须把字母与二进制数做对应。因此有了编码表。
把字符转成1/0二进制数据的过程,就称为“编码”。
ASCII: [美国专用的编码]
为什么要有编码,编码是给计算机程序用的,还有一部分原因是贴近人类的现实生活的语言。
ISO 8859-1: [后一位加入拉丁语言]
GB2312: [对ASCII的中文扩展,大约7000多个简体汉字]
GBK: [对GB2312编码表进行扩展,增加了近20000个新的汉字]




问题?世界各国的编码表不统一,导致了软件开发非常困难。
为了解决这个问题,上帝降临了,一个叫什么国际准化的组织发明了一个世界通用的编码表叫做:UNICODE


UTF-8: [UTF-8是Unicode的实现方式之一, 用于网络传输]


------------------------------------------------------------------


字符流的基类是:Writer/Reader


// 文件结束的标记是:-1


使用示例FileReader:
/*
 * 需求: 使用I/O流技术编写一个程序,该程序能够读取*.txt文件里的内容
 * 读取字符的示例:使用的是字符流FileReader
 */
public class FileReaderTest {
public static void main(String[] args) throws IOException {
// 读取.txt文件里的数据,为什么我要选FileReader?
// 因为.txt文件里存放的都是"字符",所以选用字符流来读取,
// 而又因为是读操作,所以选用Reader下的子类:FileReader
FileReader reader = new FileReader("E:\\1.txt");
int value = 0;
while( (value = reader.read()) != -1 ) {
System.out.println((char)value);
}
reader.close();
}
}


/*
 * 需求: 使用I/O流技术编写一个程序,该程序能够向*.txt文件写一串字符
 */
public class FileWriterTest {
public static void main(String[] args) throws IOException {

// 同时也相当于打开1.txt文件
FileWriter fw = new FileWriter("e:/1.txt");

// 把数据写到了内存上,此时还没写到硬盘上
// 具体来说,是写到了FileWriter这个对象的缓冲区里面。
fw.write(66);

// 调用flush方法,会刷新缓冲区里的内存数据到硬盘上去。
// fw.flush();

// 关闭流对象
// close()方法内部会自动先调用flush()方法
fw.close();

// FileWriter fw = new FileWriter("e:\\1.txt");

}
}


/*
 * 需求: 把D盘上的1.txt文件拷贝到E盘上
 */


public class CopyTest {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\1.txt");
FileWriter fw = new FileWriter("E:\\1.txt");
int i = 0;
while((i = fr.read()) != -1) {
// System.out.println((char)i);
fw.write(i);
}
fr.close();
fw.close();
}
}




为什么这些流需要缓冲区呢?
答:因为使用缓冲区可以加快速度。缓冲区的读写能力比硬盘的读写能力强得多多了。


BufferedReader/BufferedWriter


BufferedReader/BufferedWriter使用了设计模式里的“装饰设计模式”
public static void main(String[] args) throws IOException {
// FileReader reader = new FileReader("E:\\1.txt");
// int value = 0;
// while( (value = reader.read()) != -1 ) {
// System.out.print((char)value);
// }
// reader.close();

BufferedReader br = new BufferedReader(new FileReader("E:\\1.txt"));
// 强烈推荐使用readLine()方法,因为每次可以读取一行.

String line = "";
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}


public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\1.txt"));
bw.write("xxxxxx");
bw.close();
}


/*
刚才学的全都属于“字符流”的操作:
FileReader: 专门用来读文件的(输入流,字符流) [基类:Reader]
FileWrtier: 专门用来写文件的(输出流,字符流) [基类:Writer]
BufferedReader:可以用来读文件的(输入流,字符流),默认带缓冲区的,可以加快速度,而且有一个readLine()方法很好用![基类:Reader]
BufferedWriter:可以用来写文件的(输入流,字符流),默认带缓冲区的,可以加快速度,而且有一个write(String str)方法很好用,一次可以写一串字符数据,很方便![基类:Writer]
*/


下面来学习“字节流”的操作:
思考一个问题:刚才拷贝文本文件,我们用的是“字符流”,那是不是拷贝任何文件都可以使用字符流呢?
如果文件是二进制数据的文件,就不应该再使用“字符流”来操作了。如音乐文件,图片文件等等多媒体文件。




字节输入流的老大:InputStream
字节输出流的老大:OutputStream
具体使用的时候,使用FileInputStream和FileOutputStream




/*
 * BufferedInputStream与BufferedOutputStream的使用
 * 看作是对FileInputStream和FileOutputStream的升级版,这样好理解一点.
 * 它们也是带有缓冲区的
 */
public class BufStream {
public static void main(String[] args) throws IOException {
// BufferedInputStream bis = 
// new BufferedInputStream(new FileInputStream("E:\\myproject\\day\\IO.txt"));
//
// byte[] buf = new byte[1024];
// int len = 0;
// while((len = bis.read(buf)) != -1) {
// System.out.print(new String(buf, 0, len));
// }
// bis.close();
copy();
}
public static void copy() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\myproject\\day\\IO.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\111.txt"));

byte[] buf = new byte[1024];
int len = 0;
while((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
bis.close();
bos.close();
}
}




/*
 * 转换流:
 * InputStreamReader和OutputStreamWriter流,这对流有两个重要的作用:
 * 1. 能把字节流转换成字符流
 * 2. 能设定编码/解码方式
 * 
 * 除了InputStreamReader和OutputStreamWriter流可以设定编码/解码方式之外,
 * 还有一种更简便的方式设置编码/解码,那就是使用String的构造方法
 */


public class BufStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("E:\\myproject\\day\\aa.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, "utf-8"));
}
fis.close();

// InputStreamReader isr = new InputStreamReader(fis, "utf-8");
// BufferedReader br = new BufferedReader(isr);
// String line = "";
// while((line = br.readLine()) != null) {
// System.out.println(line);
// }

// byte[] buf = new byte[1024];
// int len = 0;
// while((len = br.readLine()) != -1) {
// System.out.print(new String(buf, 0, len));
// }

// br.close();
}
}


关于流的扩展内容:
1. System.in和System.out
2. 对象序列化流:ObjectOutputStream和ObjectInputStream
3. DataInputStream和DataOutputStream  
4. ByteArrayInputStream和ByteArrayOutputStream
5. PrintWriter


------------------------------------------------------------------------








------------------------------------------------------------------------






------------------------------------------------------------------------






------------------------------------------------------------------------






------------------------------------------------------------------------





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值