JAVA自學筆記21

JAVA自學筆記21

一、轉換流
因爲字節流操做中文不是很是方便,所以java提供了轉換流
字符流=字節流+編碼表
1)編碼表
由字符及其對應的數值組成的一張表
圖解: 這裏寫圖片描述
2)String類的編碼和解碼
String(byte[] bytes,String charsetName):
經過指定的字符集解碼字節數組
byte[]getBytes(String charsetName)
使用指定的字符串編碼爲字節數組java

String s="你好";
//編碼String-byte[] 
byte[] bys=s.getBytes();//無參默認爲gbk編碼,還可填"UTF-8"等 
System.out.println(Arrays.toString(bys));

//譯碼
String ss=new String(bys);bys後無參默認gbk
System.out.pintln(ss);

2)OutputStreamWriter
OutputStreamWriter(OutputStream out)
根據默認編碼表,把字節流轉換成字符流
OutputStreamWriter(OutputStream out,String charsetName)
根據指定編碼表,把字節流轉換成字符流web

//建立對象
OutputStreamWriter osw=new OutputStreamWriter(new FileOutStream("osw.txt"));
//寫數據
osw.write("你好");
osw.close();

3)InputStreamReader()
InputStreamReader(InputStream is)
用默認的編碼讀取數據
InputStreamReader(InputStream is,String charsetName)
用指定的編碼讀取數據數組

InputStreamReader isr=new String InputStreamReader(new FileInputStream)(osw.txt));
int ch=0;
while((ch=isr.read())!=-1){System.out.print((char) ch);

isr.close();

4)5種寫數據方式
這裏寫圖片描述app

//建立對象
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("osw2.txt") )
osw.write('a');
char chs={'a','b','c','d','e'};
ose.write(chs);
ose.write(chs,1,3);
osw.write("火狐");
osw.write("每天開心火狐"23);
osw.flush();//刷新緩衝區
osw.close();//也有刷新功能,但關閉後流對象不能繼續被使用

5)2種讀數據方法
InputStreamReader
int read();一次讀取一個字符
int read(char chs)l//一次讀取一個字符數組dom

InputStreamReader isr=new InputStreamReader(new FileInputStream());

int ch=;
while((ch=isr.read()0!=-1){System.out.println((char) ch);
}

char[] chs=new char[1024];
int len=0;
while((len=isr.read(chs))!=-1){
System.out.print(new String(chs,0,len));
}
isr.close();

@例題1:字符流複製文本文件
讀取數據-字符轉換流-InputStreamRreaderide

寫出數據-字符轉換流-OuputStreamRreadersvg

InputStreamRreader isr=InputStreamRreader(new FileInputStream("a.txt"));
OuputStreamWriter osw=new OuputStreamWriter (new FileOutputStream("b.txt"));
//方式1
int ch=0;
while((ch=isr.read()0!=-1){
osw.writer(ch);
osw.close();
isr.close();
//方式2
char[] chs=new chat[1024];
int len=0;
while((len=isr.read(chs))!=-1){
osw.write(chs,0,len);
osw.fush();
}
osw.close();
isr.close();
}

轉換流的名字較長,而咱們常見的操做都是按照本地默認的編碼實現的,因此,爲了簡化咱們的書寫,轉換流提供了對應的子類
FileWriter:=FileOutputStream+編碼表(gbk)
FileReader:=FileInputStream+編碼表(gbk)ui

FileReader fr=new FileReader("a.txt");

FileWriter fw=new FileWriter("b.txt");
while((len=isr.read(chs))!=-1){
osw.write(chs,0,len);
osw.fush();
}
fw.close();
fr.close();
}
FileReader fr=new FileReader("a.txt");

FileWriter fw=new FileWriter("b.txt");
int ch;
while((ch=fr.read())!=-1){
fw.write(ch);
}
fw.close();
fr.close();

6)字符緩衝輸出(入)流
BufferedWriter
將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入,接收默認值的大小。
BufferedReader
從字符輸入流讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。編碼

寫數據spa

/* BufferedWriter bw=new BufferedWriter(new BufferedWriter(new FileOutputStream("bw.txt"))); *///複雜
BufferedWriter bw=new BufferedWriter(new FileWriter(bw.txt));
bw.write("hello");
bw.flush();
bw.close();

讀數據

BufferedReader br=new BufferedReader(new FileReader("bw.txt"));
int ch=0;
while((ch=br.read())!=-1{
System.out.print((char)ch);

br.close();//方式2略

這裏寫圖片描述

//字符緩衝流複製文件
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("b.txt"));
char[] chs=new char[1024];
int len=0;
while((len=br.read(chs))!=-1){
bw.write(chs,0,len);
bw.flush();
]
bw.close();
br.close();

圖片和視頻不能使用字符流
7)字符緩衝流的特殊功能
public String readLine()
一次讀取一行數據,不會讀取換行與回車

