最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java I/O中I/O流的典型使用方式詳解

 更新時(shí)間:2019年06月18日 09:47:08   作者:木瓜芒果  
這篇文章主要介紹了Java I/O中I/O流的典型使用方式詳解,盡管可以通過(guò)不同的方式組合IO流類(lèi),但我們可能也就只用到其中的幾種組合。下面的例子可以作為典型的IO用法的基本參考,,需要的朋友可以參考下

前言

盡管可以通過(guò)不同的方式組合IO流類(lèi),但我們可能也就只用到其中的幾種組合。下面的例子可以作為典型的IO用法的基本參考。在這些示例中,異常處理都被簡(jiǎn)化為將異常傳遞給控制臺(tái),但是這只有在小型示例和工具中才適用。在代碼中,你需要考慮更加復(fù)雜的錯(cuò)誤處理方式。

同樣,本文會(huì)包括如下幾個(gè)方面:

  • 緩沖輸入文件
  • 從內(nèi)存輸入
  • 格式化的內(nèi)存輸入
  • 基本的文件輸出
  • 存儲(chǔ)和恢復(fù)數(shù)據(jù)
  • 讀寫(xiě)隨機(jī)訪(fǎng)問(wèn)文件
  • 實(shí)用工具
  • 總結(jié)

1. 緩沖輸入文件

如果想要打開(kāi)一個(gè)文件用于字符輸入,可以使用以String或File對(duì)象作為文件名的FileReader。為了提高速度,我們可以對(duì)那個(gè)文件進(jìn)行緩沖,那么我們需要將所產(chǎn)生的引用傳給一個(gè)BufferedReader構(gòu)造器。通過(guò)使用其readLine()方法來(lái)逐行讀取文件,當(dāng)readLine()返回null時(shí),就到了文件末尾。

public class BufferedInputFile {
public static String read(String fileName) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(fileName));
StringBuilder str = new StringBuilder();
String temp = null;
while((temp = br.readLine()) != null) {
str.append(temp + "\n");
}
br.close();
return str.toString();
}
public static void main(String[] args) {
try {
System.out.println(BufferedInputFile.read("pom.xml"));
}catch(Exception e) {
e.printStackTrace();
}
}
}

文件的全部?jī)?nèi)容都累積在字符串str中,最后記得調(diào)用close()來(lái)關(guān)閉流。

2. 從內(nèi)存輸入

在下面的示例中,從上面的BufferedInputFile.read()讀入的String結(jié)果被用來(lái)創(chuàng)建一個(gè)StringReader。然后調(diào)用read()每次讀取一個(gè)字符,并把它打印到控制臺(tái)。

public class MemoryInput {
public static void main(String[] args) {
try {
StringReader sr = new StringReader(BufferedInputFile.read("pom.xml"));
int c;
while((c = sr.read()) != -1) {
System.out.print((char)c);
}
}catch(Exception e) {
}
}
}

需要注意的是read()是以int形式返回下一個(gè)字節(jié),因此必須將類(lèi)型強(qiáng)轉(zhuǎn)為char才能顯示正確結(jié)果。

3. 格式化的內(nèi)存輸入

要讀取格式化數(shù)據(jù),可以使用DataInputStream,它是一個(gè)面向字節(jié)的I/O類(lèi),我們可以用InputStream以字節(jié)的形式讀取任何數(shù)據(jù)。

public class FormattedMemoryInput {
public static void main(String[] args) {
try {
DataInputStream di = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("pom.xml").getBytes()));
while(di.available() != 0) {
System.out.print((char)di.readByte());
}
}catch (Exception e) {
e.printStackTrace();
}
}
}

這里需要注意必須為ByteArrayInputStream的構(gòu)造函數(shù)提供字節(jié)數(shù)組,而B(niǎo)yteArrayInputStream傳遞給DataInputStream之后進(jìn)行了一次“裝飾”,可以進(jìn)行格式化輸入(比如直接讀取int、double等類(lèi)型),這里我們只是通過(guò)readByte讀取單個(gè)字節(jié),調(diào)用該方法時(shí)任何字節(jié)的值都是合法的結(jié)果,因此返回值是不能用來(lái)檢測(cè)輸入是否結(jié)束,這里我們使用available()方法查看還有多少可供存取的字符來(lái)判斷是否結(jié)束。

4. 基本的文件輸出

FileWriter對(duì)象可以向文件寫(xiě)入數(shù)據(jù),通常會(huì)用BufferedWriter將其包裝起來(lái)用以緩沖輸出以提高性能。在本例中為了提供格式化機(jī)制,將其裝飾成PrintWriter:

