日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流

發布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 字節流類
    • 帶緩存的輸入/輸出流
      • BufferedReader與BufferedWriter類
      • 下面的例子程序演示了read()方法,從控制臺讀取字符直到用戶鍵入“q”:
      • 下面一個例子:從鍵盤讀取字符,直到輸入stop停止
      • 文本輸出PrintWriter流:
      • PrintWriter注意事項
    • 文件的讀寫
      • 讀取文本單行文字并輸出
    • 鍵盤讀取--Scanner對象
    • 數據輸入/輸出流(DataInputStream類與DataOutputStream類)
    • 字符流的輸入/輸出類


字節流類

字節流由兩個類層次結構定義。在頂層有兩個抽象類:InputStream 和 OutputStream。
每個抽象類都有多個具體的子類,這些子類對不同的外設進行處理,例如磁盤文件,網絡連接,甚至是內存緩沖區,要使用流類,必須導入Java.io包。

帶緩存的輸入/輸出流

緩存是I/O的一種性能優化。緩存流為I/O流增加了內存緩存區。有了緩存區,使得在流上執行skip()、mark()和reset()方法都成為可能。
BufferedInputStream與BufferedOutputStream類 BufferedInputStream類可以對所有InputStream類進行帶緩存區的包裝以達到性能的優化。
BufferedInputStream類有兩個構造方法:  BufferedInputStream(InputStream in)。  BufferedInputStream(InputStream in,int size)。
第一種形式的構造方法創建了一個帶有32個字節的緩存流;第二種形式的構造方法按指定的大小來創建緩存區。
一個最優的緩存區的大小,取決于它所在的操作系統、可用的內存空間以及機器配置。從構造方法可以看出,BufferedInputStream對象位于InputStream類對象之前。
字節數據讀取文件的過程:

文件:–>InputStream -->BufferedInputStream–>目的地
(BufferedInputStream讀取文件過程)

使用BufferedOutputStream輸出信息和用OutputStream輸出信息完全一樣,只不過BufferedOutputStream有一個flush()方法用來將緩存區的數據強制輸出完。
BufferedOutputStream類也有兩個構造方法:  BufferedOutputStream(OutputStream in)。  BufferedOutputStream(OutputStream in,int size)。
第一種構造方法創建一個有32個字節的緩存區,第二種構造方法以指定的大小來創建緩存區。
注意: flush()方法就是用于即使在緩存區沒有滿的情況下,也將緩存區的內容強制寫入到外設,習慣上稱這個過程為刷新。flush()方法只對使用緩存區的OutputStream類的子類有效。當調用close()方法時,系統在關閉流之前,也會將緩存區中的信息刷新到磁盤文件中。

BufferedReader與BufferedWriter類

BufferedReader 支持緩沖輸入流。它最常見的構造函
數如下:
BufferedReader(Reader inputReader)
這里,inputReader是鏈接被創建的BufferedReader實例的流。Reader是一個抽象類。它的一個具體的子類是InputStreamReader,該子類把字節轉換成字符。為獲得鏈接System.in的一個InputStreamReader的對象,用下面的構造函數:
InputStreamReader(InputStream inputStream)
BufferedReader類與BufferedWriter類分別繼承Reader類與Writer類。這兩個類同樣具有內部緩存機制,并可以以行為單位進行輸入/輸出。
BufferedReader類常用的方法如下:
 read()方法:讀取單個字符。
 readLine()方法:讀取一個文本行,并將其返回為字符串。若無數據可讀,則返回null。
 BufferedWriter類中的方法都返回void。常用的方法如下。  
write(String s, int off, int len)方法:寫入字符串的某一部分。
flush()方法:刷新該流的緩存。  
newLine()方法:寫入一個行分隔符。

因為System .in引用了InputStream 類型的對象,它可以用于inputStream。綜上所述,下面的一行代碼創建了與鍵盤相連的BufferedReader對象。
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
當該語句執行后,br是通過System.in生成的鏈接控制臺的字符流。
在使用BufferedWriter類的Write()方法時,數據并沒有立刻被寫入輸出流,而是首先進入緩存區中。如果想立刻將緩存區中的數據寫入輸出流,一定要調用flush()方法

下面的例子程序演示了read()方法,從控制臺讀取字符直到用戶鍵入“q”:

