緩衝流,轉換流,對象流,進程,線程

1. 緩衝流:過濾流,一定要套接節點流。
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();
}
}
}

}
}


2. 轉換流:轉換流用於在字節流和字符流之間轉換。Jave SE API提供了兩種轉換流:

 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;
}
}
}
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章