你好,java的API中提供了用于對(duì)象輸入輸出文件的操作,實(shí)例代碼如下:
成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于做網(wǎng)站、成都網(wǎng)站建設(shè)和IDC機(jī)房托管的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗(yàn)和案例。
定義單詞類(lèi)如下(注意:你定義的類(lèi)要實(shí)現(xiàn)Serializable接口)
public class Words implements Serializable {
private int size;
private String[] words;
public Words(){};
public Words(String...strs){
this.words = strs;
this.size = strs.length;
}
@Override
public String toString() {
return "Words{" +
"size=" + size +
", words=" + Arrays.toString(words) +
'}';
}
}
2. 對(duì)象輸入輸出api測(cè)試類(lèi)
public class ObjIOTest {
public static void main(String[] args) {
String path = "d:/myIOTest.txt";
ObjIOTest objIOTest = new ObjIOTest();
Words words = new Words("hello", "my", "dear", "friend");
try {
objIOTest.writeObject(path,words);
Words wordsFromFile = (Words)objIOTest.readObject(path);
System.out.println(wordsFromFile.toString());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//java serialize a object to file
public void writeObject(String path,Object map) throws IOException{
File f=new File(path);
FileOutputStream out=new FileOutputStream(f);
ObjectOutputStream objwrite=new ObjectOutputStream(out);
objwrite.writeObject(map);
objwrite.flush();
objwrite.close();
}
// read the object from the file
public Object readObject(String path) throws IOException, ClassNotFoundException{
FileInputStream in=new FileInputStream(path);
ObjectInputStream objread=new ObjectInputStream(in);
Object map=objread.readObject();
objread.close();
return map;
}
}
把兩段代碼拷貝到一個(gè)包下即可運(yùn)行了,希望您的問(wèn)題得到解答
Java 操作文件包括了兩個(gè)層面:
在文件系統(tǒng)的層面上來(lái)操作文件,包括創(chuàng)建文件、刪除文件、創(chuàng)建目錄、拷貝文件等等。
操作文件里保存的數(shù)據(jù),包括讀文件、寫(xiě)文件。
1. 在文件系統(tǒng)層面操作文件
1.1 File 類(lèi)介紹
Java 中通過(guò) java.io.File 類(lèi)來(lái)對(duì)一個(gè)文件(包括目錄)進(jìn)行抽象的描述。不過(guò)有 File 對(duì)象,并不代表對(duì)應(yīng)的文件真實(shí)存在。
1.2 File 常見(jiàn)屬性
屬性 修飾符及類(lèi)型 說(shuō)明
pathSeparator static String 依賴(lài)于系統(tǒng)的路徑分隔符,String 類(lèi)型的表示
pathSeparator static char 依賴(lài)于系統(tǒng)的路徑分隔符,char 類(lèi)型的表示
1.3 File 構(gòu)造方法
構(gòu)造方法 說(shuō)明
File(File parent, String child) 根據(jù)父目錄+孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例
File(String pathname) 根據(jù)文件路徑創(chuàng)建一個(gè)新的 File 實(shí)例,路徑可以是絕對(duì)路徑或者相對(duì)路徑
File(String parent, String child) 根據(jù)父目錄路徑+孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例
1.4 File 常用方法
方法 返回值類(lèi)型 說(shuō)明 注意
getParent() String 返回 File 對(duì)象的父目錄文件路徑
getName() String 返回 File 對(duì)象的純文件名稱(chēng)
getPath() String 返回 File 對(duì)象的文件路徑
getAbsolutePath() String 返回 File 對(duì)象的絕對(duì)路徑
getCanonicalPath() String 返回 File 對(duì)象的修飾過(guò)的絕對(duì)路徑 如果絕對(duì)路徑的值為:d:/././test.txt,那么修飾過(guò)的絕對(duì)路徑就為:d:/test.txt。
exists() boolean 判斷 File 對(duì)象描述的文件是否真實(shí)存在
isDirectory() boolean 判斷 File 對(duì)象代表的文件是否是一個(gè)目錄
isFile() boolean 判斷 File 對(duì)象代表的文件是否是一個(gè)普通文件
createNewFile() boolean 根據(jù) File 對(duì)象,自動(dòng)創(chuàng)建一個(gè)空文件。成功創(chuàng)建后返回 true 如果文件路徑不正確或者沒(méi)有權(quán)限,則可能創(chuàng)建失敗。
delete() boolean 根據(jù) File 對(duì)象,刪除該文件。成功刪除后返回 true 如果文件路徑不正確或者沒(méi)有權(quán)限,則可能刪除失敗。
deleteOnExit() void 根據(jù) File 對(duì)象,標(biāo)注文件將被刪除,刪除動(dòng)作會(huì)到 JVM 運(yùn)行結(jié)束時(shí)才會(huì)進(jìn)行
list() String[] 返回 File 對(duì)象代表的目錄下的所有文件名
listFiles() File[] 返回 File 對(duì)象代表的目錄下的所有文件,以 File 對(duì)象表示
mkdir() boolean 創(chuàng)建 File 對(duì)象代表的目錄
mkdirs() boolean 創(chuàng)建 File 對(duì)象代表的目錄,如果必要,會(huì)創(chuàng)建中間目錄
renameTo(File dext) boolean 重命名文件或移動(dòng)文件,當(dāng)目錄為空時(shí)也可以重命名目錄
canRead() boolean 判斷用戶(hù)是否對(duì)文件有可讀權(quán)限
canWrite() boolean 判斷用戶(hù)是否對(duì)文件有可寫(xiě)權(quán)限
2. 操作文件里的數(shù)據(jù)
文件內(nèi)容的操作包括讀文件和寫(xiě)文件,而對(duì)于這兩種操作 Java 又提供了兩種不同的類(lèi):
讀類(lèi) 寫(xiě)類(lèi) 說(shuō)明
InputStream OutputStream 字節(jié)流,針對(duì)二進(jìn)制文件進(jìn)行讀寫(xiě),操作基本單位是字節(jié)
Reader Writer 字符流,針對(duì)文本文件進(jìn)行讀寫(xiě),操作基本單位是字符
字節(jié)流: 它處理單元為1個(gè)字節(jié),操作字節(jié)和字節(jié)數(shù)組,存儲(chǔ)的是二進(jìn)制文件,如果是音頻文件、圖片、歌曲,就用字節(jié)流。
字符流: 它處理的單元為2個(gè)字節(jié)的 Unicode 字符,分別操作字符、字符數(shù)組或字符串,字符流是由 Java 虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個(gè)字節(jié)的 Unicode 字符為單位的字符而成的,如果是關(guān)系到中文(文本)的,用字符流更好。
所有文件都是以字節(jié)的形式儲(chǔ)存,在磁盤(pán)上保留的并不是文件的字符而是先把字符編碼成字節(jié),再儲(chǔ)存這些字節(jié)到磁盤(pán)。在讀取文件(特別是文本文件)時(shí),也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取以形成字節(jié)序列。
字節(jié)流可用于任何類(lèi)型的對(duì)象,包括二進(jìn)制對(duì)象,而字符流只能處理字符或者字符串。
字節(jié)流提供了處理任何類(lèi)型的 IO 操作的功能,但它不能直接處理 Unicode 字符,而字符流就可以。
字節(jié)流在操作的時(shí)候本身不會(huì)用到緩沖區(qū)的,是與文件本身直接操作的;而字符流在操作的時(shí)候會(huì)使用到緩沖區(qū)的。
其中 InputStream/OutputStream 和 Reader/Writer 都實(shí)現(xiàn)了 Closeable 接口,所以可以不主動(dòng)通過(guò) close 方法去關(guān)閉該資源,而是通過(guò)代碼可讀性更高的 try-with-resource 操作在 try 中的內(nèi)容結(jié)束后,無(wú)論是否有異常都關(guān)閉該資源。
使用 OutputStream 或 writer 打開(kāi)文件默認(rèn)會(huì)清空之前的文件內(nèi)容
2.1 操作字節(jié)流數(shù)據(jù)
2.1.1 InputStream
InputStream 是一個(gè)抽象類(lèi),使用時(shí)需要使用具體的實(shí)現(xiàn)類(lèi)。InputStream 的實(shí)現(xiàn)類(lèi)很多,針對(duì)不同的輸入設(shè)備都可以對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),其中針對(duì)文件讀取的實(shí)現(xiàn)類(lèi)是 FileInputStream。
FileInputStream 構(gòu)造方法:
構(gòu)造方法 說(shuō)明
FileInputStream(File file) 利用 File 構(gòu)造對(duì)應(yīng)文件輸入流
FileInputStream(String name) 利用文件路徑構(gòu)造對(duì)應(yīng)文件輸入流
InputStream 核心方法:
方法 返回值類(lèi)型 說(shuō)明
read() int 一次讀取一個(gè)字節(jié)的數(shù)據(jù),如果返回 -1 表示文件讀完了
read(byte[] b) int 一次最多讀取 b.length 字節(jié)的數(shù)據(jù)到 b 中,返回值為實(shí)際讀到的字節(jié)數(shù)量,如果返回 -1 表示文件讀完了
read(byte[] b, int off, int len) int 一次最多讀取 len 個(gè)字節(jié)到 b 中,并從 off 的位置開(kāi)始存放,返回值為實(shí)際讀到的字節(jié)數(shù)量,如果返回 -1 表示文件讀完了
close() void 關(guān)閉字節(jié)流
為什么 read 方法的返回值是 Int 類(lèi)型?
對(duì)于 read 方法的返回值,當(dāng)讀取的是數(shù)字和英文時(shí),返回值是對(duì)應(yīng)的 ascii 碼;當(dāng)讀取的是漢字時(shí),返回的是漢字的機(jī)內(nèi)碼,比如使用的是 GBK 編碼方式,返回的就是 GBK 的內(nèi)部編碼。read 方法每次從 inputstream 中讀取一個(gè)字節(jié),而一個(gè)字節(jié)是8位,但當(dāng)最高位是1的時(shí)候,二進(jìn)制對(duì)應(yīng)的 ascii 碼值就是復(fù)數(shù),而 ascii 是沒(méi)有負(fù)數(shù)的,所以用 byte 類(lèi)型表示不了。并且 11111111 對(duì)應(yīng)的十進(jìn)制值是 -1,而返回 -1 表示文件讀取完畢了,則后面的數(shù)據(jù)就不會(huì)讀了,因此 byte 類(lèi)型不適合,int 類(lèi)型則可以解決這個(gè)問(wèn)題。
示例代碼: 使用 read() 方法讀取文件內(nèi)容
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
StringBuilder sb = new StringBuilder();
try (InputStream inputStream = new FileInputStream(file)){
while(true) {
int b = inputStream.read();
if(b == -1){
break;
}
sb.append((char) b);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(sb.toString());
}
}
登錄后復(fù)制
?
示例代碼: 使用 read(byte[] b) 方法讀取文件內(nèi)容
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
byte[] buffer = new byte[1024];
try (InputStream inputStream = new FileInputStream(file)){
while(true) {
int len = inputStream.read(buffer);
if(len == -1){
break;
}
String s = new String(buffer, 0, len, "utf-8");
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
登錄后復(fù)制
?
2.1.2 OutputStream
OutputStream 是一個(gè)抽象類(lèi),使用時(shí)需要使用具體的實(shí)現(xiàn)類(lèi)。OutputStream 的實(shí)現(xiàn)類(lèi)很多,針對(duì)不同的輸出設(shè)備都可以對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),其中針對(duì)文件讀取的實(shí)現(xiàn)類(lèi)是 FileOutputStream。
FileOutputStream 構(gòu)造方法:
構(gòu)造方法 說(shuō)明
FileOutputStream(File file) 利用 File 構(gòu)造對(duì)應(yīng)文件輸出流
FileOutputStream(String name) 利用文件路徑構(gòu)造對(duì)應(yīng)文件輸出流
FileOutputStream(File file, boolean append) append 表示是否追加數(shù)據(jù)到文件的末尾,為 true 表示追加,為 false 表示情空之前的內(nèi)容重新加入
FileOutputStream(String name, boolean append) append 表示是否追加數(shù)據(jù)到文件的末尾,為 true 表示追加,為 false 表示情空之前的內(nèi)容重新加入
OutputStream 核心方法:
方法 返回值類(lèi)型 說(shuō)明
write() int 一次寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
write(byte[] b) int 一次最多寫(xiě)入 b.length 字節(jié)的數(shù)據(jù)到 b 中,返回值為實(shí)際寫(xiě)入的字節(jié)數(shù)量
write(byte[] b, int off, int len) int 一次最多寫(xiě)入 len 個(gè)字節(jié)到 b 中,并從 off 的位置開(kāi)始存放,返回值為實(shí)際寫(xiě)入到的字節(jié)數(shù)量
close() void 關(guān)閉字節(jié)流
示例代碼:
public class Demo1{
public static void main(String[] args) throws IOException {
File in = new File("./in.txt");
File out = new File("./out.txt");
byte[] buffer = new byte[1024];
try (InputStream inputStream = new FileInputStream(in);
OutputStream outputStream = new FileOutputStream(out)) {
while (true) {
int len = inputStream.read(buffer);
if (len == -1) {
break;
}
outputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
登錄后復(fù)制
?
2.1.3 BufferedInputStream
BufferedInputStream 也是 InputStream 的具體實(shí)現(xiàn)類(lèi),相比于 FileInputStream 優(yōu)化了系統(tǒng)調(diào)用,即通俗解釋為:將數(shù)據(jù)保存了緩存區(qū),但是減少磁盤(pán) IO 并不是 BufferedInputStream 來(lái)做的,而是 OS 來(lái)做的。OS 根據(jù)局部性原理,會(huì)預(yù)讀部分的數(shù)據(jù)到內(nèi)存緩存區(qū),這樣下次 IO 如果讀取數(shù)據(jù)在緩存命中了,就不需要等待磁盤(pán)的尋址,而是直接返回?cái)?shù)據(jù),效率就會(huì)快很多。
2.1.4 BufferedOutputStream
BufferedOutPutStream 也是 OutputStream 的具體實(shí)現(xiàn)類(lèi),相比于 FileOutputStream 優(yōu)化了系統(tǒng)調(diào)優(yōu),即每次寫(xiě)數(shù)據(jù)的時(shí)候,都會(huì)將數(shù)據(jù)放入緩存區(qū)中,等緩存區(qū)滿(mǎn)了之后,才會(huì)一次性寫(xiě)入到磁盤(pán)中,大大提高了效率。
2.2 操作字符流數(shù)據(jù)
2.2.1 Reader
Reader 是實(shí)現(xiàn)字符輸入流的一種類(lèi)型,其本身屬于一個(gè)抽象類(lèi),使用時(shí)需要使用具體的實(shí)現(xiàn)類(lèi)。Reader 的實(shí)現(xiàn)類(lèi)很多,針對(duì)不同的輸入設(shè)備都可以對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),其中針對(duì)文件讀取的實(shí)現(xiàn)類(lèi)是 FileReader。Reader 的使用方式和 InputStream 相仿。
示例代碼:
public class Demo2 {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("./test.txt");
StringBuilder sb = new StringBuilder();
try (Reader reader = new FileReader(file)) {
while (true) {
int read = reader.read();
if (read == -1) {
break;
}
sb.append((char) read);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(sb.toString());
}
}
登錄后復(fù)制
?
2.2.2 Writer
Writer 是實(shí)現(xiàn)字符輸出流的一種類(lèi)型,其本身屬于一個(gè)抽象類(lèi),使用時(shí)需要使用具體的實(shí)現(xiàn)類(lèi)。Writer 的實(shí)現(xiàn)類(lèi)很多,針對(duì)不同的輸出設(shè)備都可以對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),其中針對(duì)文件讀取的實(shí)現(xiàn)類(lèi)是 FileWriter。Writer 的使用方式和 OutputStream 相仿。
FileWriter 構(gòu)造方法:
構(gòu)造方法 說(shuō)明
FileWriter(File file) 利用 File 構(gòu)造對(duì)應(yīng)文件輸出流
FileWriter(String name) 利用文件路徑構(gòu)造對(duì)應(yīng)文件輸出流
FileWriter(File file, boolean append) append 表示是否追加數(shù)據(jù)到文件的末尾,為 true 表示追加,為 false 表示情空之前的內(nèi)容重新加入
FileWriter(String name, boolean append) append 表示是否追加數(shù)據(jù)到文件的末尾,為 true 表示追加,為 false 表示情空之前的內(nèi)容重新加入
示例代碼:
public class Demo2 {
public static void main(String[] args) throws FileNotFoundException {
File in = new File("./in.txt");
File out = new File("./out.txt");
try (Reader reader = new FileReader(in);
Writer writer = new FileWriter(out)) {
while (true) {
int read = reader.read();
if (read == -1) {
break;
}
writer.write(read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
登錄后復(fù)制
?
2.2.3 BufferedReader
BufferedReader 也是 Reader 的具體實(shí)現(xiàn)類(lèi),相比于 Reader 優(yōu)化了系統(tǒng)調(diào)用,即通俗解釋為:將數(shù)據(jù)保存了緩存區(qū),但是減少磁盤(pán) IO 并不是 BufferedReader 來(lái)做的,而是 OS 來(lái)做的。OS 根據(jù)局部性原理,會(huì)預(yù)讀部分的數(shù)據(jù)到內(nèi)存緩存區(qū),這樣下次 IO 如果讀取數(shù)據(jù)在緩存命中了,就不需要等待磁盤(pán)的尋址,而是直接返回?cái)?shù)據(jù),效率就會(huì)快很多。
2.2.4 BufferedWriter
BufferedWriter 也是 Writer 的具體實(shí)現(xiàn)類(lèi),相比于 Writer 優(yōu)化了系統(tǒng)調(diào)優(yōu),即每次寫(xiě)數(shù)據(jù)的時(shí)候,都會(huì)將數(shù)據(jù)放入緩存區(qū)中,等緩存區(qū)滿(mǎn)了之后,才會(huì)一次性寫(xiě)入到磁盤(pán)中,大大提高了效率。
2.3 Scanner 和 PrintWriter
Java 標(biāo)準(zhǔn)庫(kù)中提供的 Scanner 和 PrintWriter 類(lèi)能夠像文件中讀取文本數(shù)據(jù)和寫(xiě)入文本數(shù)據(jù)。
2.3.1 Scanner
java.util.Scanner 類(lèi)常用來(lái)從控制臺(tái)中讀取字符串和基本類(lèi)型的數(shù)值。Scanner 可以將輸入的值以空白字符分割標(biāo)記。
Scanner 的構(gòu)造方法:
構(gòu)造方法 說(shuō)明
Scanner(Readable source) 創(chuàng)建一個(gè) Scanner,從指定的可讀資源中掃描標(biāo)記,包括文件、文件路徑、字符串等。
Scanner(InputStream source) 創(chuàng)建一個(gè) Scanner,從指定的字節(jié)輸入流中掃把標(biāo)記。
Scanner 常用方法:
方法 返回值類(lèi)型 說(shuō)明
hasNext() boolean 如果 Scanner 還要更多的數(shù)據(jù)可讀取,則返回 true
next() String 從 Scanner 中讀取下一個(gè)標(biāo)記作為字符串返回
nextLine() String 從 Scanner 中讀取一行,以換行符結(jié)束
close() void 關(guān)閉 Scanner
System.in 為系統(tǒng)自帶的標(biāo)準(zhǔn)輸入流,該流是一直打開(kāi)并準(zhǔn)備提供輸入數(shù)據(jù)。通常,這個(gè)流對(duì)應(yīng)于鍵盤(pán)輸入或由主機(jī)環(huán)境或用戶(hù)指定的另一個(gè)輸入源。
使用 Scanner 沒(méi)有必要關(guān)閉輸入文件,但是關(guān)閉能夠釋放文件占有的資源。
示例代碼:
public class Demo3 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("./test.txt"))) {
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
登錄后復(fù)制
?
2.3.2 PrintWriter
java.io.PrintWriter 類(lèi)可用來(lái)創(chuàng)建一個(gè)文件并向文本文件中寫(xiě)入數(shù)據(jù)。通常使用 System.out.println 向控制臺(tái)輸入文本。
PrintWriter 構(gòu)造方法:
構(gòu)造方法 說(shuō)明
PrintWriter(Writer out) 為指定的字符輸入流創(chuàng)建一個(gè) PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 為指定的字符輸入流創(chuàng)建一個(gè) PrintWriter,如果 autoFlush 為 true,則 println、printf 或 format 方法將刷新輸出緩沖區(qū)。
PrintWriter(OutputStream out) 為指定的字節(jié)輸入流創(chuàng)建一個(gè) PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 為指定的字節(jié)輸入流創(chuàng)建一個(gè) PrintWriter,如果 autoFlush 為 true,則 println、printf 或 format 方法將刷新輸出緩沖區(qū)。
PrintWriter(String fileName) 為指定的文件路徑創(chuàng)建一個(gè) PrintWriter
PrintWriter(String fileName, String csn) 為指定的文件路徑創(chuàng)建一個(gè) PrintWriter,并且通過(guò)指定的字符集對(duì)字符進(jìn)行編碼。
PrintWriter(File file) 為指定的文件對(duì)象創(chuàng)建一個(gè) PrintWriter。
PrintWriter(File file, String scn) 為指定的文件對(duì)象創(chuàng)建一個(gè) PrintWriter,并且通過(guò)指定的字符集對(duì)字符進(jìn)行編碼。
PrintWriter 常用方法:
方法 返回值類(lèi)型 說(shuō)明
print(String s) void 將字符串寫(xiě)入文件中
println(String s) void 將字符串寫(xiě)入文件中,多打印一個(gè)換行
printf(String s) void 將字符串寫(xiě)入文件中,按照指定格式寫(xiě)文件中
System.out 為系統(tǒng)自帶的 printStream,表示控制臺(tái)的標(biāo)準(zhǔn) Java 對(duì)象,通過(guò)它能夠向控制臺(tái)輸入數(shù)據(jù)。
使用 PrintWriter 必須使用 close 方法關(guān)閉文件,或者使用 try-with-resources 自動(dòng)關(guān)閉資源,狗則數(shù)據(jù)就不能正確地保存在文件中。
示例代碼:
程序如下:\x0d\x0a \x0d\x0a\x0d\x0aFile file1 = new File("/home/a123/a"); \x0d\x0a\x0d\x0a if (file1.exists()) { \x0d\x0a System.out.println("存在文件夾a"); \x0d\x0a } else { \x0d\x0a file1.mkdir(); // 文件夾的創(chuàng)建 創(chuàng)建文件夾/home/a123/a \x0d\x0a } \x0d\x0a File file2 = new File("/home/a123/a/test"); \x0d\x0a if (file2.exists()) { \x0d\x0a System.out.println("存在文件夾或者文件test"); \x0d\x0a } else { \x0d\x0a try { \x0d\x0a file2.createNewFile(); // 文件的創(chuàng)建,注意與文件夾創(chuàng)建的區(qū)別 \x0d\x0a } catch (IOException e) { \x0d\x0a // TODO Auto-generated catch block \x0d\x0a e.printStackTrace(); \x0d\x0a } \x0d\x0a } \x0d\x0a \x0d\x0a /** \x0d\x0a * 最簡(jiǎn)單的文件讀寫(xiě)方法是使用類(lèi)FileWriter \x0d\x0a * (它的父類(lèi)依次是java.io.OutputStreamWriter——java.io.Writer——java.lang.Object ); \x0d\x0a */ \x0d\x0a \x0d\x0a // 下面是向文件file2里面寫(xiě)數(shù)據(jù) \x0d\x0a try { \x0d\x0a FileWriter fileWriter = new FileWriter(file2); \x0d\x0a String s = new String("This is a test! \n" + "aaaa"); \x0d\x0a fileWriter.write(s); \x0d\x0a fileWriter.close(); // 關(guān)閉數(shù)據(jù)流 \x0d\x0a\x0d\x0a} catch (IOException e) { \x0d\x0a // TODO Auto-generated catch block \x0d\x0a e.printStackTrace(); \x0d\x0a } \x0d\x0a \x0d\x0a /* \x0d\x0a * 這樣寫(xiě)數(shù)據(jù)的話(huà),是完全更新文件test里面的內(nèi)容,即把以前的東西全部刪除,重新輸入。 \x0d\x0a * 如果不想刪除以前的數(shù)據(jù),而是把新增加的內(nèi)容增添在文件末尾處。只需要在創(chuàng)建FileWriter對(duì)象時(shí)候,使用另外一個(gè)構(gòu)造函數(shù)即可: \x0d\x0a * FileWriter fileWriter=new FileWriter(file2,true); \x0d\x0a */ \x0d\x0a \x0d\x0a // 下面是從文件file2讀東西 \x0d\x0a try { \x0d\x0a FileReader fileReader = new FileReader(file2); \x0d\x0a String s = null; \x0d\x0a char ch; \x0d\x0a try { \x0d\x0a char[] c = new char[100]; \x0d\x0a fileReader.read(c,0,2); // 具體想得到文件里面的什么值(單個(gè)char?int?還是String?), \x0d\x0a System.out.println(c); \x0d\x0a fileReader.close(); \x0d\x0a \x0d\x0a } catch (IOException e) { \x0d\x0a // TODO Auto-generated catch block \x0d\x0a e.printStackTrace(); \x0d\x0a } \x0d\x0a \x0d\x0a } catch (FileNotFoundException e) { \x0d\x0a // TODO Auto-generated catch block \x0d\x0a e.printStackTrace(); \x0d\x0a } \x0d\x0a /** \x0d\x0a * 具體想得到文件里面的什么值(單個(gè)char?int?還是String?),需要知道不通read的不同用法: \x0d\x0a * 1. int read() 讀取單個(gè)字符。 \x0d\x0a * 2. int read(char[] cbuf) 將字符讀入數(shù)組。 可以再將字符型數(shù)組轉(zhuǎn)化位字符串 \x0d\x0a * 3. int read(char[] cbuf,int off,int len) 將字符讀入數(shù)組的某一部分。 \x0d\x0a * 這三個(gè)方法都返回一個(gè)int值,作用是:讀取的字符數(shù),如果已到達(dá)流的末尾,則返回 -1. \x0d\x0a */ \x0d\x0a \x0d\x0a }
step1:新建一個(gè)演示類(lèi)demo
step2:導(dǎo)入 包文件,在包名下,類(lèi)名之上輸入如下代碼。
import ?java.util.Scanner;
step3:在類(lèi)中的代碼如下:
public static void main(String[] args) { ? ?//創(chuàng)建一個(gè)鍵盤(pán)錄入對(duì)象input ? ?Scanner input = new Scanner(System.in); ? ?System.out.println("please input “學(xué)生姓名”"); ? ?String studentName = input.next().intern(); ? ?System.out.println("please input “科目名稱(chēng)”"); ? ?String subject = input.next().intern(); ? ?System.out.println("please input“科目成績(jī)”"); ? ?double result = input.nextDouble(); ? ?//調(diào)用Student類(lèi)的方法 ? ?Student stu = new Student(); ? ?stu.setStudentName(studentName); ? ?stu.setSubject(subject); ? ?stu.setResult(result); ? ?Student.getInformation(stu);}
step4:新建一個(gè)Student類(lèi),設(shè)置類(lèi)的各個(gè)成員變量,創(chuàng)建一個(gè)學(xué)生個(gè)人信息的方法。如下:
public class Student { ? ?private String studentName; ? ?private String subject; ? ?private double result; ? ?private String eveluate; ? ?//創(chuàng)建一個(gè)信息輸出方法 ? ?public static void getInformation(Student studentInformation) { ? ? ? ?System.out.println("學(xué)生個(gè)人信息"); ? ? ? ?//獲取學(xué)生姓名返回的成員變量值 ? ? ? ?System.out.println("姓名:" + studentInformation.getStudentName()); ? ? ? ?//獲取科目成員變量的返回值 ? ? ? ?System.out.println("科目:" + studentInformation.getSubject()); ? ? ? ?//獲取成績(jī)成員變量的返回值 ? ? ? ?System.out.println("成績(jī):" + studentInformation.getResult()); ? ? ? ?//獲取等級(jí)成員變量的返回值 ? ? ? ?System.out.println("等級(jí):" + studentInformation.getEveluate()); ? ?} ? ?//使用getXxx()和setXxx()對(duì)各個(gè)私有成員變量進(jìn)行限定 ? ?//對(duì)學(xué)生姓名進(jìn)行輸入和輸出的設(shè)置 ? ?public String getStudentName() { ? ? ? ?return this.studentName; ? ?} ? ?public void setStudentName(String studentName) { ? ? ? ?this.studentName = studentName; ? ?} ? ?//對(duì)成績(jī)等級(jí)變量設(shè)置 ? ?public String getEveluate() { ? ? ? ?return this.eveluate; ? ?} ? ?public void setEveluate(String eveluate) { ? ? ? ?this.eveluate = eveluate; ? ?} ? ? //對(duì)科目成員變量進(jìn)行設(shè)置 ? ?public String getSubject() { ? ? ? ?return this.subject; ? ?} ? ?public void setSubject(String subject) { ? ? ? ?this.subject = subject; ? ?} ? ?public double getResult() { ? ? ? ?return this.result; ? ?} ? ?//對(duì)成績(jī)進(jìn)行等級(jí)劃分 ? ?public void setResult(double result) { ? ? ? ?if (result = 95) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "A+"; ? ? ? ?} else if (result 90 result = 85) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "A"; ? ? ? ?} else if (result = 80 result 85) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "B+"; ? ? ? ?} else if (result = 75 result 80) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "B"; ? ? ? ?} else if (result = 70 result 75) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "C+"; ? ? ? ?} else if (result = 60 result 70) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "C"; ? ? ? ?} else if (result = 50 result 60) { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "D"; ? ? ? ?} else { ? ? ? ? ? ?this.result = result; ? ? ? ? ? ?this.eveluate = "E"; ? ? ? ?} ? ?}}
運(yùn)行結(jié)果1:
please input “學(xué)生姓名”
李小明
please input “科目名稱(chēng)”
數(shù)學(xué)
please input“科目成績(jī)”
98
學(xué)生個(gè)人信息
姓名:李小明
科目:數(shù)學(xué)
成績(jī):98.0
等級(jí):A+
運(yùn)行結(jié)果2:
please input “學(xué)生姓名”
王強(qiáng)
please input “科目名稱(chēng)”
英語(yǔ)
please input“科目成績(jī)”
52
學(xué)生個(gè)人信息
姓名:王強(qiáng)
科目:英語(yǔ)
成績(jī):52.0
等級(jí):D
向txt文件寫(xiě)入內(nèi)容基本思路就是獲得一個(gè)file對(duì)象,新建一個(gè)txt文件,打開(kāi)I/O操作流,使用寫(xiě)入方法進(jìn)行讀寫(xiě)內(nèi)容,示例如下:
package?common;
import?java.io.*;
import?java.util.ArrayList;
public?class?IOTest?{
public?static?void?main?(String?args[])?{
ReadDate();
WriteDate();
}
/**
*?讀取數(shù)據(jù)
*/
public?static?void?ReadDate()?{
String?url?=?“e:/2.txt”;
try?{
FileReader?read?=?new?FileReader(new?File(url));
StringBuffer?sb?=?new?StringBuffer();
char?ch[]?=?new?char[1024];
int?d?=?read.read(ch);
while(d!=-1){
String?str?=?new?String(ch,0,d);
sb.append(str);
d?=?read.read(ch);
}
System.out.print(sb.toString());
}?catch?(FileNotFoundException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
/**
*?寫(xiě)入數(shù)據(jù)
*/
public?static?void?WriteDate()?{
try{
File?file?=?new?File(“D:/abc.txt”);
if?(file.exists())?{
file.delete();
}
file.createNewFile();
BufferedWriter?output?=?new?BufferedWriter(new?FileWriter(file));
ArrayList?ResolveList?=?new?ArrayList();
for?(int?i?=?0;?i??10;?i++)?{
ResolveList.add(Math.random()*?100);
}
for?(int?i=0?;i?
output.write(String.valueOf(ResolveList.get(i))?+?“\n”);
}
output.close();
}?catch?(Exception?ex)?{
System.out.println(ex);
}
}
}
原文出自【比特網(wǎng)】,轉(zhuǎn)載請(qǐng)保留原文鏈接:
//代碼很簡(jiǎn)單我就不加注釋了。因?yàn)殒I盤(pán)輸入的話(huà)是采集不到空格,沒(méi)有加入Scanner\x0d\x0apublic class Test2 {\x0d\x0apublic static void main(String[] args) {\x0d\x0a\x0d\x0aint a = 0, b = 0, c = 0,d=0;\x0d\x0aint tem;\x0d\x0aString str = "abcdABCD 123-0-=";\x0d\x0achar[] ch = str.toCharArray();\x0d\x0afor (int i = 0; i tem=ch[i];\x0d\x0aif (tem == 32) {\x0d\x0aa++;\x0d\x0a} else if(tem=65tem=97temb++;\x0d\x0a} else if(tem=48temc++;\x0d\x0a}else{d++;}\x0d\x0a}System.out.println("空格數(shù):"+a);\x0d\x0aSystem.out.println("字母數(shù):"+b);\x0d\x0aSystem.out.println("數(shù)字?jǐn)?shù):"+c);\x0d\x0aSystem.out.println("其他字符"+d);\x0d\x0a}\x0d\x0a}