流:數(shù)據(jù)流是一組有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對輸入和輸出的抽象
在棗強(qiáng)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站 網(wǎng)站設(shè)計制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),棗強(qiáng)網(wǎng)站建設(shè)費(fèi)用合理。流的劃分
數(shù)據(jù)傳輸方法:輸入流,輸出流;參照物為內(nèi)存,數(shù)據(jù)從內(nèi)存到磁盤為輸出,從磁盤到內(nèi)存為輸入。
處理的數(shù)據(jù)單元:字節(jié)流和字符流
節(jié)點(diǎn)流和處理流:節(jié)點(diǎn)流指的是向指定數(shù)據(jù)源進(jìn)行數(shù)據(jù)處理,處理則是從流中進(jìn)行數(shù)據(jù)的操作
體系結(jié)構(gòu)
抽象基類
InputStream(字節(jié)輸入)
OutputStream(字節(jié)輸出)
Writer(字符輸出)
Reader(字符輸入)
緩沖流:緩沖流通過定義緩沖區(qū)(內(nèi)存中),一次性讀取大量數(shù)據(jù)存入緩沖區(qū),解決內(nèi)存和磁盤傳輸效率低下的問題。(個人理解,如有補(bǔ)充,小編跪謝)
二、入門案例1.使用字節(jié)流及其緩沖實(shí)現(xiàn)文件復(fù)制
package FileSty;
import java.io.*;
public class CopyAndTime {
public static void main(String[] args) {
String src = "E:/pic/34.jpg";
String desc = "E:/pic/pic1/34.jpg";
//
// new CopyFileByte().countTime(src, desc);// 共耗時2988毫秒
// new CopyFileBuffer().countTime(src, desc);// 共耗時27毫秒
// 讀取一個字節(jié)數(shù)組
// new CopyFileByte().countTime(src, desc);//共耗時6毫秒
new CopyFileBuffer().countTime(src, desc);// 共耗時3毫秒
}
}
abstract class CopyFile{
abstract void copyFile(String src, String desc);
public void countTime(String src, String desc){
long start = System.currentTimeMillis();
copyFile(src, desc);
long end = System.currentTimeMillis();
System.out.println("共耗時"+(end-start)+"毫秒");
}
}
class CopyFileByte extends CopyFile{
@Override
void copyFile(String src, String desc) {
// 判斷文件是否存在
File srcFile = new File(src);
if (!srcFile.exists())
return;
// 建立輸入輸出流進(jìn)行數(shù)據(jù)讀寫
FileInputStream fi =null;
FileOutputStream fo = null;
try{
fi = new FileInputStream(srcFile);
fo = new FileOutputStream(desc);
byte [] buf = new byte[1024];
int len;
while ((len = fi.read(buf)) != -1){
fo.write(buf, 0, len);
}
}catch (FileNotFoundException e){
System.out.println("文件不存在");
}catch(IOException e){
e.printStackTrace();
}
finally {
try{
if (fi != null)
fi.close();
if(fo != null)
fo.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
class CopyFileBuffer extends CopyFile{
@Override
void copyFile(String src, String desc) {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
bis = new BufferedInputStream(new FileInputStream(src));
bos = new BufferedOutputStream(new FileOutputStream(desc));
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1 ){
bos.write(buf, 0, len);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
一些說明:理論上,字節(jié)流(1個字節(jié)8個二進(jìn)制位)可以用于讀取任何文件,但部分會出現(xiàn)編碼問題,多用于讀取圖片、視頻、音頻等文件。
2.字符流實(shí)現(xiàn)文本文件的拷貝
// 此處異常已拋出
BufferedReader bis = new BufferedReader(new FileReader("E:\\fileTest\\test3.txt"));
BufferedWriter bos = new BufferedWriter(new FileWriter("E:\\fileTest\\test4.txt"));
char[] chs = new char[1024];
String line;
int lineNum = 1;
StringBuilder sb ;
// 逐行讀取
while ((line = bis.readLine()) != null){
// 添加行號
sb = new StringBuilder(lineNum++ + "").append(line);
// 逐行寫入,并換行
// WruteLine(),ReadLine()為BufferedWriter擴(kuò)展的方法
bos.write(sb.toString());
bos.newLine();
}
bis.close();
bos.close();
3. 字節(jié)流讀取指定編碼文件
數(shù)據(jù)源(本地ide的編碼為utf8)
使用字節(jié)流讀取
public class Test {
public static void main(String[] args) throws IOException {
String src = "E:\\fileTest\\Test\\test.txt";
FileInputStream fi = new FileInputStream(src);
int len;
// 準(zhǔn)備一個足夠大字節(jié)數(shù)組,不會出現(xiàn)編碼問題
byte [] by = new byte[1024];
while ((len = fi.read(by)) != -1){
System.out.println(new String(by, 0, len));
}
}
}
不出意外,亂碼了
改用字符流讀取
public class Test {
public static void main(String[] args) throws IOException {
String src = "E:\\fileTest\\Test\\test.txt";
FileReader fi = new FileReader(src);
int len;
// 準(zhǔn)備一個足夠大字節(jié)數(shù)組,不會出現(xiàn)編碼問題
char [] by = new char[1024];
while ((len = fi.read(by)) != -1){
System.out.println(new String(new String(by, 0, len).getBytes("gbk")));
// 這里的亂碼可能是我理解不夠,代碼有問題
}
}
}
依然讀取失敗
使用轉(zhuǎn)換流讀取
public class Test {
public static void main(String[] args) throws IOException {
String src = "E:\\fileTest\\Test\\test.txt";
FileInputStream fi = new FileInputStream(src);
InputStreamReader isr = new InputStreamReader(fi, "gbk");
int len;
// 準(zhǔn)備一個足夠大字節(jié)數(shù)組,不會出現(xiàn)編碼問題
char [] by = new char[1024];
while ((len = isr.read(by)) != -1){
System.out.println(new String(by, 0, len));
}
}
}
成功讀取到文件內(nèi)容 ,可認(rèn)為,轉(zhuǎn)換為可以將字節(jié)流讀取的字節(jié)序列按照指定的編碼規(guī)則轉(zhuǎn)換為字符
4.序列化和反序列化的使用
package WriterAndReader;
import java.io.*;
@SuppressWarnings("all")
public class Seri {
public static void main(String[] args) throws IOException,ClassNotFoundException {
// 序列化:將數(shù)據(jù)和它的數(shù)據(jù)類型轉(zhuǎn)換為字節(jié)序列
// 反序列化:將某個序列化產(chǎn)生的字節(jié)序列恢復(fù)
// 序列化
Demo demo = new Demo(1, "阿歡", 37.0);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\fileTest\\Demo.bin"));
oos.writeObject(demo);
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\fileTest\\Demo.bin"));
System.out.println(ois.readObject());
}
}
// 一個對像要序列化,則這個類必須實(shí)現(xiàn) Serializable 或 Externalizable
// 一般實(shí)現(xiàn)Serializable接口,不需要進(jìn)行方法實(shí)現(xiàn)
class Demo implements Serializable{
Integer id;
String name;
// 不需要序列化的屬性可以通過transient進(jìn)行標(biāo)識
transient Double temperature;
public Demo(Integer id, String name, Double temperature) {
this.id = id;
this.name = name;
this.temperature = temperature;
}
@Override
public String toString() {
return "Demo{" +
"id=" + id +
", name='" + name + '\'' +
", temperature=" + temperature +
'}';
}
}
運(yùn)行結(jié)果
5.結(jié)合Propertis使用
Properties是HashMap的子類,存儲鍵值對,支持從輸入流中加載配置文件到Propertie集合,也可用于將Properties集合中的鍵值對寫入配置文件,寫入格式為String T?= String V,默認(rèn)鍵和值為String類型,key重復(fù)時相當(dāng)于更新配置文件。
6.bio、nio、aio
BIO:線程發(fā)起IO請求到IO結(jié)束,線程一直阻塞,直到操作完成。
NIO:線程發(fā)起IO請求,立即返回,期間可以做其他事;當(dāng)內(nèi)核有可用IO資源時,通過調(diào)用注冊的回調(diào)函數(shù)通知線程做IO操作,線程開始阻塞,直到操作完成。
AIO:線程發(fā)起IO請求,立即返回;內(nèi)存做好IO操作的準(zhǔn)備之后,做IO操作,直到操作完成或者失敗,通過調(diào)用注冊的回調(diào)函數(shù)通知線程做IO操作完成或者失敗。
BIO是一個連接一個線程。
NIO是一個請求一個線程。
AIO是一個有效請求一個線程。
BIO:同步并阻塞,服務(wù)器實(shí)現(xiàn)模式為一個連接一個線程,即客戶端有連接請求時服務(wù)器端就需要啟動一個線程進(jìn)行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當(dāng)然可以通過線程池機(jī)制改善。
NIO:同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個請求一個線程,即客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請求時才啟動一個線程進(jìn)行處理。
AIO:異步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動線程進(jìn)行處理。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:Io流學(xué)習(xí)-創(chuàng)新互聯(lián)
鏈接地址:http://aaarwkj.com/article22/jccjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、ChatGPT、網(wǎng)站營銷、建站公司、電子商務(wù)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容