public class BasicFileOutput {
static String file = "BasicFileOutput.out";
public static void main(String[] args) {
try {
BufferedReader in = new BufferedReader(new StringReader(BufferedInputFile.read("pom.xml")));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
String temp;
int count = 0;
while((temp = in.readLine()) != null) {
out.println(count++ + temp);
}
in.close();
out.close();
System.out.println(BufferedInputFile.read(file));
}catch(Exception e) {
e.printStackTrace();
} 
}
}

這里在讀取BasicFileOutput.out的內(nèi)容之前,先調(diào)用了out的close()將其關(guān)閉,一方面是因?yàn)榱饔猛曛笮枰皶r(shí)關(guān)閉以節(jié)省資源,另一方面這里用到了緩沖區(qū),如果不為所有的輸出文件調(diào)用close(),緩沖區(qū)的內(nèi)容可能不會(huì)刷新清空,這樣可能導(dǎo)致信息不完整。

另外Java SE5在PrintWriter中添加了一個(gè)輔助構(gòu)造器,可以很方便根據(jù)文件名直接構(gòu)造一個(gè)PrintWriter而不用執(zhí)行一系列的裝飾工作:

PrintWriter out = new PrintWriter(file);

5. 存儲(chǔ)和恢復(fù)數(shù)據(jù)

PrintWriter可以對(duì)數(shù)據(jù)進(jìn)行格式化,以便閱讀。但是為了輸出可供另一個(gè)“流”恢復(fù)的數(shù)據(jù),我們需要用DataOutputStream寫(xiě)入數(shù)據(jù),并用DataInputStream恢復(fù)數(shù)據(jù)。當(dāng)然,這些流可以是任何形式,在下面的例子中使用的是一個(gè)文件。

public class StoringAndRecoveringData {
public static void main(String[] args) {
try {
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));
out.writeDouble(3.14159);
out.writeUTF("That was pi");
out.writeDouble(1.41413);
out.writeUTF("Square root of 2");
out.close();
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("data.txt")));
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
in.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}

使用DataOutputStream寫(xiě)入數(shù)據(jù),Java可以保證我們可以使用DataInputStream準(zhǔn)確地讀取數(shù)據(jù)--無(wú)論讀和寫(xiě)數(shù)據(jù)的平臺(tái)多么不同。當(dāng)我們使用DataOutputStream時(shí),寫(xiě)字符串并且讓DataInputStream能夠恢復(fù)它的唯一可靠的做法就是使用UTF-8編碼,在這個(gè)例子中是靠writeUTF()和readUTF()來(lái)實(shí)現(xiàn)的。

writeDouble()和readDouble()方法能夠?qū)懭牒突謴?fù)double類(lèi)型的數(shù)據(jù)。對(duì)于其他類(lèi)型的數(shù)據(jù),也有類(lèi)似的方法用于讀寫(xiě)。但是為了保證所有的讀寫(xiě)方法都能夠正常工作,我們必須知道流中數(shù)據(jù)項(xiàng)所在的確切位置,因?yàn)闃O有可能將保存的double數(shù)據(jù)作為一個(gè)簡(jiǎn)單的字節(jié)序列、char或其他類(lèi)型讀入。

6. 讀寫(xiě)隨機(jī)訪(fǎng)問(wèn)文件

使用RandomAccessFile,類(lèi)似于組合使用了DataInputStream和DataOutputStream,可以同時(shí)對(duì)一個(gè)文件執(zhí)行讀寫(xiě)操作,同時(shí)可以利用seek()在文件中到處移動(dòng),非常方便,關(guān)于RandomAccessFile的詳細(xì)用法,前面有專(zhuān)門(mén)寫(xiě)過(guò)<<Java I/O系統(tǒng):File和RandomAccessFile>>。

但是在使用RandomAccessFile時(shí),你需要知道文件的排版,這樣才能正確地操作它,RandomAccessFile擁有讀取基本類(lèi)型和UTF-8字符串的各種具體方法。

