1 ascii码
Gb2312 是中文的
GBK 有2万多是gb2312的升级
UTF-8 无论什么字符都用两个字节搞定 全世界范围的
* java中 提供了之间转读取写入的编码方式
* 通用字节流,字符流基于字节流
2 字符流
- 学习一个类先看底层的方法
Writer 子类OutputStreamWriter,后缀名是父类的名称,前缀是它的操作
FileWriter fw= new Fi;eWriter(path); fw.write("abcdde"); fw.flush(); //写入后一定要刷新一下,还可以再写再刷 fw.close(); //关闭资源,关闭之前会刷新一下flush(),不能再写了
3 缓冲区
- 缓冲区的出现是为了提高流的操作效率而出现的
- 所以在创建缓冲区之前,必须要有流对象
写入数据
FileWriter fw= new FileWriter("buf.txt"); BufferedWriter bw= new BufferedWriter(fw); bw.newLine(); bw.write("hello world!"); //只要有缓冲区都要记得刷新 bw.flush(); bw.close(); //bw关闭了也就相当于fw关闭了
读取数据
FileReader fw= new FileReader("buf.txt"); BufferedReader br= new BufferedReader(fw); String s1=fr.readLine(); //读取一行 System.out.println("s1:"+s1);
readLine() 一行一行的读,返回值有的话返回字符串,当读到文件末尾返回null,当是空字符串的时候 ,返回空字符串但不是null;
readLine()f方法。看似读一行,实际上读的是一个一个地读。
abcdefghijklmn\r\n 一个一个读的时候,先一个一个读把每一个放入缓冲区中,然后等到读到\r\n后再把这一行缓冲的数据读出,他就是把数据临时存起来,它是基于read方法
4 装饰设计模式
当象想要对已有的对象功能增强时,可以先定义类,基于已有的类的方法
- 建一个类Person,实现一个方法chifan()
新建一个类SuperPerson ,定义构造函数
private Person p; SuperPerosn(Person p) { this.p=p; }
- 然后就可以新建一个功能扩展的函数
- 装饰和继承
5 LineNumberReader
LineNumberReader lr= new LineNumberReader(new FileReader(file))
lr.getLineNumber()得到从零开始的行号
lr.setLineNumber(100);得到从100开始的行号
String str=lr.ReadLine();
//一定程序上和BufferedReader的功能相似
6 用字节流输入文件
FileOutputStream fos=new FileOutputStream("fos.txt");
fos.writre("abcdefg".getBytes());
fos.close();
7 用字节流写入文件
第一种读出的是字节
FileInputStream fis=new FileInputStream("fos.txt"); int ch=0; while((ch=fis.read())!=-1) { System.out.println((char)ch); } fos.close();
第二种读出后写入数组
FileInputStream fis=new FileInputStream("fos.txt"); int len=0; //fis.available()返回的是文件内的字节个数,写入如下的缓冲数组中能定义一个准确大小的数组,数据太大的话会产生溢出 byte[] bytes=new byte[1024]; while((len=fis.read(bytes))!=-1) { System.out.println(new String(bytes,0,len)); } fos.close();
8 用字节流复制图片
字节流布恩那个复制图片,因为字符流会在编码表中着编码
fis= new FileInputStream("D:\\1.bmp"); fos=new FileOutputStream("D:\\2.bmp"); byte[] buff= new byte[1024]; int len=0; while((len=fis.read(buff))!=-1) { fos.write(buff,0,len); } fos.close()
9 字节流实现复制mp3
BufferedInputStream bufis= new BufferedInputStream(new FileInputStream("mp3文件"));
BufferedOutputStream bufis= new BufferedOutputStream(new FileOutputStream("copymp3文件"));
int by=0;
while((by=bufis.read())!=-1)
{
bufos.write(by);
}
bufis.close();
bufos.close();
10 获取键盘录入
这里输入的只能辨别单个字节
InprutStream in= System.in;
//只读的是单个字节
int by= in.read();
//字符转换为int型
'\r'+0 or (int)'\r'
* str.toUpperase() 变成大写的
* StringBuilder是一个可变字符串
InputStream in=System.in;
StringBuilder sb= new StringBuilder();
while(true)
{
int ins=in.read();
if(ins=='\r'){
continue;
}
if(ins=='\n'){
String sb1= sb.toString();
if(sb1.equals("over"))
break;
//转换大小写
System.out.println(sb1.toUpperCase());
sb.delete(0,sb.length());//删除StringBuffer的缓存
}
else
sb.append((char)ins);
}
11 InputStrenReader 字节流转换为字符流,他本身是一个字符流
//获取键盘输入对象
InputStream in= System.in;
//字节流转换为字符流
InputStreamReader isr= new InputStreamReader(in);
//提高效率,使用缓冲区技术,使用BufferReader
bufferReader bufr= new BufferedReader(isr);
//下面一句的功能顶以上三句,要记住,以后就是键盘录入的典型写法
Bufferedreader bufr= new BufferedReader(new InputStreamReader(System.in);
String line=null;
while((line=bufr.readLine())!=null)
{
if(line.wquals("over")
break;
System.out.println(line.toUpperCase());
}
12 System.out
System.out是一个InputStream的子类对象,所以他是一个字节流,把他转换为字符流的语句如下
BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(System.out); bufw.write(String); 这里写入的是字符流 这个写入之后还要刷新才能显示 bufw.flush();
13 直接通过键盘录入的字符写入文件
Bufferedreader bufr= new BufferedReader(new InputStreamReader(System.in);
BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(new FileOutputStream("out.txt"));
String line=null;
while((line=bufr.readLine())!=null)
{
if(line.wquals("over")
break;
bufw.write(line.toUpperCase());
bufw.flush();
}
bufw.close();
14 这么多流到底怎么用?
明确源和目的:
源:输入流。InputStream Reader. 目的:输出流 OutputStream Writer.
操作的数据是否是纯文本
是纯文本:字符流 不是纯文本:字节流
当以上理解后,要明确使用那个具体的对象。
- 通过设备来区分 - 源设备:内存,硬盘,键盘 - 目的设备: 内存,硬盘,控制台。
当操作的对象是纯文本的时候,并且是硬盘上的文件
- FileReader fr=new FileReader("a.txt"); - 提高效率 加上BufferedReader bufr= new BufferedReader(fr); - FileWriter fw= new FileWriter("b.txt"); - 提高效率 加上BufferedWriter bufw=new new BufferedWriter(fw);
当操作的对象是图片的时候,并且是硬盘上的文件
- FileInputStream fis=new FileInputStream("a.bmp"); - 提高效率 加上BufferedInputStream bufr= new BufferedInputStream(fis); - FileOutputStream fos= new FileOutputStream("b.bmp"); - 提高效率 加上BufferedOutputStream bufw=new new BufferedOutputStream(fos);
当操作有键盘输入呢?
- InputStreamReader isr= new InputStreamReader(System.in); - 提高效率 bufferReader bufr= new BufferedReader(isr); 1. 写入文本 - 可以用FileWriter fw= new FileWriter("c.txt") - 提高效率 BufferWriter bw= new BufferWriter(fw); - 写入文本如果需要定义编码表,则需如下的方式转换流 - BufferedWriter bufw= new BuffererWriter(new OutputStreamWriter(new FileOutputStream("out.txt"),"utf-8"); - 转换流转换不仅是字节和字符还有编码方式
15 修改默认的输入输出流
- System.setIn(。。。) 设置键盘录入默认的
- System.setOut(…) 设置默认输出
- 不懂可以查文档
- e.printStackTrace(new printStream(“a.log”);把异常信息放到文件中去
- log4j 网络上的专门的日志信息的包