BufferedWriter bw=new BufferedWriter(new FileWriter("b2.txt"));
for(int x=0;x<10;x++){
bw.write("hello"+x);
bw.newLine();//換行
bw.flush(); 
}
bw.close();

//讀功能:
public static void read(){
BufferedReader(new FileReader("bw2.txt"));
String line=null;
while((line=br.readerLine())!=null){
System.out.println();
}
}
//用上述特殊功能複製文件
BufferedReader br=new BufferedReader(new FileReader("a.txt"));
BufferedReader bw=new BufferedWriter(new FileWriter("a.txt"));
String line=null;
while((ine=br.readLine())!=null{
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();

8)總結
這裏寫圖片描述

/*把集合中的數據存儲到文本文件 ArrayList集合裏存儲的是字符串 遍歷ArrayList集合,把數據獲取到 而後存儲到文本文件中,使用字符流*/

ArrayList<String>array=new Arrayist<String>();
array.add("a");
array.add("ab");
array.add("abv");

BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
for(String s:array){
bw.write(s);
bw.newLine();
bw.fush();
}
bw.close();
}
//將文本文件中的數據存儲到集合

BufferedReader br=new BufferedReader(new FileReader("b.txt"));
ArrayList<String>array=new Arrayist<String>();
String line=null;
while((line=br.readLine())!=null){
array.add(line);
}

br.close();
for(String s:array){
System.out.println(s);
}
/*隨機獲取文本文件中的名字
-把文本文件中的數據存儲到集合中
-隨機產生一個索引
-根據該索引獲取一個值
*/
BufferedReader br=new BufferedReader(new FileReader("b.txt"));
ArrayList<String>array=new Arrayist<String>();
String line=null;
while((line=br.readLine())!=null){
array.add(line);
}
br.close();
Random r=new Random();
int dex=r.nextInt(array.size());
String name=array.get(index);
System.out.print("name");
//複製單級文件夾 
/*
-封裝目錄
-獲取該目錄下的全部文本文件的File數組
-遍歷該File數組,獲得每個File對象
-把該File進行復制

File srcFolder=new File("e:\\demo");
//目的文件夾若不存在將自動建立
File destFolder=new File("w:\\test");
if(!destFolder.exists()){
destFolder.mkdir();
}
//獲取該目錄下全部文本的File數據
File[] fileArray=srcFolder.listFiles();
遍歷該File數組,獲得每個File對象
for(File file:fileArray){
String name=fie.getName();
File newFile=new File(destFolder,name);
copyFile(file,newFile);

private static void copyFile(File file,File newFile){
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
byte[] bys=new byte[1024];
int len=0;
while((len=bis.read(bys)!=-1){
bos.write(bys,0,len);
}
bos.close();
bis.c;ose();
}
數據源:e:\\java\\a.java
目的地:e:\\jad\\a.jad
//複製指定目錄下指定後綴名的文件並修改文件名
public class CopyFolderDemo {
    public static void main(String[] args) throws IOException {
        // 封裝目錄
        File srcFolder = new File("e:\\java");
        // 封裝目的地
        File destFolder = new File("e:\\jad");
        // 若是目的地目錄不存在,就建立
        if (!destFolder.exists()) {
            destFolder.mkdir();
        }

        // 獲取該目錄下的java文件的File數組
        File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".java");
            }
        });

        // 遍歷該File數組,獲得每個File對象
        for (File file : fileArray) {
            // System.out.println(file);
            // 數據源:e:\java\DataTypeDemo.java
            // 目的地:e:\\jad\DataTypeDemo.java
            String name = file.getName();
            File newFile = new File(destFolder, name);
            copyFile(file, newFile);
        }

        // 在目的地目錄下更名
        File[] destFileArray = destFolder.listFiles();
        for (File destFile : destFileArray) {
            // System.out.println(destFile);
            // e:\jad\DataTypeDemo.java
            // e:\\jad\\DataTypeDemo.jad
            String name =destFile.getName(); //DataTypeDemo.java
            String newName = name.replace(".java", ".jad");//DataTypeDemo.jad

            File newFile = new File(destFolder,newName);
            destFile.renameTo(newFile);
        }
    }

    private static void copyFile(File file, File newFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(newFile));

        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.close();
        bis.close();
    }
}
//複製多級文件夾
-封裝數據源目錄
-封裝目的地目錄
-判斷該file是文件仍是文件夾,如果文件,直接複製;如果文件夾,就在目的地目錄下建立該文件夾,並獲取該File對象下的全部文件或者文件夾File對象,遍歷獲得每個File對象,在該目錄下重複上述操做

//封裝數據源目錄
File srcFile=new File("E:\\JavaSE\\day21");
-封裝目的地目錄
File destFile=new File("E:\\");

//複製文件夾的方法
copyFolder(srcFile,destFile);
private static void copyFolder(File srcFile,File destFile){
if(srcFile.isDirectory()){
//文件夾
File newFolder=new File(destFile,srcFile.getName());
newFolder.mkdir();

//獲取該File對象下的全部文件或者文件夾File對象
File[] fileArray=srcfile.listFiles();
for(File file:fileArray){
copyFolder(null,newFolder);
}
}else{
//文件
File newFile=new File(destFile.srcFile.getName());
copyFile(srcFile,destFile);
}
}
//複製文件的方法
private static void copyFile(File srcFile,File newFile){
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                srcfile));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(newFile));

        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        bos.close();
        bis.close();
    }
}
//鍵盤錄入學生信息按照總分排序並寫入文本文件

//Student類
public class Student{
private String name;
private int math;
private int Chinese;
private int English;
//其他略}

//建立集合對象
TreeSet<Student>ts=new TreeSet<Student>(new Comparator<Student>(){
public int compare(Student s1,Student s2){
int num=s2.getSum()-s1.getSum();
int num2=num==0?s1.getChinese()-s2.getChinese():num;
int num3=num2==0?s1.getMath(0-s2.getMath:num2;
int num4=num3==0?s1.getEnglish(0-s2.getEnglish:num2;
int num5=num4==0?s1.getName().compareTo(s1.getName()):num4;
return num5;
}
});
//鍵盤錄入學生信息到集合
for(int x=1;x<=5;x++){
//略
}
Student s=new Student();
s.setName(Name);
s.setName(Chinese);
s.setName(math);
s.setName(English);

//把學生信息添加到集合
ts.add(s);
//遍歷集合,把數據寫到文本文件中
BufferedWriter bw=new BufferedWriter(new FileWriter("Students.txt"));
bw.write("學生信息以下");
bw.newLine();
bw.flush();
bw.write("姓名,語文成績,英語成績");
bw.newLine();
bw.flush();
for(Student s:ts){
StringBuilder sb=new StringBuilder();
sb.append(s.getName()).append(",").append(s.getChinese()).append(",").append(s.getEnglish());

bw.write(sb.toString());
bw.newLine();
bw.flush();
}
//釋放資源
bw.close()
}

@例題5:
這裏寫圖片描述

分析:
 *      A:把s.txt這個文件給作出來
 *      B:讀取該文件的內容,存儲到一個字符串中
 *      C:把字符串轉換爲字符數組
 *      D:對字符數組進行排序
 *      E:把排序後的字符數組轉換爲字符串
 *      F:把字符串再次寫入ss.txt中
 */
