java --IO流 節點流練習程式碼
阿新 • • 發佈:2018-11-09
1.拼接路徑
package cn.jbit.lesson.sep;
import java.io.File;
/**
* IO路徑
* @author penny
*
*/
public class PathDemo01 {
public static void main(String[] args) {
String path = "D:\\e- java\\T\\622K~~$WS5SR}9S~[E5JS5S.png";
System.out.println(File.separator);
//建議
//1./
path = "D:/e- java/T/622K~~$WS5SR}9S~[E5JS5S.png" ;
System.out.println(path);
//2.常量拼接
path = "D:"+File.separator+"e- java"+File.separator+"T"+File.separator+"622K~~$WS5SR}9S~[E5JS5S.png";
System.out.println(path);
}
}
2.構造File物件的方法
package cn.jbit.lesson.sep;
import java.io.File;
/**
* 構造器
* @author MacBook
*
*/
public class FileDemo02 {
public static void main(String[] args) {
String path = "D:/e- java/T/622K~~$WS5SR}9S~[E5JS5S.png";
//1.構造File物件,
File src = new File(path);
System.out.println(src.length());
//2.從父路徑名字串和子路徑名字串建立新的 File例項
src = new File("D:/e- java/T","622K~~$WS5SR}9S~[E5JS5S.png");
System.out.println (src.length());
//3.從父抽象路徑名和子路徑名字串建立新的 File例項
src=new File(new File("D:/e- java/T"),"622K~~$WS5SR}9S~[E5JS5S.png");
System.out.println(src.length());
}
}
3.檔案狀態標準程式碼
package cn.jbit.lesson.sep;
import java.io.File;
/**
* 檔案狀態標準程式碼
* @author MacBook
*
* 檔案狀態:
* 1.不存在:exists
* 2.存在
* 檔案:isFile
* 資料夾:isDirectory
*
*
*/
public class FileStatus {
public static void main(String[] args) {
File src=new File("xxx");
if(null==src || !src.exists()) {
System.out.println("檔案不存在");
}else {
if(src.isFile()) {
System.out.println("檔案操作!");
}else {
System.out.println("資料夾操作");
}
}
}
}
4.createNewFile & delete
package cn.jbit.lesson.sep;
import java.io.File;
import java.io.IOException;
/**
* createNewFile 建立檔案
* 注意:1.不能建立資料夾,只能建立檔案
* 2.不存在才建立(返回true)
* 3.con是作業系統的裝置名,不能正確的被建立
*
* delete 刪除已經存在的檔案
* @author MacBook
*
*/
public class FileDemo03 {
public static void main(String[] args) throws IOException {
//建立新的檔案
File src = new File("D:/e- java/T/io.png");
boolean flag = src.createNewFile();
System.out.println(flag);
//並不是資料夾,而是一個沒有後綴的檔案
src = new File("D:/e- java/T");
flag = src.createNewFile();
System.out.println(flag);
//刪除
flag = src.delete();
System.out.println(flag);
}
}
5.建立目錄
package cn.jbit.lesson.sep;
import java.io.File;
/**
* 建立目錄
* 1.mkdir():確保上級目錄存在,不存在建立失敗
* 2.mkdirs():上級目錄可以不存在,不存在一同建立
* 推薦使用mkdirs
* @author MacBook
*
*/
public class DirDemo01 {
public static void main(String[] args) {
File dir = new File("D:/e- java/T/dir/test");
//建立目錄 mkdirs()
boolean flag = dir.mkdirs();
System.out.println(flag);
//mkdir
dir = new File("D:/e- java/T/dir/test01");
flag = dir.mkdir();
System.out.println(flag);
}
}
6.下一級資訊
package cn.jbit.lesson.sep;
import java.io.File;
/**
* 列出下一級
* 1、list():列出下級名稱
* 2、listFile():列出下級File物件
* 3、listRoots():列出所有的碟符
* @author MacBook
*
*/
public class ListDemo01 {
public static void main(String[] args) {
File dir = new File("D:/e- java/T");
//下級名稱
String[] subNames = dir.list();
for(String s:subNames) {
System.out.println(s);
}
//下級物件 listFile()
File[] subFiles = dir.listFiles();
for(File s:subFiles) {
System.out.println(s);
}
//碟符
File[] subRoots = dir.listRoots();
for(File s:subRoots) {
System.out.println(s.getAbsolutePath());
}
}
}
7.遞迴
(1)列印1-10的數
package cn.jbit.lesson.sep;
/**
* 遞迴
* @author MacBook
*
*/
public class Dirdemo02 {
public static void main(String[] args) {
printTen(1);
}
//列印1-10的數
public static void printTen(int num) {
//1.出口
if(num>10) { //遞迴頭;結束遞迴
return;
}
System.out.println(num);
printTen(num+1);//自己呼叫自己
}
}
(2)使用遞迴檢視檔案目錄
package cn.jbit.lesson.sep;
import java.io.File;
/**
* 使用遞迴檢視檔案目錄
* @author MacBook
*
*/
public class DirDemo03 {
public static void main(String[] args) {
File src = new File("D:/e- java/T");
printName(src,1);
}
public static void printName(File src,int deep) {
/**
* 目的是檢視這個檔案所有層的下級的名字
* 思路:先判斷是不是存在
* 存在則判斷是不是目錄
* 如果是目錄就可以進行遞迴
*
*/
//為了輸出的時候顯示出層次感 ,加入了這樣的程式碼
for(int i=0;i<deep;i++) {
System.out.print("*");
}
System.out.println(src.getName());
if(null ==src || !src.exists()) {
System.out.println("不存在!");
return;
}else if(src.isDirectory()){ //判斷是目錄
for(File s:src.listFiles()) {
printName(s,deep+1);
}
}
}
}
8.Byte
電腦:位元組
人:字元
從字元->位元組 叫做編碼(encode)
從位元組到字元叫解碼(decode)
unicode 有定長和變長,定長是utf-16,統一2個位元組,比較浪費空間,utf-16又分為utf-16BE(高位元組低地址)和utf-16LE(低位元組低地址);變長是utf-8,英文1個位元組,中文3個位元組。
ANSI: 是中文的WINDOWS系統中的GBK
package cn.jbit.lesson.sep;
import java.io.UnsupportedEncodingException;
/**
* getBytes
* @author MacBook
*
*/
public class ByteDemo01 {
public static void main(String[] args) throws UnsupportedEncodingException{
//準備一個字串
String msg = "性命生命使命";
//編碼:位元組陣列
byte[] datas = msg.getBytes();
// System.out.println(datas.length);//18
//
// //編碼其他字符集
// datas = msg.getBytes("UTF-16LE");
// System.out.println(datas.length);//12
//
// //編碼其他字符集
// datas = msg.getBytes("GBK");
// System.out.println(datas.length);//12
//
//模擬服務遠端傳一個數組給我,要對其進行還原
//解碼 :從位元組->字元
//構造器解碼
//String(byte[] bytes, int offset, int length, Charset charset)
msg = new String(datas,0,datas.length,"utf-8");
System.out.println(msg);
/*
* 解碼出現亂碼,原因如下:
* 1)位元組數不夠
*/
msg = new String(datas,0,datas.length-2,"utf-8");
System.out.println(msg);
/*
* 2) 字符集不統一
*/
msg = new String(datas,0,datas.length,"gbk");
System.out.println(msg);
//注意:在進行編碼的時候可以進行編制任何模式的位元組碼,但是在解碼的時候必須與原有得格式保持一致,否則回出現亂碼
}
}
9.位元組流和字元流(輸入流)
(1)第一個程式, 不標準的寫法(便於理解)
package cn.lesson.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 理解操作步驟:
* 1.建立源
* 2.選擇流
* 3.操作(read \write)
* 注意:read讀取資料時,如果資料不存在,則返回-1
* 4.釋放資源
*
* @author MacBook
*
*/
public class IoTest01 {
public static void main(String[] args) {
//1.建立源
File src = new File("test.txt");
//2.選擇流
try {
InputStream is = new FileInputStream(src);
//3.操作流(讀取)
int temp1 = is.read();
int temp2 = is.read();
int temp3 = is.read();
int temp4 = is.read();
System.out.println((char)temp1);
System.out.println((char)temp2);
System.out.println((char)temp3);
System.out.println((char)temp4);
//4.釋放資源
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(2)標準的寫法
先修改迴圈,再將釋放流的過程放到finally中去,最後將is的作用域提升上去。
package cn.lesson.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 理解操作步驟,標準:
* 1.建立源
* 2.選擇流
* 3.操作(read \write)
* 注意:read讀取資料時,如果資料不存在,則返回-1
* 4.釋放資源
*
* @author MacBook
*
*/
public class IoTest01 {
public static void main(String[] args) {
//1.建立源
File src = new File("test.txt");
//2.選擇流
InputStream is =null;
try {
is = new FileInputStream(src);
//3.操作流(讀取)
int temp;
while((temp=is.read())!=-1) {
System.out.println((char)temp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//4.釋放資源
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(3)分段讀取(以下4個程式碼重要)
package cn.lesson.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 分段讀取
* @author MacBook
*
*/
public class IoTest11 {
public static void main(String[] args) {
//1.建立源
File src = new File("test.txt");
//2.選擇流
InputStream is = null;
try {
is = new FileInputStream(src);
//3.操作(分段讀取)
byte[] flush = new byte[1024*10*5];//1024表示1K,*10 就是10k,再*5,就是50K,不要將它們算出來,這樣寫好維護
int len=-1;
while((len= is.read(flush))!=-1) {
String str = new String(flush,0,len);//解碼
System.out.println(str);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//4.釋放資源
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
10.輸出流
注意:(1)OutPutStream中建立源的時候檔案可以不存在,會幫助我們自動建立一個,但是InPutStream就必須要存在才能進行操作。
(2)可以再後面追加 true:直接再後面追加,false :從第一個開始追加(相當於修改)
package cn.lesson.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 操作步驟
* 1.建立源
* 2.選擇流
* 3.操作(write)
* 4.釋放資源
* @author MacBook
*
*/
public class IoTest16 {
public static void main(String[] args) {
//1.建立源
File src = new File("out.txt");
//2.選擇流
OutputStream os = null;
try {
os = new FileOutputStream(src,false);
/*
* 3.操作(寫入)
* 將字串->位元組,要編碼
*/
//我們要寫入的字串
String str = "io is so easy";
//將字串進行編碼寫入
byte[] b = str.getBytes();//編碼
os.write(b,0,b.length );//寫入
os.flush();//養成重新整理的好習慣
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//4.釋放
if(os!=null) {
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
11.複製
注意:先開啟的流後關閉
package cn.lesson.io;
import java.io.File;
import java.io