import java.io.*; class BRRead { public static void main(String args[]) throws IOException { char c; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter characters, 'q' to quit."); // read characters do { c = (char) br.read(); System.out.println(c); } while(c != 'q'); } }

下面一個例子:從鍵盤讀取字符,直到輸入stop停止

class nn {public static void main(String args[])throws IOException { // create a BufferedReader using System.inBufferedReader br = new BufferedReader(newInputStreamReader(System.in));String str[] = new String[100];System.out.println("Enter lines of text.");System.out.println("Enter 'stop' to quit.");for (int i = 0; i < 100; i++) {str[i] = br.readLine();if (str[i].equals("stop")) break;}System.out.println("\nHere is your file:"); // display the linesfor (int i = 0; i < 100; i++) {if (str[i].equals("stop")) break;System.out.println(str[i]);}} }

文本輸出PrintWriter流:

這個類擁有以文本格式打印字符串和數字的方法。
PrintStream 定義的write( )的最簡單的形式如下:
void write(int byteval)
該方法按照byteval指定的數向文件寫字節。盡管byteval 定義成整數,但只有低位的8個字節被寫入.
例子:

// Demonstrate System.out.write(). class WriteDemo { public static void main(String args[]) {PrintWriter iout = new PrintWriter("D:\\Error.txt","UTF-8");iout.println("sf");iout.flush();iout.close(); } }

對于實際的程序,Java推薦的向控制臺寫數據的方法是用
PrintWriter流。PrintWriter是基于字符的類。用基于字符類向控制臺寫數據使程序更為國際化。
PrintWriter定義了多個構造函數,我們所用到的一個如下:
PrintWriter(OutputStream outputStream, boolean flushOnNewline)
PrintStream類型的對象的行為看起來確實很像打印寫出器,但是與打印寫出器不同的是,它們允許我們用write(int)和write(byte[])方法輸出原生字節。

PrintWriter注意事項

注意!

iout.flush();
iout.close();
必須寫,否則無法寫入到文本文件!!!!!
優點:使用PrintWriter使實際的應用程序更容易國際化

public class PrintWriterDemo { public static void main(String args[]) { PrintWriter pw = new PrintWriter(System.out, true); pw.println("This is a string"); int i = -7; pw.println(i); double d = 4.5e-7; pw.println(d); } }

該程序的輸出如下:
This is a string
-7
4.5E-7

文件的讀寫

兩個最常用的流類是FileInputStream和FileOutputStream,它們生成與文件鏈接的字節流。為打開文件,你只需創建這些類中某一個類的一個對象,在構造函數中以參數形式指定文件的名稱。這兩個類都支持其他形式的重載構造函數。下面是我們將要用到的形式:
FileInputStream(String fileName) throws FileNotFoundException
FileOutputStream(String fileName) throws FileNotFoundException
對文件的操作結束后,需要調用close( )來關閉文件。
向文件中寫數據,需用FileOutputStream定義的write()方法。它的最簡單形式如下:
void write(int byteval) throws IOException

讀取文本單行文字并輸出

本實例向指定的磁盤文件中寫入數據,并通過BufferedReader類將文件中的信息分行顯示。代碼如下:

import java.io.*;public class Student {public static void main(String[] args) throws FileNotFoundException {String content[] = {"nice", "哥哥好","加油哦哈哈哈"};File file = new File("word.txt");try {FileWriter fw = new FileWriter(file);BufferedWriter bufw = new BufferedWriter(fw);for (int k = 0; k < content.length; k++) {bufw.write(content[k]);//將字符串數組中的元素寫入到磁盤文件bufw.newLine();//將數組中單個元素以單行的形式寫入文件}bufw.close();//關閉流fw.close();} catch (Exception e) {e.printStackTrace();}try{FileReader fr = new FileReader(file);BufferedReader bffr = new BufferedReader(fr);String s = null;int i = 0;while((s=bffr.readLine())!=null){i++;System.out.println("第"+i+"行"+s);}bffr.close();fr.close();}catch(Exception e1){e1.printStackTrace();}} }

https://www.waveshare.net/wiki/IMX219-120_Camera

鍵盤讀取–Scanner對象

要想通過控制臺進行輸入,首先需要構造一個Scanner對象,并與“標準輸入流”System.in關聯。

Scanner in = new Scanner(System.in);String name = in.nextLine();//讀取一行 可以包含空格String first = in.next();//以空白符作為分隔符int age = in.nextInt();//讀取整數double money = in.nextDouble();Console cons = System.console();//用于讀取密碼的類String username = cons.readLine("name:");char[] password = cons.readPassword("password:");

·boolean hasNextInt()
·boolean hasNextDouble()

數據輸入/輸出流(DataInputStream類與DataOutputStream類)

DataInputStream類與DataOutputStream類允許應用程序以與機器無關的方式從底層輸入流中讀取基本Java數據類型。也就是說,當讀取一個數據時,不必再關心這個數值應當是哪種字節。
DataInputStream類與DataOutputStream類的構造方法如下。  DataInputStream(InputStream in):
使用指定的基礎InputStream創建一個DataInputStream。  DataOutputStream(OutputStream out):創建一個新的數據輸出流,將數據寫入指定基礎輸出流。
DataOutputStream類提供了如下3種寫入字符串的方法。  writeBytes(String s)。  
writeChars(String s)。  
writeUTF(String s)。
由于Java中的字符是Unicode編碼,是雙字節的,writeBytes只是將字符串中的每一個字符的低字節內容寫入目標設備中;而writeChars將字符串中的每一個字符的兩個字節的內容都寫到目標設備中;writeUTF將字符串按照UTF編碼后的字節長度寫入目標設備,然后才是每一個字節的UTF編碼。 DataInputStream類只提供了一個readUTF()方法返回字符串。這是因為要在一個連續的字節流讀取一個字符串,如果沒有特殊的標記作為一個字符串的結尾,并且不知道這個字符串的長度,就無法知道讀取到什么位置才是這個字符串的結束。DataOutputStream類中只有writeUTF()方法向目標設備中寫入字符串的長度,所以也能準確地讀回寫入字符串。

附錄:
流類 含義
BufferedInputStream 緩沖輸入流
BufferedOutputStream 緩沖輸出流
ByteArrayInputStream 從字節數組讀取的輸入流
ByteArrayOutputStream 向字節數組寫入的輸出流
DataInputStream 包含讀取Java標準數據類型方法的輸入流
DataOutputStream 包含編寫Java 標準數據類型方法的輸出流
FileInputStream 讀取文件的輸入流
FileOutputStream 寫文件的輸出流
FilterInputStream 實現 InputStream
FilterOutputStream 實現 OutputStream
InputStream 描述流輸入的抽象類
OutputStream 描述流輸出的抽象類
PipedInputStream 輸入管道
PipedOutputStream 輸出管道
PrintStream 包含print( ) 和 println( )的輸出流
PushbackInputStream 支持向輸入流返回一個字節的單字節的“unget”的輸入流
RandomAccessFile 支持隨機文件輸入/輸出
SequenceInputStream 兩個或兩個以上順序讀取的輸入流組成的輸入流

字符流的輸入/輸出類

字符流類由兩個類層次結構定義。頂層有兩個抽象類:Reader和Writer。這些抽象類處理統一編碼的字符流。

BufferedReader 緩沖輸入字符流
BufferedWriter 緩沖輸出字符流
CharArrayReader 從字符數組讀取數據的輸入流
CharArrayWriter 向字符數組寫數據的輸出流
FileReader 讀取文件的輸入流
FileWriter 寫文件的輸出流
FilterReader 過濾讀
FilterWriter 過濾寫
InputStreamReader 把字節轉換成字符的輸入流
LineNumberReader 計算行數的輸入流
OutputStreamWriter 把字符轉換成字節的輸出流
PipedReader 輸入管道
PipedWriter 輸出管道
PrintWriter 包含print( )和println( )的輸出流
PushbackReader 允許字符返回到輸入流的輸入流
Reader 描述字符流輸入的抽象類
StringReader 讀取字符串的輸入流
StringWriter 寫字符串的輸出流
Writer 描述字符流輸出的抽象類
其中兩個最重要的是read()和write(),它們分別進行字符數據的讀和寫。這些方法被派生流類重載。

注意:Java沒有像標準C的函數scanf()或C++輸入操作符那樣的統一的控制臺輸入方法。

總結

以上是生活随笔為你收集整理的【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。