一、轉換流
因爲字節流操做中文不是很是方便,所以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("每天開心火狐",2,3);
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;
}