java中输出时 什么作用_JAVA中输入和输出处理(Java I/O)重点总结
文件-使用File類操作文件:
什么是文件?? 文件可認為是相關記錄或放在一起的數據的集合。
文件一般存儲在哪里?? 儲存在存儲設備里。
Java程序如何訪問文件?? Java API:java.io.File 類
File類訪問文件屬性:
注意:
創建File文件要先new然后構造路徑名稱(類型是String)當使用Java.io.File類創建路徑的時候文件名時不能用\要用\\或者/因為在JAva中\有轉義的作用所以不能使用Java中的file并不僅僅指文件也可以指目錄
方法名稱? 說明? boolean? ? exists( )? 判斷文件或目錄是否存在? boolean? ? isFile( )? 判斷是否是文件? boolean? ? isDirectory( )? 判斷是否是目錄? String? ? ? getPath( )? 返回此對象表示的文件的相對路徑名? String? ? ? getAbsolutePath( )? 返回此對象表示的文件的絕對路徑名? String? ? ? getName( )? 返回此對象表示的文件或目錄的名稱? boolean? ? delete( )? 刪除此對象指定的文件或目錄? boolean? ? createNewFile( )? 創建名稱的空文件,不創建文件夾? long? ? ? ? length()? 返回文件的長度(單位為字節)
注:
絕對路徑:從計算機盤符(根目錄)出發,到最后的文件
相對路徑:從當前路徑出發,到最后的文件
length():如果文件不存在,則返回 0L(L代表是long這個類型)
流:
通過流來讀寫文件:
流是有序的數據序列,是以先進先出方式發送信息的通道。
讀數據是InputStream
寫數據是OutputStream
Java流的分類:(輸入是讀,輸出是寫)
【輸入輸出流是相對于計算機內存來說的】
【字節流是8位通用字節流,字符流是16位Unicode字符流】
文本文件的讀寫:
用FileInputStream和FileOutputStream讀寫文本文件用BufferedReader和BufferedWriter讀寫文本文件
二進制文件的讀寫:
使用DataInputStream和DataOutputStream讀寫二進制文件
InputStream(字節輸入流,是一個抽象類)類常用方法:
int read( )
【一個字節一個字節的讀出來,返回的是該字節的整數表示形式】
int read(byte[] b)
【從輸出流讀取若干字節,把這些字節保存到數組b中,返回的是讀取到的字節數,如果到了輸入流的末尾,返回-1】
int read(byte[] b,int off,int len)
【從輸出流讀取若干字節,把這些字節保存到數組b中,off指的是字節數組中開始保存數據的起始下標,len指返回的是讀取到的字節數,返回的是讀取到的字節數,如果到了輸入流的末尾返回-1】
void close( )
【讀流讀完了應該關了】
int available()
【可以從輸入流中讀取的字節數目】
子類FileInputStream常用的構造方法:
FileInputStream(File file)
【可以傳一個文件】
FileInputStream(String name)
【也可以寫一個路徑】
使用FileInputStream 讀文本文件:
方法一(一個一個取出來):
FileInputStream fis = new FileInputStream("d:/java160.txt");
int ch;
while((ch=fis.read()) != -1){
System.out.print((char)ch);
}
方法二(存在數組里然后取出來):
byte[] bytes = new byte[1024];
int ch;
//ch表示讀了多少字節,如果文件內容為空,則為-1
//一次讀1024
while((ch=fis.read(bytes))!=-1){
for(int i = 0;i
System.out.println((char)bytes[i]);
}
OutputStream類常用方法:
void write(int c)
void write(byte[] buf)
void write(byte[] b,int off,int len)
void close( )
void flush( ):【強制將緩沖區清空,有一些流自帶很大的空間,先把字符都放在這個空間里,等滿了就把緩沖區都放出去,所以flush就是強制把這些都沖出去( )】
子類FileOutputStream常用的構造方法:
FileOutputStream (File file)
FileOutputStream(String name)
FileOutputStream(String name,boolean append)
【boolean append可以指定覆蓋或追加文件內容,如果boolean為true那就會是追加而不是覆蓋】
寫入方法:
fos = new FileOutputStream("d:/test/hello.txt");
String str = "好好學習";
//將字符打散成為一個字節數組
byte[] words = str.getBytes();
fos.write(words, 0,words.length);
System.out.println("文件已被更新");
常見錯誤【1. 少寫了一個字節過來? ? 2. 多寫了很多空格過來】:
// 1、創建輸入流對象,負責讀取D:\我的青春誰做主.txt文件
FileInputStream fis = new FileInputStream("D:\\我的青春誰做主.txt");
//2、創建輸出流對象,負責將文件內容寫入到C:\myFile\my Prime.txt中
FileOutputStream fos = new FileOutputStream("C:\\myFile\\myPrime.txt",true);
// 3、創建中轉站數組,存放每次讀取的內容
byte words [] = new char[1024];
// 4、通過循環實現文件讀寫
while((fis.read())!=-1){
fis.read(words);? ? //讀取文件
fos.write(words, 0, words.length); }? ?//寫入文件
少寫了一個字節過來是因為while((fis.read())!=-1)已經讀了一次,然后又讀到words里多寫了很多空格過來是因為fos.write(words, 0, words.length)中用的是words.length,其中words共有1024個位置,除了讀到的之外還有很多空格所以也會輸出
正確寫法應該是:
int len = -1;
while((len =fis.read(words)) !=-1){
fos.write(words, 0, len); }
直接在while中把所有的都read出來,然后在寫的時候要從零一直到設置的len【len是讀到的所有字符的長度】
字符編碼格式:按照一定的標準把字符編碼能給中文編碼的就是GBK、GB2312和ANSI
我們一般做的項目編碼是UTF-8(國際通用的編碼格式)
中文亂碼:原因(文件編碼格式和程序環境的編碼格式不一樣)
解決方法:
把windows的preferences的general中UTF-8改成GBK把文件用UTF-8另存字符流去讀的時候,可以指定字符流的編碼格式
System.out.println(System.getProperty("file.encoding"));獲得本地平臺的字符編碼類型
Reader類常用方法
【作用和用法都和InputStream一樣,正常使用就可以】:
int read( )
int read(char[ ] c)
read(char[ ] c,int off,int len)
void close( )
為了解決中文亂碼使用子類InputStreamReader
子類InputStreamReader常用的構造方法:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)
【支持輸入的字符流,并且可以規定輸入的字符編碼格式】
孫子類FileReader類是InputStreamReader的子類【作用和用法都和FileInputStream一樣,正常使用就可以】:
new FileReader(File file)
new FileReader(String name)
該類只能按照系統默認的字符編碼來讀取數據,用戶不能指定其他的字符編碼類型
System.out.println(System.getProperty("file.encoding"));獲得本地平臺的字符編碼類型
有中文亂碼的缺陷所以一般使用InputStreamReader并且和FileInputStream fis = new FileInputStream("……"); 配合著來用
BufferedReader類:
如何提高字符流讀取文本文件的效率?
使用FileReader類與BufferedReader類
BufferedReader類是Reader類的子類
BufferedReader類帶有緩沖區
按行讀取內容的readLine()方法(一行一行的讀)【BufferedReader類特有的方法】
Reader類常用方法:
int read( )
int read(char[ ] c)
read(char[ ] c,int off,int len)
void close( )
子類BufferedReader常用的構造方法:
BufferedReader(Reader in)
子類BufferedReader特有的方法:
readLine()
注:
有時帶緩沖區的流讀不出東西來有可能是因為流沒關,要用XXX.close關閉才能繼續使用;當使用緩沖區的輸出流時流一定要關閉
Writer類:
Writer類常用方法:
write(String str)
write(String str,int off,int len)
void close()
void flush()
子類OutputStreamWriter(可以指定字符編碼格式)常用的構造方法:
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, String charsetName)
孫子類FileWriter:以下兩種構造都可以重載,指定一個boolean類型的參數,用來指定追加還是覆蓋文件內容
new FileWriter (File file)
new FileWriter (String path)
一定要記住使用.flush()和.close(),這樣才能把存在緩沖區中的數據沖出來。
BufferedWriter類:
如何提高字符流寫文本文件的效率?
使用FileWriter類與BufferedWriter類
【BufferedWriter類是Writer類的子類】
【BufferedWriter類帶有緩沖區的輸出流】
BufferedWriter常用的構造方法:
BufferedWriter(Writer out)
.newLine():換行(寫一個新航)
讀寫二進制文件:
DataInputStream類:
是FileInputStream的子類
與FileInputStream類結合使用讀取二進制文件
DataOutputStream類:
是FileOutputStream的子類
與FileOutputStream類結合使用寫二進制文件
總結:
序列化、反序列化:
序列化和反序列化的過程:
序列化是將對象的狀態寫入到特定的流中的過程。
反序列化則是從特定的流中獲取數據重新構建對象的過程。
對象輸入流(反序列化):
ObjectInputStream
反序列化的輸入方法:.readObject()【Object類型的,需要類型轉換】
對象輸出流(序列化):
ObjectOutputStream
序列化的輸出方法:.writeObject(Object)
常見異常:
NotSerializableException:類沒有實現Serializable接口,不可被序列化;要使用:implements Serializable來實現接口。
如果一個類想被序列化和他所有有關系的類都必須能被系列化(比如它的父類,子類…)
transient(關鍵字):屏蔽某些敏感字段的序列化
例如:private transient String password
總結
以上是生活随笔為你收集整理的java中输出时 什么作用_JAVA中输入和输出处理(Java I/O)重点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java aes key iv_java
- 下一篇: java json太长_修复Long类型