---------------------- android培训、java培训、期待与您交流! ----------------------
今天熟悉和复习是java.io,主要看的是毕老师javaIO第19天的视频。javaIO看似复杂,其实就是得理解他其中的体系关联。IO中四个抽象类InputStream,OutputStream,
Reader,Writer这四个抽象类,所有的IO流都是从这几个类衍生出来的 ,基本分为三类:
1.有基本的流FileInputStream,FileOutputStream,FileReader,FileWriter等。
2.有装饰类,带缓冲功能的流BufferedInputStream, BufferedOutputStream,BufferedReader,BufferedWriter等。
3.还有转换流,InputStreamReader OutputStreamWriter。
学习IO,需要理解好这三大类,把握他们之间的关系。
IO 中的转换流 :InputStreamReader OutputStreamWriter。
InputStreamReader 是字节流通向字符流的桥梁。它使用指定的 charset 读取字节并将其解码为字符集。
public InputStreamReader(InputStream in,
String charsetName)
OutputStreamWriter 是字符流通向字节流的桥梁。
public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException
创建使用指定字符集的 OutputStreamWriter。
转换流是字符和字节流之间的桥梁,一般在需要码表转换时用。
windows中文系统中默认使用GBK码表
中文码表 GB18030>GBK>GB2312。一般的网页采用是utf-8(jsp和servlet做javaweb项目时常用utf-8码表)。
System.in 标准输入流 默认输入设备是键盘
System.out 标准输出流 默认输出的在控制台打印
可以更该System.setIn(InputStream in)
重新分配输入流 可以是FileInputStream
这样的输入流便是所指向的文件流同样调用System.setOut(PrintStream out) 也可以重新分配输出流 也可以将输出写入到一个文件中去。
流只能操作数据 ,对文件和文件目录的操作用File。
依旧上今天的代码:
/***Administrator
*2012-6-10上午09:07:09
*MyBufferedReader.java
*明白BufferedReader中的readline()这个高效的方法 模拟一下
*装饰设计模式
*/
package jun.io.path;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class MyBufferedReader extends Reader {
private Reader reader = null;;
StringBuilder sb = null;
public MyBufferedReader(Reader reader) {
this.reader = reader;
}
public String readLine() throws IOException {
sb = new StringBuilder();
int chr = 0;
while ((chr = reader.read()) != -1) {
if (chr == '\r')
continue;
if (chr == '\n')
return sb.toString();
else
sb.append((char) (chr));
}
if (sb.length() != 0)
return sb.toString();
return null;
}
public static void main(String[] args) {
MyBufferedReader r = null;
try {
r = new MyBufferedReader(new FileReader("src//1.txt"));
String s = null;
while ((s = r.readLine()) != null) {
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
// 调用子类实现的方法
return reader.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
reader.close();
}
}
/***Administrator
*2012-6-10上午10:47:09
*MyLineNumberReader.java
*/
package jun.io.path;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
public class MyLineNumberReader extends MyBufferedReader {
public int getLineNumber() {
return lineNumber;
}
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
private int lineNumber = 0;
public MyLineNumberReader(Reader reader) {
super(reader);
}
public String readLine() throws IOException {
String s = super.readLine();
if (s != null)
lineNumber++;
// 这里毕老师的视频中 没用进行判断 而是每次调用这个方法都自动加一,不严谨。
// 查看LineNumberReader的源码 也会发现sun也是做了判断的
return s;
}
public static void main(String[] args) {
MyLineNumberReader mr =null;
try {
/*
* LineNumberReader lnr= new LineNumberReader(new
* FileReader("src/1.txt")); String s=null;
* //lnr.setLineNumber(200); while((s= lnr.readLine()) != null ) {
* System.out.println(lnr.getLineNumber()+"::"+s);
*/
mr= new MyLineNumberReader(new FileReader(
"src/1.txt"));
String str = null;
mr.setLineNumber(200);
while ((str = mr.readLine()) != null) {
System.out.println("第"+mr.getLineNumber()+"行"+str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
mr.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
}
/***Administrator
*2012-6-10上午11:29:22
*TestFileCopy.java
*熟悉转换流 InputStramReader OutputStreamWriter
*/
package jun.io.path;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Date;
public class TestFileCopy {
public static void main(String[] args) {
BufferedReader in = null;
BufferedWriter out = null;
try {
//转换流的应用
in = new BufferedReader(new InputStreamReader(System.in));
// out = new BufferedWriter(new OutputStreamWriter(System.out));
// out = new BufferedWriter(new FileWriter("src/log.txt",true));
out = new BufferedWriter(new OutputStreamWriter(System.out));
String s = null;
while ((s = in.readLine()) != null) {
if ("quit".equals(s)) {
System.out.println("成功退出...");
break;
} else {
out.write( new Date()+"::"+s.toUpperCase());
out.newLine();
out.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package jun.io.path;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionInfo {
public static void main(String[] args) {
try {
int[] arr = new int[2];
System.out.println(arr[3]);
} catch (Exception e) {
try {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy年MM月dd日 HH:mm:ss ");
PrintStream ps = new PrintStream("src/logException.log");
System.setOut(ps);
ps.println( sdf.format(date));
} catch (FileNotFoundException e1) {
throw new RuntimeException("日志文件创建失败");
}
e.printStackTrace(System.out);
}
}
}
通过对IO的学习,认识到javaIO 操作的强大,操作起来也很方便。还有毕老师讲课也很有趣,哈哈!努力!
---------------------- android培训、java培训、期待与您交流! ----------------------