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