java io流 傳輸操做java
字節流和字符流的區別:
緩存
讀寫單位不一樣:字節流以字節(8bit)爲單位,字符流以字符爲單位,字符流就是 : 字節流+編碼表。服務器
處理對象不一樣:字節流能處理全部類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。網絡
純文本數據優先考慮字符流 別的 字節流socket
經常使用 字節流:tcp
FileInputStream //字符流讀文件函數
FileOutputStream //字符流寫文件編碼
BufferedInputStream //帶緩衝區的 讀文件spa
BufferedOutputStream //帶緩衝區 寫文件code
字符流:
Writer Reader
FileReader //文件讀
FileWriter //文件寫
BufferedReader //緩存讀操做
BufferedWriter //緩存寫操做
建立一個能夠往文件中寫入字符數據的字符輸出流對象,若是文件不存在,則會自動建立。若是文件存在,則會被覆蓋。
由於不一樣系統換行符號不一樣因此,能夠調用系統函數得到換行符號,便於不一樣系統移植
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //換行符
FileWriter fw = new FileWriter("demo.txt",true); //建立一個文件 fw.write("abcde"+LINE_SEPARATOR+"hahaha"); //數據寫入到臨時存儲緩衝區中。 fw.flush(); //數據緩衝區刷到文件中 fw.close(); //這個其實會自動調用 flush;上面那樣寫 能夠實時保存
讀文件 單個字符模式
FileReader fr = new FileReader("demo.txt"); //打開要讀的文件 int ch = 0; while((ch=fr.read())!=-1){ //文件結束符 爲 -1 ,得到單個字符 System.out.println((char)ch); } fr.close();
單個字符讀,操做次數多,浪費資源,因而出現多個字符緩衝區方式讀取
FileReader fr = new FileReader("demo.txt"); char[] buf = new char[1024]; //一次讀取 1024字節 int len = 0; while((len=fr.read(buf))!=-1){ System.out.println(new String(buf,0,len)); } fr.close();
一個文件讀取寫入另外一個文件 規範的寫法 考慮拋異常
FileReader fr = null; FileWriter fw = null; try { fr = new FileReader("a.txt"); fw = new FileWriter("b.txt"); char[] buf = new char[BUFFER_SIZE];//緩衝區。 int len = 0; while((len=fr.read(buf))!=-1){ fw.write(buf, 0, len); } } catch (Exception e) { throw new RuntimeException("讀寫失敗"); }finally{ if(fw!=null) //證實打開的文件不爲空 try { fw.close(); } catch (IOException e) { e.printStackTrace(); } if(fr!=null) try { fr.close(); } catch (IOException e) { e.printStackTrace(); } }
java自己帶了緩存對象,能夠直接調用 文件打開 操做
FileWriter fw = new FileWriter("buf.txt"); BufferedWriter bufw = new BufferedWriter(fw); // String line = null; while((line=bufr.readLine())!=null){ //一次 讀一行 System.out.println(line); } FileWriter fw = new FileWriter("buf.txt"); BufferedWriter bufw = new BufferedWriter(fw); bufw.write("abcdef"+x); bufw.newLine(); bufw.flush(); bufw.close(); //關閉緩衝區 防止內存泄露 這個不須要關閉 文件
字節流例子
FileInputStream fis = new FileInputStream("bytedemo.txt"); byte[] buf = new byte[1024]; int len = 0; while((len=fis.read(buf))!=-1){ //文件沒結束 System.out.println(new String(buf,0,len)); } FileOutputStream fos = new FileOutputStream("bytedemo.txt"); fos.write("abcdefg".getBytes()); //文件中寫入數據 //fos.flush(); fos.close();//關閉資源動做要完成。
拷貝一首MP3文件
FileInputStream fis = new FileInputStream("c:\\0.mp3"); BufferedInputStream bufis = new BufferedInputStream(fis); //緩衝區方式 FileOutputStream fos = new FileOutputStream("c:\\2.mp3"); BufferedOutputStream bufos = new BufferedOutputStream(fos); int ch = 0; while((ch=bufis.read())!=-1){ bufos.write(ch); } bufos.close(); //關閉緩存區 bufis.close();
字符/字節流直接的轉換 InputStreamReader、OutputStreamWriter
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 字節流到字符流
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
字符流道字節流 轉換橋
java網絡通訊 UDP函數
DatagramSocket ds = new DatagramSocket(10000); //UDP 綁定端口 while(true){ byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //UDP包對象 ds.receive(dp);//阻塞式的。 //4,經過數據包對象的方法,解析其中的數據,好比,地址,端口,數據內容。 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength()); //數據 System.out.println(ip+":"+port+":"+text); } ds.close();
UDPsend
DatagramSocket ds = new DatagramSocket(); BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=bufr.readLine())!=null){ byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000); //udp發送包 ds.send(dp); if("886".equals(line)) break; } ds.close();
TCP通訊對象 客戶端
Socket socket = new Socket("192.168.1.100",10002); //服務器IP 端口 OutputStream out = socket.getOutputStream(); //輸出的信息 out.write("tcp 輸出".getBytes()); InputStream in = socket.getInputStream(); //接收到的信息 byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf,0,len); System.out.println(text); socket.close();
服務器端
ServerSocket ss = new ServerSocket(10002); Socket s = ss.accept(); //得到客戶端對象 String ip = s.getInetAddress().getHostAddress(); //得到客戶端IP InputStream in = s.getInputStream(); //接收到的客戶端數據 byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf,0,len); System.out.println(ip+":"+text); OutputStream out = s.getOutputStream(); //發送到客戶端數據 out.write("收到".getBytes()); s.close(); ss.close();