public class StringDemo {
    public static void main(String[] args) throws IOException {
        // 讀取該文件的內容,存儲到一個字符串中
        BufferedReader br = new BufferedReader(new FileReader("s.txt"));
        String line = br.readLine();
        br.close();

        // 把字符串轉換爲字符數組
        char[] chs = line.toCharArray();

        // 對字符數組進行排序
        Arrays.sort(chs);

        // 把排序後的字符數組轉換爲字符串
        String s = new String(chs);

        // 把字符串再次寫入ss.txt中
        BufferedWriter bw = new BufferedWriter(new FileWriter("ss.txt"));
        bw.write(s);
        bw.newLine();
        bw.flush();
        bw.close();
    }
}

//登陸註冊IO版

//這是用戶操做的具體實現類

public class UserDaoImpl implements private static File file=new File("user.txt")
static{
try{
file.createNewFile();
}catch(IOException e){
System.out.println("建立文件失敗")
}
}
UserDao{
boolean flag=false;
public boolean isLogin(String username,String password){
return false;
}
public void regist(User user){
BufferedWriter bw=null;
try{
br=new BufferedReader(new FileReader("user.txt"));
String line=null;
while((line=br.readLine())!=null){
String[] datas=line.split("=");
if(data[0].equals(username)&&datas[1].equals(password)){
falg=true;
break;
}
}catch(FileNOtFoundException e){
System.out.println("登陸找不到信息所在文件");
}catch(IOException e){
System.out.println("登陸失敗");
}
return false;}
try{
bw=new BufferedWriter(new FileWriter("wser.txt"));
bw.write(user.getUsername()+"="+user.getPassword());
bw.newLine();
bw.Flush();
}catch(IOException e){
e.printStackTrace();
}finally{if(bw!=null))

try{
bw.close();
}
catch(IOException e){

}finally{
if(br!=null){
try{
br.close();
}catch(IOException e){
System.out.println(內存釋放失敗);
}
}
}
}
}
return flag;
}
相關文章
相關標籤/搜索