前言:java的讀寫操作是學(xué)java開發(fā)的必經(jīng)之路,Java.io包中包括許多類提供許多有關(guān)文件的各個方面操作尝丐。下面就來總結(jié)下java的讀寫操作慢睡。
主要內(nèi)容如下
- 1.字節(jié)流與字符流的區(qū)別
- 2.文件操作
- 3文件操作的具體實現(xiàn)
- 4.實戰(zhàn):解鎖功能
一. 字節(jié)流與字符流的區(qū)別:
字節(jié)流與字符流主要的區(qū)別是他們的的處理方式
字節(jié)流是最基本的疲恢,采用ASCII編碼,所有的InputStream和OutputStream的子類都是,主要用在處理二進制數(shù)據(jù),它是按字節(jié)來處理的
但實際中很多的數(shù)據(jù)是文本睹晒,又提出了字符流的概念趟庄,采用Unicode編碼.它是按虛擬機的encode來處理,也就是要進行字符集的轉(zhuǎn)化
這兩個之間通過 InputStreamReader,OutputStreamWriter來關(guān)聯(lián)伪很,實際上是通過byte[]和String來關(guān)聯(lián)
字節(jié)流 InputStream 輸入 OutputStream 輸出
字符流 Reader 輸入 Writer 輸出
其它的類都是繼承這四個基本類的戚啥!
二:文件操作的一些總結(jié):
1 輸入輸出抽象基類InputStream/OutputStream ,實現(xiàn)文件內(nèi)容操作的基本功能函數(shù)read()锉试、 write()猫十、close()、skip()等;一般都是創(chuàng)建出其派生類對象(完成指定的特殊功能)來實現(xiàn)文件讀寫拖云。在文件讀寫的編程過程中主要應(yīng)該注意異常處理的技術(shù)贷笛。
2 FileInputStream/FileOutputStream:
用于本地文件讀寫(二進制格式讀寫并且是順序讀寫,讀和寫要分別創(chuàng)建出不同的文件流對象)宙项;
本地文件讀寫編程的基本過程為:
① 生成文件流對象(對文件讀操作時應(yīng)該為FileInputStream類乏苦,而文件寫應(yīng)該為FileOutputStream類);
② 調(diào)用FileInputStream或FileOutputStream類中的功能函數(shù)如read()尤筐、write(int b)等)讀寫文件內(nèi)容汇荐;
③ 關(guān)閉文件(close())。
3隨機文件讀寫:
RandomAccessFile類(它直接繼承于Object類而非InputStream/OutputStream類)叔磷,從而可以實現(xiàn)讀寫文件中任何位置中的數(shù)據(jù)(只需要改變文件的讀寫位置的指針)拢驾。
隨機文件讀寫編程的基本過程為:
① 生成流對象并且指明讀寫類型;
② 移動讀寫位置改基;
③ 讀寫文件內(nèi)容繁疤;
④ 關(guān)閉文件。
三:方法的實現(xiàn):創(chuàng)建文件秕狰、讀取文件稠腊、關(guān)閉文件等
- 創(chuàng)建文件:
使用構(gòu)造方法,如下:
String path = "C:\Users\Administrator\Desktop\java";
File file = new File(path.concat.("/text.txt"));
if(file.exists() == false)
{//不存在就創(chuàng)建
file.createNewFile();
}
2.文件寫入字節(jié)流
FileOutputString fos = new FileOutString(file);
byte [] text = {'1','2','3','4'};
fos.write(text);
//操作完就要關(guān)閉文件
fos.close();
3.讀取字節(jié)流
FileInputString fis = new FileInString(file);
byte [] name =new byte[12];
int count = fis.read(name) ;
//操作完就要關(guān)閉文件
fis.close();
4,文件中寫入字符流
FileWriter fw = new FileWriter(file);
char [] name = {'java' ,'開'',發(fā)'};
fw.write(name);
fw.close();
5.讀取字符流
FileReader fr= new FileReader(file);
char [] book = new char[4];
fr.close();
6.將文件作為輸入對象:
import java.io.File;
import java.util.Scanner;
public class MyClass {
public static void main(String[] args) throws Exception {
File p = new File("C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\xt.txt");
Scanner console = new Scanner(p);
while (console.hasNext()){
String input = console.next();
System.out.println(input);
}
console.close();
}
運行結(jié)果:
xt.txt中的內(nèi)容:
四:練習(xí) 實現(xiàn)密碼解鎖功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOperation {
public static final String PATH= "C:\\Users\\Administrator\\Desktop\\java\\java\\java1\\src\\main\\java\\day8\\Demo1/pwd.txt";
String password;
//單例模式
public static final FileOperation instance = new FileOperation();
private FileOperation(){
try {
load();
}catch (IOException e){
System.out.println("io 異常");
}
}
public void load() throws IOException {
FileInputStream fis = new FileInputStream(PATH);
byte[] pwd = new byte[4];
int count = fis.read(pwd);
if (count == -1){
password = null;
}else{
password = new String(pwd);
}
fis.close();
}
public void save(String password){
try {
FileOutputStream fos = new FileOutputStream(PATH);
fos.write(password.getBytes());
fos.close();
} catch (IOException e){
System.out.println("io異常");
}
}
}
import java.util.Scanner;
public class MyClass {
public static void main(String[] args){
boolean logined =false;
//判斷是否已經(jīng)登錄
String password = FileOperation.instance.password;
if (password != null){
logined = true;
}
//提示用戶操作
String alert;
if (logined) {
alert = "請輸入密碼";
} else {
alert = "請設(shè)置密碼";
}
System.out.println(alert);
String firt = null;
int wrongTime = 3;
while (wrongTime > 0) {
//接收用戶輸入
Scanner scanner = new Scanner(System.in);
String inputPassword = scanner.next();
//判斷操作
if (logined) {
//已經(jīng)登陸過 直接比較
if (password.equals(inputPassword)) {
System.out.println("解鎖成功");
break;
} else {
System.out.println("解鎖失敗 請重新輸入");
wrongTime--;
}
}else{
//沒有登陸過 在設(shè)置密碼
//判斷是設(shè)置密碼的第一次還是第二次
if (firt == null){
//第一次 保存第一次輸入的密碼
firt = inputPassword;
System.out.println("請確認(rèn)密碼 ");
}else{
//第二次 比較兩次輸入的密碼是否相同
if (firt.equals(inputPassword)){
System.out.println("設(shè)置密碼成功");
//保存設(shè)置的密碼
FileOperation.instance.save(firt);
break;
}else{
System.out.println("兩次密碼不一致 請重新設(shè)置密碼:");
firt = null;
wrongTime--;
}
}
}
scanner.nextLine();
}
}
}
創(chuàng)建刪除文件
tring content = "Hello World";
// 第一種方法:根據(jù)文件路徑和文件名
String path = "F:\\test";
String filename = "test.txt";
File myFile = new File(path,filename);
// 第二種方法
String file = "F:\\test\\test.txt";
File myFile = new File(file);
if (!myFile.exists()) {
// 創(chuàng)建文件(前提是目錄已存在鸣哀,若不在架忌,需新建目錄即文件夾)
myFile.createNewFile();
// 刪除文件
myFile.delete();
}
寫入文件
// 第一種:字節(jié)流FileOutputStream
FileOutputStream fop = new FileOutputStream(myFile);
byte[] contentInBytes = content.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
// 第二種:FileWriter(參數(shù)true為追加內(nèi)容,若無則是覆蓋內(nèi)容)
FileWriter fw = new FileWriter(myFile,true);
fw.write(content);
fw.close();
// 第三種:BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter(myFile,true));
bw.write(content);
bw.flush();
bw.close();
// 第四種:打印流PrintStream和PrintWriter
// 字節(jié)打印流:PrintStream
// 字符打印流:PrintWriter
PrintWriter pw = new PrintWriter(new FileWriter(myFile,true));
pw.println(content); // 換行
pw.print(content); // 不換行
pw.close();
// 常用BufferedWriter和PrintWriter
讀取文件
FileInputStream
// 第一種:以字節(jié)為單位讀取文件我衬,常用于讀二進制文件叹放,如圖片、聲音挠羔、影像等文件井仰。
InputStream in = new FileInputStream(myFile);
// 一次讀一個字節(jié)
int tempbyte;
while ((tempbyte = in.read()) != -1) {
System.out.write(tempbyte);
}
in.close();
// 一次讀多個字節(jié)
int byteread = 0;
byte[] tempbytes = new byte[100];
ReadFromFile.showAvailableBytes(in);
while ((byteread = in.read(tempbytes)) != -1) {
S ystem.out.write(tempbytes, 0, byteread);
}
// System.out.write()方法是字符流,System.out.println()方法是字節(jié)流
InputStreamReader
// 第二種:以字符為單位讀取文件,常用于讀文本破加,數(shù)字等類型的文件
Reader reader = new InputStreamReader(new FileInputStream(myFile));
// 一次讀一個字節(jié)
int tempchar;
while ((tempchar = reader.read()) != -1) {
// 對于windows下俱恶,\r\n這兩個字符在一起時,表示一個換行范舀。
// 但如果這兩個字符分開顯示時合是,會換兩次行。
// 因此锭环,屏蔽掉\r聪全,或者屏蔽\n。否則辅辩,將會多出很多空行荔烧。
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
}
}
reader.close();
// 一次讀多個字節(jié)
char[] tempchars = new char[30];
int charread = 0;
// 讀入多個字符到字符數(shù)組中吱七,charread為一次讀取字符數(shù)
while ((charread = reader.read(tempchars)) != -1) {
// 同樣屏蔽掉\r不顯示
if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != '\r')) {
System.out.print(tempchars);
} else {
for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r') {
continue;
} else {
System.out.print(tempchars[i]);
}
}
}
}
BufferedReader
// 第三種:以行為單位讀取文件,常用于讀面向行的格式化文件
BufferedReader reader = new BufferedReader(new FileReader (myFile));
String tempString = null;
int line = 1;
// 一次讀入一行鹤竭,直到讀入null為文件結(jié)束
while ((tempString = reader.readLine()) != null) {
// 顯示行號
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
// 常用BufferedReader
文件函數(shù)
//判斷文件是否存在
myFile.exists()
//讀取文件名稱
myFile.getName()
//讀取文件路徑(相對路徑)
myFile.getPath()
//讀取文件絕對路徑
myFile.getAbsolutePath()
//讀取文件的父級路徑
new File(myFile.getAbsolutePath()).getParent()
//讀取文件的大小
myFile.length()
//判斷文件是否被隱藏
myFile.isHidden()
//判斷文件是否可讀
myFile.canRead()
//判斷文件是否可寫
myFile.canWrite()
//判斷文件是否為文件夾
myFile.isDirectory()
這個練習(xí)相比而言比較簡單,答案我就不公布景醇,希望大家不忘初心臀稚,每天跟著腳步走,有時候三痰,在電腦前坐久了吧寺,腰酸背痛,在學(xué)習(xí)的同時不要忘記運動呀各位散劫,身體是革命的本錢呀~~~~~