1、 流操作规律总结
【分析步骤:】
(1) 明确源与目的
源: 输入流。 InputStreamReader
目的: 输出流。 OutputStreamWriter.
(2) 操作的数据是否是纯文本
是: 字符流
否: 字节流
(3) 确定具体的对象
原设备: 内存、硬盘、键盘
目的设备: 内存、硬盘
(4) 是否考虑效率问题
2、字节字符转换
普通录入打印:
InputStream in = System.in() ;
StringBuilder sb =newStringBuilder();
char chr=null;
While(ture){
chr=in.read(); //是否可以换成readline()高效读取?后者只属于字符流
if ( chr==’\r’)
continue;
if( chr==’\n’) {
String s = sb.toString();
System.out.println(s.toUppercase());
sb.delete(0,sb.length());
break;}
//遇到特殊字符结束
if (“over”.equals(s))
break;
else
sb.append (chr);
}
字节转换成字符录入打印:
InputStreamin = System.in() ; //回车键表示一次输入结束。
//转换成字符流对象
InputStreamReader inr = new InputStreamReader(in); //键盘输入是字节流,可转成字符流。
// 按字符流处理
BufferedFileReader bfr = new BufferedFileReader(inr);
/**
BufferedFileReader bfr =
newBufferedFileReader(new inputStreamWriter (System.in())); */
String line =null;
While ( line =bfr.readline()!=null){ // readline()
if(“over”.equals(line))
break;
System.out.println(line.toUpperCase());
}
inr.close().
OutputStream out =System.out();
OutputStreamWriter osw =
BufferedFileWriter bfw = new BufferedFileWriter (osw); //装饰System.out()方法;
/**
BufferedFileWriter bfw =
new BufferedFileWriter(newOutputStreamWriter (System.out()));
*/
String line =null;
While ( line =bfr.readline()!=null){
if(“over”.equals(line))
break;
bfw.write(line.toUppercase());
bfw.newline();
}
bfw.flush();
bfr.close().
【改变输入输出设备】
System.setIn(“Demo.java”);
System.setOut(“pro.txt”);
BufferedFileReader bfr =
new BufferedFileReader(new inputStreamWriter(System.in()));
BufferedFileWriter bfw =
new BufferedFileWriter(newOutputStreamWriter (System.out()));
String line =null;
While ( line =bfr.readline()!=null){
if(“over”.equals(line))
break;
bfw.write(line.toUppercase());
bfw.newline();
}
bfw.flush();
bfr.close().
3、字符编码
【指定编码表】:转换流提供的定义功能。
OutputStreamWriter(
OutputStream out,
String charsetName)
BufferedReader bfr=
new BufferedWriter (new InputStreamWriter (new FileInputStream(2.mp3),”utf-8”));
BufferedWriter bfw=
new BufferedWriter (new OutputStreamWriter (new FileOutputStream(2.mp3),”utf-8”));
默认编码表是GBK。
编码:字符串变字节数组
String ----> byte[] str.getBytes(charseName);
解码:字节数组变字符串
byte[] ---> String
Stirng str = String(byte[],charseName);
解决乱码问题:
Stringstr=”你好”;
Bytes[] bt = str.getBytes(“GBK”);
String string = new Strng(bt,”iso8959_1”);
// 对乱码string进行处理
Bytes[] bt = string.getBytes(“iso8859_1”);
String string = new Strng(bt,”GBK”);
Utf-8--->GBk解码:
// 对于同时识别同一编码表的无法解决,仍然出现乱码
Bytes[] bt = string.getBytes(“utf-8”);
String string = new Strng(bt,”GBK”);
“联通”GBK 与UTF-8编码冲突,UTF-8包容各种编码表,其中,不同编码表由该字节的头数字标识。
联通------utf(open)------>��ͨ
你联通------utf(open)------->��ͨ