1) 字節:BufferedInputStream/BufferedOutputStream:內部帶了一個緩衝區,把物理文件中的內容讀取到內部緩衝區中,之後再從內部緩衝區中讀取到程序中。
例:
package com.wx;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author wx
* 字節緩衝輸入,輸出流
*/
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
bis=new BufferedInputStream(new FileInputStream("d:"+File.separator+"123abc.jpg"));
bos=new BufferedOutputStream(new FileOutputStream("F:"+File.separator+"test.jpg"));
int i=bis.read();
while(i!=-1){
bos.write(i);
i=bis.read();
}
bos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bis!=null){
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bos!=null){
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
2) 字符:BufferedReader/BufferedWriter:
例1:
package com.wx;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author wx
* 字符緩衝輸出流 BufferedWriter
*/
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new FileWriter("d:"+File.separator+"a.txt"));
bw.write("第一行");
bw.newLine();
bw.write("第二行");
bw.newLine();
bw.write("第三行");
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
例2:
package com.wx;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* @author wx
* BufferedReader 字符緩衝輸入流
*/
public class Test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader br=null;
try {
br=new BufferedReader(new FileReader("d:"+File.separator+"a.txt"));
String str=br.readLine();
while(str!=null){
System.out.println(str);
str=br.readLine();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
1) InputStreamReader需要和InputStream“套接”,它可以將字節流中讀入的字節解碼成字符
例:
package com.wx;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wx
* InputStreamReader 字節解碼成字符
*/
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
InputStreamReader isr=null;
try {
isr=new InputStreamReader(new FileInputStream("d:"+File.separator+"b.txt"),"iso-8859-1");
int i=isr.read();
while(i!=-1){
System.out.println((char)i);
i=isr.read();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(isr!=null){
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
2) OutputStreamWriter需要和OutputStream“套接”,它可以將要寫入字節流的字符編碼成字節
例:
package com.wx;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* @author wx
* OutputStreamWriter 字符---》字節
*/
public class Test5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
OutputStreamWriter osw=null;
try {
osw=new OutputStreamWriter(new FileOutputStream("d:"+File.separator+"b.txt"));
osw.write("張三");
osw.write("王五");
osw.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(osw!=null){
try {
osw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
3. 對象流:用於存儲和讀取基本類型數據或對象的過濾流
1)ObjectOutputStream保存基本類型數據或對象:序列化
例:
package com.wx;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import com.model.Student;
/**
* @author wx
* 序列化
*/
public class Test6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream("d:"+File.separator+"c.dat"));
oos.writeObject(new Student(1001,"張三",10,"北京"));
oos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(oos!=null){
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
2)ObjectInputStream讀取基本類型數據或對象:反序列化
例:
package com.wx;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import com.model.Student;
/**
* @author wx
* 反序列化
*/
public class Test7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(new FileInputStream("d:"+File.separator+"c.dat"));
Object obj=ois.readObject();
Student stu=(Student)obj;
System.out.println(stu.getId()+stu.getName()+stu.getAge()+stu.getAddress());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(ois!=null){
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
1) 能被序列化的對象所對應的類必須實現java.io.Serializable這個標識性接口
基本類型的包裝類、String類、java.util.Date、java.util.Calendar類都實現了Serializable接口。
2) transient關鍵字修飾成員變量時,表示這個成員變量是不需要序列化的。
static修飾的成員變量也不會被序列化。
3) 實現了Serializable接口的類都應該生成一個private static final long serialVersionUID 序列化版本ID作爲標識。這個標識會序列化到流中
4. 其它流
1) 數據流:DataInputStream/DateOutputStream
2) 打印流:PrintStream/PrintWriter,這類流的操作永遠不會拋出IO異常
3) 隨機訪問文件:RandomAccessFile類
5. 進程:一個正在運行的程序,有獨立的內存空間。進程之間的切換開銷大。
線程:是進程中的一條執行路徑,共享進程的內存空間。線程之間的切換開銷小。
★6. 創建線程的兩種方式:
1) 繼承自java.lang.Thread類,重寫它的run()方法,run()方法體就是線程體。
例:
package com.wx;
/**
* @author wx
* 繼承Thread類 創建線程
*/
public class Test8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("主線程執行了");
MyThread my=new MyThread();
//啓動線程
my.start();
MyThread1 my1=new MyThread1();
my1.start();
System.out.println("主線程執行完畢");
}
}
/**
* 線程類
* @author wx
*
*/
class MyThread extends Thread{
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=100;i++){
System.out.println("子線程1:"+i);
}
}
}
class MyThread1 extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=100;i++){
System.out.println("子線程2:"+i);
}
}
}
2) 實現java.lang.Runnable接口,實現它的run()方法。把這個Runnable實例作爲參數構造成Thread的實例
例:
package com.wx;
/**
* @author wx
*
*/
public class Test9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("主線程:"+Thread.currentThread().getName());
MyThread3 my=new MyThread3();
Thread t=new Thread(my);
t.setName("線程一:");
t.start();
System.out.println("線程是否活着:"+t.isAlive());
System.out.println("線程的狀態:"+t.getState());
System.out.println("線程名稱:"+t.getName());
System.out.println("主線程執行完畢");
}
}
class MyThread3 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=100;i++){
System.out.println("子線程1:"+i);
}
}
}
1) MyThread mt = new MyThread(); mt.start();
2) MyRun mr = new MyRun(); Thread t = new Thread(mr); t.start();
7. Thread類中常用方法:
1) public static Thread currentThread(); //當前線程的引用
2) public ClassLoader getContextClassLoader();
// InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xxx.yyy");
3) public String getName();
public void setName(String name);
4) public Thread.State getState();
8.線程的分類
用戶線程:用戶自己創建的線程
守護線程:專門給用戶線程提供服務的就是守護線程。
GC就是典型的守護線程
爲什麼需要多線程?
提高用戶體驗
充分利用CPU
改善程序結構
例:
package com.wx;
/**
* @author wx
*用程序模擬鐵路售票系統:實現通過四個售票點發售某日某次列車的1000張車票,一個售票點用一個線程表示。
*/
public class Test10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyTickets my=new MyTickets();
//創建四個窗口
Thread t1=new Thread(my);
t1.setName("窗口一:");
t1.start();
Thread t2=new Thread(my);
t2.setName("窗口二:");
t2.start();
Thread t3=new Thread(my);
t3.setName("窗口三:");
t3.start();
Thread t4=new Thread(my);
t4.setName("窗口四:");
t4.start();
}
}
class MyTickets implements Runnable{
int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(count<100){
System.out.println(Thread.currentThread().getName()+"正在賣出第"+(count+1)+"票");
count++;
}else{
break;
}
}
}
}