public class UsingRandomAccessFile{
static String file = "rtest.dat";
static void display() throws IOException{
RandomAccessFile rf = new RandomAccessFile(file,"r");
for(int i = 0; i < 7; i++){
System.out.println("Value " + i + ": " + rf.readDouble());
}
System.out.println(rf.readUTF());
rf.close();
}
public static void main(String[] args) throws IOException{
RandomAccessFile rf = new RandomAccessFile(file,"rw");
for(int i = 0; i < 7; i++){
rf.writeDouble(i*1.414);
}
rf.writeUTF("The end of the file");
rf.close();
display();
rf = new RandomAccessFile(file,"rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();
display();
}
}

我們通過(guò)writeDouble()方法往文件中寫(xiě)入Double類(lèi)型數(shù)據(jù)并通過(guò)readDouble()方法來(lái)讀取,這就是我們需要直到排版的原因,如果讀取的不是Double類(lèi)型的數(shù)據(jù)有可能出現(xiàn)不是我們想要的結(jié)果。

7. 實(shí)用工具

到這里我們學(xué)習(xí)了多種I/O流的典型用法,比如緩沖輸入文件、從內(nèi)存輸入、基本的文件輸出、存儲(chǔ)和恢復(fù)數(shù)據(jù)、隨機(jī)讀寫(xiě)文件,這些都是Java I/O流比較典型的用法。這里我們發(fā)現(xiàn)讀取文件、修改、在寫(xiě)出是一個(gè)很常見(jiàn)的程序化的任務(wù),但是Java I/O類(lèi)庫(kù)的設(shè)計(jì)有一個(gè)問(wèn)題,就是我們需要編寫(xiě)很多代碼來(lái)實(shí)現(xiàn)這些操作,要記住如何打開(kāi)文件是一件優(yōu)點(diǎn)困難的事情。因此,下面是收集的一些幫助類(lèi),可以很容易為我們完成這些基本任務(wù),記錄在這里,方便以后查看。

這里收集了兩個(gè)工具:

  • 一個(gè)是TextFile,幫助我們讀取和寫(xiě)入文件;
  • 另一個(gè)是BinaryFile,幫助我們簡(jiǎn)化二進(jìn)制文件的讀取。

7.1 讀取文件

TextFile類(lèi)包含的static方法可以像簡(jiǎn)單字符串那樣讀寫(xiě)文本文件,并且我們可以創(chuàng)建一個(gè)TextFile對(duì)象,它用一個(gè)ArrayList來(lái)保存文件的若干行,好處是在我們操縱文件內(nèi)容時(shí)可以使用ArrayList的所有功能。

public class TextFile extends ArrayList<String>{
// 將文件讀取到一行字符串中
public static String read(String fileName){
StringBuilder sb = new StringBuilder();
try{
BufferedReader in = new BufferedReader(new FileReader(new File(fileName).getAbsoluteFile()));
try{
String s;;
while((s = in.readLine()) != null){
sb.append(s).append("\n");
}
}finally{
in.close();
}
}catch (IOException e){
throw new RuntimeException(e);
}
return sb.toString();
}
// 單次調(diào)用將一個(gè)字符串寫(xiě)入一個(gè)文件
public static void write(String fileName,String text){
try{
PrintWriter out = new PrintWriter(new File(fileName).getAbsoluteFile());
try{
out.print(text);
}finally{
out.close();
}
}catch(IOException e){
throw new RuntimeException(e);
}
}
// 讀取文件,并通過(guò)正則表達(dá)式將其分離,保存在List中
public TextFile(String fileName,String splitter){
super(Arrays.asList(read(fileName).split(splitter)));
// 因?yàn)閟plit()方法有時(shí)會(huì)在返回的數(shù)組第一個(gè)位置產(chǎn)生一個(gè)空字符串
if(get(0).equals(""))
remove(0);
}
// 常規(guī)的分行讀取
public TextFile(String fileName){
this(fileName,"\n");
}
// 將該TextFile中的內(nèi)容分行寫(xiě)入指定文件中
public void write(String fileName){
try{
PrintWriter out = new PrintWriter(new File(fileName).getAbsoluteFile());
try{
for(String item : this){
out.println(item);
}
}finally{
out.close();
}
}catch(IOException e){
throw new RuntimeException(e);
}
}
// 簡(jiǎn)單驗(yàn)證一下
public static void main(String[] args){
String file = read("TextFile.java");
write("test.txt",file);
TextFile text = new TextFile("test.txt");
text.write("test2.txt");
TreeSet<String> words = new TreeSet<String>(new TextFile("TextFile.java","\\W+"));
System.out.println(words.headSet("a"));
}
}

這里利用靜態(tài)的read()方法將文件讀取到一個(gè)字符串中,再用靜態(tài)的write()方法將其寫(xiě)入到文件中。然后將新寫(xiě)入的文件作為構(gòu)造參數(shù)構(gòu)造一個(gè)TestFile對(duì)象,利用其List的特性,將其內(nèi)容寫(xiě)入文件test2中。這個(gè)類(lèi)的作用是幫我們讀取文件,可以通過(guò)靜態(tài)的read方法讀取到一個(gè)字符串中,也可以通過(guò)構(gòu)造器讀取文件到一個(gè)TextFile對(duì)象中。

7.2 讀取二進(jìn)制文件

public class BinaryFile{
public static byte[] read(File bFile)throws IOException{
BufferedInputStream bf = new BufferedInputStream(new FileInputStream());
try{
byte[] data = new byte[bf.available()];
br.read(data);
return data;
}finally{
bf.close();
}
}
public static byte[] read(String bFile)throws IOException{
return read(new File(bFile).getAbsoluteFile());
}
}

8. 總結(jié)

本文沒(méi)有總結(jié)什么新的知識(shí)點(diǎn),只是總結(jié)了一些Java I/O的常見(jiàn)用法比如緩沖輸入文件、從內(nèi)存輸入、基本的文件輸出、存儲(chǔ)和恢復(fù)數(shù)據(jù)、隨機(jī)讀寫(xiě)文件等,并且搜集了兩個(gè)工具類(lèi)用來(lái)幫助我們讀寫(xiě)文件讀取二進(jìn)制文件,以提高些代碼的效率。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring MVC整合Kaptcha的具體使用

