java中的Io(input與output)操作總結(jié)(三)
說(shuō)實(shí)話,其實(shí)我并不是很喜歡Java這門語(yǔ)言,盡管它很強(qiáng)大,有很多現(xiàn)成的API可以調(diào)用
但我總感覺(jué)它把簡(jiǎn)單的事情弄得太過(guò)復(fù)雜,甚至有時(shí)候會(huì)讓人迷失
弄不清到底是為了寫出東西,還是為了語(yǔ)言本身
我學(xué)習(xí)的第一門編程語(yǔ)言是Python,雖然學(xué)的不深
但是它的簡(jiǎn)單優(yōu)雅至今令人難忘(呃,其實(shí)也就兩年前的事……)
我接觸的第二門語(yǔ)言是C,它給我的感覺(jué)是一種純粹,一種高效的靈活
而不是類似java,寫一堆含糊的代碼來(lái)實(shí)現(xiàn)一個(gè)小小的功能
坦白講,如果一個(gè)人在學(xué)習(xí)自己不感興趣的東西,那會(huì)很累
支撐我的是,我對(duì)移動(dòng)開(kāi)發(fā)有著異常的向往,對(duì)Android也相當(dāng)喜歡,無(wú)奈開(kāi)發(fā)Android的主要語(yǔ)言便是Java
雖然已經(jīng)學(xué)了半年,但是我卻到現(xiàn)在都不能解釋神馬企業(yè)級(jí)開(kāi)發(fā)到底有哪些東西
我想要的,無(wú)非就是把編程當(dāng)作生活中的一種調(diào)情,如果想要某個(gè)功能,就去實(shí)現(xiàn),用盡可能簡(jiǎn)單的方式
甚至我的猜想是,等到日后發(fā)展,編程這門技術(shù)如同每個(gè)人使用office一般的時(shí)候
那么作為程序員的你們是該有多艱辛?
要知道,一個(gè)人將自己內(nèi)心的利益蓋過(guò)真正的想法,這是相當(dāng)可怕的……
因此,每個(gè)人都應(yīng)該用自己喜歡的,覺(jué)得高效的方式,做自己最想要做的
好了,說(shuō)了那么多,我的目的其實(shí)只有一個(gè)
難道我會(huì)告訴你,我根本就搞不懂,也不想搞懂java那些復(fù)雜的垃圾語(yǔ)法么?
我只用那些最簡(jiǎn)單最好用的東西……
java以前的那些io寫法我就懶得記錄了,主要是System類對(duì)IO的支持
如果你覺(jué)得我寫的代碼不夠深沉,那你就噴吧,可噴完之后你還能干些什么呢?
現(xiàn)在,步入正題……
這一節(jié)我們來(lái)講Scanner類和PrintWriter類的用法
Scanner類
實(shí)例1:從鍵盤讀取
import java.util.Scanner;
public class Demo {
public static void main(String[] args ) {
Scanner input = new Scanner(System.in);
System.out.println("請(qǐng)輸出一個(gè)整數(shù):");
int i = input.nextInt();
System.out.println("你輸入的整數(shù)是:" + i);
}
}
以上演示的只是讀取一個(gè)整數(shù),當(dāng)然還有讀取浮點(diǎn)數(shù)和其他數(shù)據(jù)類型的方法,比較簡(jiǎn)單,查看API即可
實(shí)例2:從字符串讀取
import java.util.Scanner;
public class Demo {
public static void main(String[] args ) {
//這里的\r\n是換行符,Linux下其實(shí)只用\n即可
Scanner input = new Scanner("hello\r\nworld\r\n");
//循環(huán)讀取,hasNext()方法和集合框架里面的一樣使
while(input.hasNext()) {
//每次讀取一行,別的讀取方法見(jiàn)API,比較簡(jiǎn)單
String s = input.nextLine();
System.out.println(s);
}
}
}
實(shí)例3:從文件讀取
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Demo {
public static void main(String[] args ) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
File f = new File(path);
Scanner input = null;
try {
//從文件構(gòu)造Scanner對(duì)象,有可能產(chǎn)生異常
input = new Scanner(f);
while(input.hasNext()) {
String s = input.nextLine();
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
input.close();
}
}
}
這里要注意的是,從文件創(chuàng)建Scanner對(duì)象得先要有File對(duì)象,當(dāng)然你可以使用匿名對(duì)象來(lái)創(chuàng)建
此外,還需捕捉異常和關(guān)閉文件流
PrintWriter類
實(shí)例4:向文件寫入內(nèi)容
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
//創(chuàng)建文件對(duì)象
File file = new File(path);
PrintWriter p = null;
try {
//此處構(gòu)造函數(shù)還可以傳其他對(duì)象,具體參考API文檔
p = new PrintWriter(file);
//向文件寫入一行,此外還有print()和printf()方法
p.println("如果有一天我回到從前");
p.println("回到最原始的我");
p.println("你是否會(huì)覺(jué)得我不錯(cuò)");
//刷新流
p.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
p.close();
}
}
}
與PrintWriter類似的還有一個(gè)PrintStream類,此處以PrintWriter舉例是因?yàn)槲谋疚募哂腥藶榭勺x性
而二進(jìn)制文件(字節(jié)模式)則需要使用專門的程序來(lái)讀取
可能有人會(huì)問(wèn):FileOutputStream、 FileWriter都能寫文件,那么為何還需要PrintWriter和PrintStream類
如果細(xì)看API文檔,可以知道前者單純的字符寫入流和字節(jié)寫入流操作的方式大多用數(shù)組進(jìn)行
對(duì)文件的細(xì)化處理非常不方便,而PrintWriter和PrintStream則很好的解決了這一問(wèn)題,提供print()等方法
并且,PrintWriter和PrintStream對(duì)于不存在文件對(duì)象的情況下會(huì)直接創(chuàng)建,如果已有文件對(duì)象
它們則會(huì)把原有文件給覆蓋掉,卻沒(méi)有增加方法
解決這問(wèn)題也很簡(jiǎn)單,再看API文檔
PrintWriter有一個(gè)構(gòu)造方法PrintWriter(Writer out),也就是能夠傳入Writer對(duì)象
PrintStream有一個(gè)構(gòu)造方法PrintStream(OutputStream out),也就是能傳入OutputStream對(duì)象
因此,我們這樣寫就可以了
new PrintWriter(new FileWriter(file,true))
new PrintStream(new FileOutputStream(file,true))
既能增加數(shù)據(jù),也能更高效的處理文件,見(jiàn)如下代碼示范
實(shí)例5:實(shí)現(xiàn)PrintWriter的數(shù)據(jù)追加功能
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
//創(chuàng)建文件對(duì)象
File file = new File(path);
PrintWriter p = null;
try {
//利用FileWriter方式構(gòu)建PrintWriter對(duì)象,實(shí)現(xiàn)追加
p = new PrintWriter(new FileWriter(file,true));
p.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
//我們來(lái)小心翼翼的關(guān)閉流,好吧^_^
p.close();
}
}
}
看,這樣就能實(shí)現(xiàn)追加效果了,最后一行便是
System類對(duì)IO的支持
實(shí)例6:System類中的寫入
import java.io.IOException;
import java.io.OutputStream;
public class Demo {
public static void main(String[] args) {
//別忘了,OutputStream是所有字節(jié)寫入流的父類
OutputStream out = System.out;
try {
//寫入數(shù)據(jù),只能是數(shù)組,所以用getBytes()方法
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意,此處正好印證了System.out的覆寫行為
如果想學(xué)好io,整個(gè)io體系中的多態(tài)需要了解清楚才能駕輕就熟
實(shí)例7:System類中的讀取
import java.io.IOException;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) {
//別忘了InputStream是所有字節(jié)輸入流的父類
InputStream in = System.in;
System.out.print("請(qǐng)輸入文字: ");
byte[] buf = new byte[1024];
int len = 0;
try {
//將輸入的數(shù)據(jù)保證到數(shù)組中,len記錄輸入的長(zhǎng)度
len = in.read(buf);
} catch (IOException e) {
e.printStackTrace();
}
//用字符串的方式打印數(shù)組中的數(shù)據(jù)
System.out.println("你的輸入是: " + new String(buf,0,len));
}
}
看,這樣就能從鍵盤獲取內(nèi)容并且打印了
需要注意的是,這里的數(shù)組大小是1024字節(jié)
一旦輸入的數(shù)據(jù)超過(guò)1024字節(jié),那么超過(guò)的內(nèi)容將被截取掉,所以此程序有局限性
并且,一個(gè)中文占兩個(gè)字節(jié),輸入中文有時(shí)候會(huì)被意外截取掉
相信我,每個(gè)程序都是俺親自編寫編譯的~?。?!
實(shí)例8:利用BufferedReader實(shí)現(xiàn)對(duì)鍵盤的讀取
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo {
public static void main(String[] args) {
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入文本:");
try {
String str = b.readLine();
System.out.println("你輸入的是:" + str);
} catch (IOException e) {
e.printStackTrace();
}
//循環(huán)讀取方式
/*
while(true) {
System.out.print("請(qǐng)輸入文本:");
String str = null;
try {
str = b.readLine();
} catch (IOException e) {
e.printStackTrace();
}
//如果輸入over就結(jié)束循環(huán)
if("over".equals(str)) {
break;
}
System.out.println("你輸入的是:" + str);
}
*/
try {
//關(guān)閉流,不耐煩的就直接拋
b.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
這樣做相對(duì)于上面一個(gè)方法的好處是:不用關(guān)心數(shù)組大小的問(wèn)題
BufferedReader有一個(gè)最重要的方法就是readLine(),每次讀取一行

相關(guān)文章
Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析
這篇文章主要介紹了Spring事務(wù)隔離級(jí)別簡(jiǎn)介及實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02SpringCloud Nacos配置中心管理超詳細(xì)講解
這篇文章主要介紹了Springcloud中的Nacos服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11MyBatis如何調(diào)用存儲(chǔ)過(guò)程
這篇文章主要介紹了MyBatis如何調(diào)用存儲(chǔ)過(guò)程問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05MyBatis攔截器動(dòng)態(tài)替換表名的方法詳解
因?yàn)槲覀兂志脤涌蚣芨嗟厥褂肕yBatis,那我們就借助于MyBatis的攔截器來(lái)完成我們的功能,這篇文章主要給大家介紹了關(guān)于MyBatis攔截器動(dòng)態(tài)替換表名的相關(guān)資料,需要的朋友可以參考下2022-04-04SpringBoot使用CommandLineRunner接口完成資源初始化方式
這篇文章主要介紹了SpringBoot使用CommandLineRunner接口完成資源初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02spring注解識(shí)別一個(gè)接口的多個(gè)實(shí)現(xiàn)類方法
下面小編就為大家?guī)?lái)一篇spring注解識(shí)別一個(gè)接口的多個(gè)實(shí)現(xiàn)類方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04

基于Properties類操作.properties配置文件方法總結(jié)