❶ java中列印流與輸出流有什麼區別和聯系
最簡單的理解,輸入流就是把數據讀入內存的一條通道,至於這里的數據時哪裡來的,各個不同的流之間有區別,它可以來自於本地文件,用戶鍵盤的輸入,網路伺服器等等,總之你要獲取數據,就可以通過輸入流。相反,輸出流就是數據輸出的通道,如我們程序中常用的System.out.println();就是通過標准輸出流實現列印的...
❷ java 輸入輸出流 (被採納為答案者加100分)
其中BufferedInputStream是FileInputStream的子類,你可以理解成同樣處理一個文件,BufferedInputStream效率更高,原因是BufferedInputStream採用了更高效的位元組流處理方式,
BufferedInputStream才用緩沖流把內在的緩沖器連接到I/O流,允許java程序對多個位元組同時操作,這樣就提高了效率。
inputstreamreader的構造函數帶兩個參數,一是關聯到的文件,二是字元解碼方式. 所以實際上通過inputstreamreader實例讀出來的東西已經不是磁碟上原始的位元組數據了,而是根據你指定的解碼方式(如果你沒有指定,則使用系統預設的,win2000下是gbk/gb2312)把位元組流轉換成了字元流,注意位元組流和字元流的區別,一個位元組就是8比特位(32位機器上),而一個字元含多少位元組則與不同的編碼/解碼方式有關了,如gbk是一位元組,utf-8是1-3的變長位元組,utf-16是2個定長位元組.
於是值得你注意的就是當你用inputstreamreader讀文件時,你應該知道該文件被存儲時是用什麼方式編碼的,否則你指定錯了解碼方式,讀出來的就是亂碼.但是退一步來說,在全英文環境下,問題也沒這嚴重.因為所有的字元集在前七位上都是與ascii兼容的(我猜的,也許有的不是),然而當你的程序涉及中文字元時,肯定是會出錯了.
那麼fileinputstream的特點呢?它的構造函數就一個,即關聯到的文件,既然沒有指定解碼方式,那它所做的就是只以位元組流的方式讀出文件而不做任何處理, 你應該用一個位元組數組來接受它,對該數組你以後還可以做任何想做的操作。
給你個例子,自己去測試
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.*;
public class test {
/* public static void main(String[] args) {
String str=new String("Face recognition in the thermal infrared domain has received relatively little attention in the literature in comparison with recognition in visible-spectrum imagery");
StringTokenizer token=new StringTokenizer(str);
Hashtable ht=new Hashtable();
while(token.hasMoreTokens()){
String temp=new String(token.nextToken());
ht.put(temp,temp);
}
Enumeration en=ht.keys();
while(en.hasMoreElements()){
Object obj=en.nextElement();
System.out.print("KEY_NO:"+obj);
System.out.println("="+ht.get(obj));
}
}
*/
public static void main(String[] args){
try {
String file1 ="d:\\1.doc";
String file2 ="d:\\2.doc";
File(file1,file2);
readFile(file2);
//fileCheck("d:\\test1.txt");
// readFile("D:\\test1.txt");
// readFileByte("D:\\test1.txt");
// readFileByFile("D:\\test1.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testFile() throws IOException{
File("D:\\test1.txt","D:\\test2.txt");
}
public static void File(String inName,String outName) throws IOException
{
File tmp = new File(outName);
if(!tmp.canRead())tmp.createNewFile();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(inName));
BufferedOutputStream out= new BufferedOutputStream(new FileOutputStream(outName));
File(in,out,true);
}
public static void readFile(String inName) throws IOException
{
BufferedReader read = new BufferedReader (new InputStreamReader(new FileInputStream(inName)));
String b ;
while((b=read.readLine())!=null )
print( b);
}
public static void readFileByte(String inName) throws IOException
{
BufferedInputStream read = new BufferedInputStream (new FileInputStream(inName));
int b = 0;
while((b=read.read())!=-1)
System.out.print ((char)b);
}
public static void readFileByFile(String name) throws IOException
{
File tmp = new File (name);
FileReader fr= new FileReader(tmp);
BufferedReader br = new BufferedReader(fr);
String b;
while((b=br.readLine())!=null)
print(b);
}
public static void File(InputStream in ,OutputStream out, boolean close) throws IOException{
int b;
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
if(close)
out.close();
}
public static void print(Object o)
{
System.out.println(o);
}
public static void fileCheck(String name) throws IOException
{
print("---"+name+"---");
File f= new File(name);
if(!f.exists())
{
print("fle not exist!");
return;
}
print("Canonical name:"+f.getCanonicalPath());
String p= f.getParent();
if(p!=null)
print("Parent directory :"+p);
if(f.canRead())print("file can be read!");
if(f.canWrite())print("file can be writable!");
Date d = new Date();
d.setTime(f.lastModified());
print("last modified time :"+d);
if(f.isFile())
{
print("file size is :"+f.length()+" bytes");
}else if(f.isDirectory()){print("is a directry!");}
else{
print("neither a directory or a file!");
}
print("");
}
}
❸ java IO輸入輸出流中的各種位元組流,字元流類,我需要都記住嗎,還是只要記住幾個常用的呢
記住幾個常用的就行了, 一般也就是用幾個常用的。
位元組流
位元組流主要是操作byte類型數據,也byte數組為准,主要操作類就是
·位元組輸出流:OutputStream
·位元組輸入流:InputStream
字元流
在程序中一個字元等於2個位元組,那麼java提供了Reader、Writer兩個專門操作字元流的類。
·字元輸出流:Writer
·字元輸入流:Reader
位元組-字元轉換流
OutputStreamWriter和InputStreamReader
在整個IO包中,實際上就是位元組流和字元流,但是除了這兩個流之外,還存在一組位元組流-字元流的轉換類。
[java] view plainprint?
•OutputStreamWriter:是Writer的子類,將輸出的字元流轉換為位元組流。即:將一個位元組流的輸出對象變為位元組流的輸出對象
•InputStreamReader:是Reader的子類,將輸入的位元組流變為字元流,即:將一個位元組流的輸入對象變為字元流的輸入對象。
❹ java 中對輸入輸出流類型重復調用,只對最後一次調用進行關閉,之前的調用不關閉,會有什麼後果
不是很理解 隨便說說
你當然可以不關閉 之所以用完就關閉 是防止佔用連接資源以及連接沖突 有些連接你不關閉的話 其他地方就不能使用了 並不是一定需要關閉 有些時候為了重用 是特意不關閉的 比如說資料庫連接池 他就是打開指定數目的數據連接 不關閉 程序需要使用資料庫連接了從連接池獲取 連接池負責管理連接 比如說保證給程序的是一個可用連接等等
一般情況下上層流關閉的同時也會將下層流關閉 比如說你在InputStream上套一個緩沖流 那麼你將緩沖流關閉了 InputStream同時也會關閉的 你如果套了好幾個的話 那麼只要關閉一個 其他所有流都沒辦法使用了 因為它們作為基本的流已經關閉了