    Spring MVC整合Kaptcha的具體使用

    Kaptcha 是一個(gè)可高度配置的實(shí)用驗(yàn)證碼生成工具,本文主要介紹了Spring MVC整合Kaptcha的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)

    詳解Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)

    這篇文章主要介紹了Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java實(shí)現(xiàn)Random隨機(jī)數(shù)生成雙色球號(hào)碼

    Java實(shí)現(xiàn)Random隨機(jī)數(shù)生成雙色球號(hào)碼

    使用Random類(lèi)是Java中用于生成隨機(jī)數(shù)的標(biāo)準(zhǔn)類(lèi),本文主要介紹了Java實(shí)現(xiàn)Random隨機(jī)數(shù)生成雙色球號(hào)碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 深入理解Java中的克隆

    深入理解Java中的克隆

    想必大家對(duì)克隆都有耳聞,世界上第一只克隆羊多莉就是利用細(xì)胞核移植技術(shù)將哺乳動(dòng)物的成年體細(xì)胞培育出新個(gè)體,甚為神奇。其實(shí)在Java中也存在克隆的概念,即實(shí)現(xiàn)對(duì)象的復(fù)制。本文將嘗試介紹一些關(guān)于Java中的克隆和一些深入的問(wèn)題,希望可以幫助大家更好地了解克隆。
    2016-08-08
  • MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟

    MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus枚舉和自定義主鍵ID的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • JDK1.8新特性Stream流式操作的具體使用

    JDK1.8新特性Stream流式操作的具體使用

    這篇文章主要介紹了JDK1.8新特性Stream流式操作的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot之使用Feign實(shí)現(xiàn)微服務(wù)間的交互

    SpringBoot之使用Feign實(shí)現(xiàn)微服務(wù)間的交互

    這篇文章主要介紹了SpringBoot中使用Feign實(shí)現(xiàn)微服務(wù)間的交互,對(duì)微服務(wù)這方面感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • Seata?環(huán)境搭建部署過(guò)程

    Seata?環(huán)境搭建部署過(guò)程

    Seata是一個(gè)分布式事務(wù),seata服務(wù)端也是一個(gè)微服務(wù),需要和其他微服務(wù)一樣需要注冊(cè)中心和配置中心,這篇文章主要介紹了Seata?環(huán)境搭建,需要的朋友可以參考下
    2022-10-10
  • Java開(kāi)發(fā)學(xué)習(xí) Eclipse項(xiàng)目有紅感嘆號(hào)解決之道

    Java開(kāi)發(fā)學(xué)習(xí) Eclipse項(xiàng)目有紅感嘆號(hào)解決之道

    這篇文章主要為大家詳細(xì)介紹了完美解決Eclipse項(xiàng)目有紅感嘆號(hào)問(wèn)題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 在SpringBoot+MyBatis中優(yōu)雅處理多表數(shù)據(jù)清洗的實(shí)現(xiàn)步驟

    在SpringBoot+MyBatis中優(yōu)雅處理多表數(shù)據(jù)清洗的實(shí)現(xiàn)步驟

    數(shù)據(jù)清洗是指對(duì)數(shù)據(jù)進(jìn)行處理和糾錯(cuò),以去除或修復(fù)數(shù)據(jù)集中存在的錯(cuò)誤、不致、不完整和冗余的數(shù)據(jù),從而使數(shù)據(jù)更加準(zhǔn)確、可靠和有用,本文給大家介紹了在SpringBoot和MyBatis中優(yōu)雅處理多表數(shù)據(jù)清洗的實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2025-03-03

最新評(píng)論

交城县| 渭源县| 当阳市| 灵宝市| 万山特区| 田东县| 永定县| 洛川县| 宁武县| 浦江县| 通城县| 墨竹工卡县| 藁城市| 宁津县| 自贡市| 兖州市| 临洮县| 新邵县| 抚远县| 呼伦贝尔市| 滨州市| 张家川| 兴义市| 宜春市| 明星| 油尖旺区| 和静县| 莆田市| 乌鲁木齐县| 安吉县| 大荔县| 阿鲁科尔沁旗| 宁国市| 新和县| 延寿县| 卓尼县| 贵溪市| 两当县| 肇东市| 光泽县| 社会|