精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么你總是不明白Java IO流?這是我用過的最好工具

開發 前端
在任何編程語言中,數據的IO都是比較常見并相當重要的。Guava作為工具型類庫,主要是幫助開發者封裝常用、重復的操作,開放出簡介的API,不僅能讓讓代碼更加整潔, 同時對開發出穩健程序也是比不可少的。

哈嘍,大家好,我是指北君,今天我們來講一講java中的IO流與Guava。

Guava IO

日常系統交互中,文件的上傳下載都是常見的,一般我們會通過jdk提供的IO操作庫幫助我們實現。IO指的是數據相對當前操作程序的入與出,將數據通過 輸出流從程序輸出,或者通過輸入流將數據(從文件、網絡、數據等)寫入到程序,這里的IO指的是基于流作為載體進行數據傳輸。如果把數據比作合理的水,河就是IO流,也是數據的載體。

Java為我們提供了非常多的操作IO的接口與類,幫助開發者實現不同源間的數據傳輸,比如硬盤文件、網絡傳輸、應用調用間的數據交互與傳遞。今天我們來簡單了解下Java中的流 以及在Guava工具包中,針對IO操作做了什么樣的封裝與設計。

分類

在java.io包中有非常多的IO相關接口,我們可以根據流的輸出類型、處理對象以及功能將其分為以下幾種類型:

  • 按數據流向

輸入流 (java.io.InputStream)用于實現將數據讀入到程序

輸出流 (java.io.OutputStream)用于實現將數據從程序寫出

  • 按操作單位

字節流以字節(byte)為單位進行數據的讀、寫 (其中針對文件也提供了按基礎數據類型的讀與寫DataInpoutStream,也就是按照Java基礎類型所占字節數來進行定量字節讀取并合并)

字符流以字符(char)為單位進行數據的讀、寫,此時需要注意字符編碼

區分:

字節流一般以Stream結尾 字符流一般以Reader或Writer結尾

  • 按操作方式

讀 (java.io.Reader)主要針對字符流的讀取操作

寫 (java.io.Writer)主要針對字符流的寫出操作

  • 按功能

緩存流按字節進行數據讀寫時,通過緩沖批量寫入來提高傳輸效率

轉換流實現輸入/出與讀/寫方式間的轉換

常用的流

  • 操作文件的java.io.FileinputStream/FileOutputStream java.io.FileReader/FileWriter
  • 通用的字節流java.io.InputStreamReader/outputStreamWriter
  • 緩沖流java.io.BufferedReader/BufferedWriter java.io.BufferedInputStream/BufferedOutputStream
  • 數據流java.io.DataInpoutStream/DataOutputStream
  • 功能型的java.io.PrintWriter/PrintStream
  • 對象序列化相關的java.io.ObjectInputStream/ObjectOutputStream

可見,提供的IO對象基本都是成對出現的,用以完成數據的輸入輸出,實現程序與外部載體間的數據交換

示例

下面我們通過一些常用示例來看看IO的使用的場景與使用方法:

  • 文件復制
  • 文件的合并
  • 讀取文件內容為字符串
  • 字節數組轉換成流
  • 對象序列化與反序列化
  • 流的轉換
  • ......
  • 文件復制
@Test
public void copyByBytes() throws IOException {
String root = FileTests.class.getResource("/").getPath();

FileInputStream fis = new FileInputStream(new File(root,"/start.bat"));
FileOutputStream fos = new FileOutputStream(root+"/out2.bat");

byte[] buff = new byte[100];

int b;
while ( (b = fis.read(buff))!=-1 ){
fos.write(buff, 0, b);
}
// close
}
  • 文件合并
@Test
public void mergeFiles() throws IOException {
File file1 = new File("E:\\_projects\\sucls\\blog\\my_study\\guava\\guava-io\\src\\test\\java\\com\\sucls\\blog\\guava\\io\\category\\FileTests.java");
File file2 = new File("E:\\_projects\\sucls\\blog\\my_study\\guava\\guava-io\\src\\test\\java\\com\\sucls\\blog\\guava\\io\\category\\StreamTests.java");

Enumeration<InputStream> ins = Collections.enumeration(Arrays.asList(
new FileInputStream(file1),
new FileInputStream(file2)
));

SequenceInputStream sequenceInputStream = new SequenceInputStream(ins);

FileOutputStream fos = new FileOutputStream(root+"/out4");

byte[] buff = new byte[100];

int read; // 真實讀取到的字節數
while ( (read = sequenceInputStream.read(buff)) !=-1){
fos.write(buff, 0, read);
}

fos.close();
}
  • 讀取文件內容為字符串
@Test
public void readStringFromFile() throws IOException {
FileReader fileReader = new FileReader(new File(this.getClass().getResource("/").getPath(),"/start.bat"));

StringBuilder stringBuilder = new StringBuilder();

int i;
while ( (i = fileReader.read())!=-1 ){
stringBuilder.append( (char)i ); // 按字符讀取
}

System.out.println( stringBuilder ); // 文件內容
}
  • 字節數組轉換成流
@Test
public void bytesToStream(){
byte [] data = new byte[1024]; // 來源于其他數據源

ByteArrayInputStream inputStream = new ByteArrayInputStream(data);

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

int v;
while ( (v=inputStream.read())!=-1 ){
outputStream.write(v);
}

System.out.println( Arrays.toString( outputStream.toByteArray() ));
}
  • 對象序列化與反序列化
@Test
public void objectToFile() throws IOException {

Person person = new Person();
person.setName("張三").setAge(25);

String root = FileTests.class.getResource("/").getPath();

FileOutputStream fos = new FileOutputStream(new File(root,"/person"));
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(person);
}

@Test
public void fileToObject() throws IOException, ClassNotFoundException {
String root = FileTests.class.getResource("/").getPath();

FileInputStream fis = new FileInputStream(new File(root,"/person"));
ObjectInputStream ois = new ObjectInputStream(fis);

Person person = (Person) ois.readObject();
System.out.println( person );
}
  • 流的轉換 將字節流轉換成字符流來操作,同樣以文件復制為例
@Test
public void copyByBuffer() throws IOException {
String root = FileTests.class.getResource("/").getPath();

FileInputStream fis = new FileInputStream(new File(root,"/start.bat"));
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);

FileOutputStream fos = new FileOutputStream(root+"/out3.bat");
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);

String line;
while ( (line = br.readLine())!=null ){
bw.append(line);
bw.newLine();
bw.flush();
}

// close
}

關于流的操作非常多,像包括網絡通信中、音視頻文件處理、流合并等等

Guava中的IO

關于IO的內容并不復雜,上面的那些例子在很多工具庫中基本都會提供對應的API方便開發者調用,今天主要看下Guava IO模塊針對流的操作提供了什么樣的 封裝

Files

提供對文件快捷讀寫方法 其中主要提供了ByteSource、ByteSink、CharSource、CharSink 4個類,分別對應按字節的讀寫與按字符的讀寫,

/**
* 文件復制
*/
@Test
public void copy() throws IOException {
File from = new File(root,"from");
File to = new File(root,"to");
Files.copy(from,to);
}

/**
* 文件移動
*/
@Test
public void move() throws IOException {
File from = new File(root,"from");
File to = new File(root,"to");
Files.move(from,to);
}

/**
* 按行讀取文件
* @throws IOException
*/
@Test
public void readLines() throws IOException {
File dest = new File(root,"start.bat");
List<String> lines = Files.readLines(dest, Charset.defaultCharset());
lines.forEach(System.out::println);
}

/**
* 寫入文件
* @throws IOException
*/
@Test
public void writeToFile() throws IOException {
File dest = new File(root,"demo.txt");
Files.write("hello world!".getBytes(Charset.defaultCharset()), dest);
}

/**
* 修改文件更新時間
* @throws IOException
*/
@Test
public void touch() throws IOException {
File dest = new File(root,"demo.txt");
Files.touch(dest);
}

/**
* 文件的零拷貝
* @throws IOException
*/
@Test
public void map() throws IOException, URISyntaxException {
File from = new File(root,"from");
File to = new File(root,"to");
Files.touch(to);

MappedByteBuffer fromBuff = Files.map(from, MapMode.READ_ONLY, 1024);
// =>
FileChannel channel = FileChannel.open(Paths.get(to.toURI()), StandardOpenOption.WRITE);

channel.write(fromBuff);

channel.close();
}

/**
* 讀文件為字節數組
* @throws IOException
*/
@Test
public void fileAndBytes() throws IOException {
File dest = new File(root,"start.bat");
ByteSource byteSource = Files.asByteSource(dest);
byte[] bytes = byteSource.read();
System.out.println( bytes );

// 字節寫入文件,實現復制
File target = new File(root, "start2.bat");
ByteSink byteSink = Files.asByteSink(target);
byteSink.write(bytes);
}

@Test
public void wrapper(){
File dest = new File(root,"start.bat");
// 作為字節讀
Files.asByteSource(dest);
// 作為字節寫
Files.asByteSink(dest);

// 作為字符讀
Files.asCharSource(dest, Charset.defaultCharset());
// 作為字符寫
Files.asCharSink(dest, Charset.defaultCharset());
}

其他

管道流

PipedOutputStream  PipedInputStream 實現多線程間的數據通信;類似生產消費者模式

@Test
public void pipe() throws IOException {
PipedOutputStream pipedOutputStream = new PipedOutputStream();
PipedInputStream pipedInputStream = new PipedInputStream();
pipedOutputStream.connect(pipedInputStream);

new Thread(()->{
while (true){
String date = new Date().toString();
try {
pipedOutputStream.write( date.getBytes(StandardCharsets.UTF_8) );
pipedOutputStream.flush();
TimeUnit.SECONDS.sleep(2);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();

new Thread(()->{
while (true){
byte [] buff = new byte[1024];
try {
int read = pipedInputStream.read(buff);
TimeUnit.SECONDS.sleep(4);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println( new String(buff) );
}
}).start();
}

結束語

在任何編程語言中,數據的IO都是比較常見并相當重要的。Guava作為工具型類庫,主要是幫助開發者封裝常用、重復的操作,開放出簡介的API,不僅能讓讓代碼更加整潔, 同時對開發出穩健程序也是比不可少的。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2009-04-23 08:31:23

微軟鮑爾默收購

2017-01-09 12:57:21

Linux

2025-03-25 08:50:00

2025-09-15 00:00:01

2025-03-24 00:00:15

2023-11-07 12:56:35

Redis主從復制

2018-05-14 17:36:59

2018-05-14 11:31:02

2015-12-23 11:32:50

2020-05-13 09:03:14

Python開發代碼

2025-09-04 09:22:54

2021-12-17 07:30:42

排序算法效率

2023-12-26 01:18:11

C代碼CPU主頻

2021-05-02 23:36:23

蘋果手機國產

2023-06-12 11:53:08

數據活躍率流失率

2021-03-01 07:59:24

架構系統Zachman

2020-10-16 15:27:04

面試算法

2024-12-03 12:05:57

2018-11-14 09:53:48

2023-11-07 16:21:55

點贊
收藏

51CTO技術棧公眾號

亚洲日本va午夜在线电影| 久久精品a一级国产免视看成人| 99精品网站| 亚洲成人av在线播放| 情侣黄网站免费看| 自拍视频在线| 不卡在线观看av| 国产精品久久久久久久久久ktv | 99热这里只有精品9| 极品尤物久久久av免费看| 亚洲免费视频在线观看| 在线免费看v片| 色在线视频观看| 国产精品欧美极品| 久久精品国产精品青草色艺| 国产精品无码在线播放| 久久久久久黄| 欧美激情二区三区| 国产精品成人在线视频| 这里视频有精品| 欧美视频一区二| 国产精品裸体瑜伽视频| 黄色免费在线观看网站| 久久久欧美精品sm网站| 成人激情av| 夜夜躁狠狠躁日日躁av| 国产精品久久久亚洲一区| 久久综合亚洲社区| 一区二区精品免费| 国产欧美三级电影| 欧美一区二区三区免费在线看| 欧美极品欧美精品欧美图片| 日本孕妇大胆孕交无码| 国产精品久久久久久久第一福利| 久久伦理网站| 欧美特黄一级视频| 国产毛片精品国产一区二区三区| 国产精品国产三级国产aⅴ浪潮 | 麻豆福利在线观看| 国产精品久久久久久久久晋中| 欧美日韩综合另类| 五月天丁香视频| 成人深夜在线观看| 亚洲一区二区三| 国产精品久久久午夜夜伦鲁鲁| 久久美女性网| 日产精品久久久一区二区福利| 国产一级视频在线观看| 欧美另类视频| 欧美大秀在线观看| 青青草原在线免费观看视频| 亚洲综合色网| 久久天天躁狠狠躁夜夜躁2014| 在线观看亚洲大片短视频| 久久97视频| 亚洲美女在线视频| 亚洲区免费视频| 香蕉一区二区| 国产香蕉精品视频一区二区三区 | 视频一区在线观看| 亚洲精品自拍视频| aa片在线观看视频在线播放| 久久影院资源站| 亚洲精品成人久久| 短视频在线观看| 国产亚洲一区| 中文字幕欧美日韩在线| 影音先锋男人看片资源| 国产韩日影视精品| 久久视频在线视频| 欧美性猛交xxxxx少妇| 国产精品扒开腿做爽爽爽软件| 久久久精品免费视频| 亚洲av鲁丝一区二区三区 | 黄色www网站| 中文字幕这里只有精品| 91成人免费在线视频| 美女网站视频黄色| 精品一区二区三区四区五区| 精品欧美一区二区三区精品久久| 国产精品无码电影| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产精品女同一区二区三区| 国产精品美女在线播放| 欧美日韩经典丝袜| 欧美午夜片在线免费观看| 精品久久久久久久无码| 国产精品亚洲欧美日韩一区在线 | 一本在线高清不卡dvd| 热久久精品免费视频| 日日夜夜精品| 精品电影一区二区| 先锋影音av在线| 亚洲精品成人影院| 91av在线视频观看| 亚洲一区精品在线观看| 成人免费视频一区二区| 青青草原成人| 美女尤物在线视频| 欧美性猛片xxxx免费看久爱| avtt中文字幕| 欧州一区二区| 8x拔播拔播x8国产精品| 亚洲字幕av一区二区三区四区| 粉嫩aⅴ一区二区三区四区五区| 欧美成人蜜桃| 国产丝袜在线观看视频| 欧美色成人综合| 少妇激情一区二区三区视频| 欧美国产一级| 日韩美女视频免费在线观看| 国产不卡精品视频| 亚洲国产精品国自产拍av| 久艹在线免费观看| 在线观看亚洲精品福利片| 日韩精品免费视频| h色网站在线观看| 老司机精品福利视频| 国产 高清 精品 在线 a| av中文天堂在线| 欧美日韩国产页| 又色又爽又黄18网站| 日韩成人精品一区| 日本精品久久久久久久| 亚洲精品97久久中文字幕| 国产精品亲子乱子伦xxxx裸| koreanbj精品视频一区| 视频精品一区二区三区| 日韩中文字幕在线视频播放| 国产成人无码专区| 99久久er热在这里只有精品15| 91手机视频在线| 黄色成人小视频| 亚洲欧洲xxxx| 精品国产一区二区三区四| 成人av在线电影| 久久亚洲a v| 精品久久免费| 麻豆成人在线看| 国产精品久久久久久无人区| 国产精品久久久久影院| 中文字幕一区二区三区四区在线视频| 四虎884aa成人精品最新| 久久久亚洲网站| 人妻无码一区二区三区久久99| 亚洲人xxxx| 九九九九九九九九| 国产精品久久久久久久免费观看| 国产精品美女999| 色网站免费在线观看| 日本韩国欧美一区二区三区| av黄色免费网站| 久久国产欧美| 日韩欧美一区二区三区四区五区 | 欧美成人性生活视频| 欧美三级三级三级| 影音先锋男人在线| 蜜桃视频第一区免费观看| 四虎永久国产精品| 国产精品久久久久77777丨| 中文字幕精品在线视频| 91成人一区二区三区| 日韩毛片一二三区| 精品人妻一区二区三区免费| 影音先锋日韩资源| 麻豆传媒一区| 欧美一级二级视频| 日韩小视频在线观看| 国产女18毛片多18精品| 亚洲影院久久精品| 精品夜夜澡人妻无码av| 久久久久久穴| 在线国产99| 伊人精品久久| 欧美在线观看网址综合| 福利片在线观看| 欧美一级在线观看| 男女视频免费看| 欧美激情一区二区三区蜜桃视频| 中文字幕国产高清| 亚洲精品美女| 亚洲ai欧洲av| 99精品国产一区二区三区2021| 97高清免费视频| 成年人视频在线看| 日韩欧美一区在线| 日日夜夜操视频| 亚洲视频一区二区在线| 亚洲少妇18p| 青青草91视频| 四虎4hu永久免费入口| 色老板在线视频一区二区| 国产精品久久视频| 暖暖在线中文免费日本| 国产亚洲视频在线观看| 国产av精国产传媒| 欧美性xxxxxxx| 成人免费黄色小视频| 2024国产精品| 午夜诱惑痒痒网| 亚洲主播在线| 国产卡一卡二在线| 国产日产精品_国产精品毛片| 91色中文字幕| 欧美色网在线| 97久久国产精品| 超碰在线观看免费版| 国产亚洲精品久久久久久牛牛 | yjizz国产| 亚洲激情自拍偷拍| 日本免费www| caoporn国产精品| 日韩视频在线观看一区二区三区| 亚洲男女自偷自拍| bt天堂新版中文在线地址| 日韩88av| 五月天色一区| 日韩有码一区| 国产精品一区二区三区在线| 在线成人免费| 国产欧亚日韩视频| 日产精品一区| 欧美怡春院一区二区三区| 色www永久免费视频首页在线| 中文字幕日本欧美| 国产日本在线视频| 日韩精品在线免费播放| 人妻精品一区二区三区| 日韩欧美的一区| 国产农村老头老太视频| 欧美日韩免费一区二区三区 | 99爱在线视频| 欧美日韩成人网| 毛片在线播放a| 中文字幕亚洲色图| av女优在线| 永久免费毛片在线播放不卡 | 国产成人精品福利| 91精品国产一区二区三区动漫 | 日韩福利视频导航| 奇米精品一区二区三区| 亚洲精品极品| 霍思燕三级露全乳照| 亚洲国产高清一区二区三区| 国产免费内射又粗又爽密桃视频| 国产精品99一区二区三区| 亚洲一卡二卡区| 99视频精品全部免费在线视频| 亚洲欧洲在线一区| 日韩一区二区三区免费播放| 亚洲啪啪av| 欧美一区影院| 大西瓜av在线| 亚洲在线电影| 日韩精品无码一区二区三区免费 | 色哟哟免费视频| 国产精品一区二区在线看| 国产黄色一区二区三区| 国产美女精品在线| 午夜性福利视频| 99久久精品国产网站| 18禁裸乳无遮挡啪啪无码免费| www成人在线观看| 黄色av免费播放| 亚洲天堂免费看| 精品无码人妻一区二区三区| 污片在线观看一区二区| 97久久久久久久| 欧洲精品视频在线观看| 国产原创中文av| 精品少妇一区二区三区| 亚洲av激情无码专区在线播放| 亚洲毛茸茸少妇高潮呻吟| av男人的天堂在线| 欧美超级免费视 在线| 97久久人人超碰caoprom| 欧美综合一区第一页| 色成人免费网站| 亚洲综合中文字幕在线| 老牛精品亚洲成av人片| 日韩一区免费观看| 欧美1区视频| 日韩av黄色网址| 久久99精品一区二区三区| 无码国产精品一区二区免费式直播| 26uuu另类欧美| 伊人在线视频观看| 婷婷成人综合网| 一本久道久久综合无码中文| 精品久久国产字幕高潮| 高清av在线| 性视频1819p久久| 成人在线免费av| 国产精品伊人日日| 欧美freesextv| 欧美亚洲一二三区| 久久国产综合精品| aaaaaav| 日韩码欧中文字| 国产性猛交╳xxx乱大交| 欧美精品在线观看一区二区| 亚洲欧洲精品视频| 久久夜色精品国产欧美乱| 国模套图日韩精品一区二区| 亚洲永久在线观看| 国产精品羞羞答答在线观看| 国产又粗又长又爽视频| 日韩在线a电影| 你懂的在线观看网站| 亚洲日本韩国一区| 伊人久久久久久久久久久久| 精品免费日韩av| 黄色网页在线播放| 国产精品久久久亚洲| 小说区图片区色综合区| 欧美大黑帍在线播放| 久久66热re国产| 波多野在线播放| 欧美午夜丰满在线18影院| www.com在线观看| 日韩专区在线播放| 97精品国产综合久久久动漫日韩| 精品中文字幕一区| 欧美日韩一区自拍| 999这里有精品| 久久久久久久免费视频了| 麻豆视频在线观看| 欧美精品日韩一区| 生活片a∨在线观看| 国产精品高精视频免费| 久久91麻豆精品一区| 国产二区视频在线播放| 成人av在线一区二区三区| 欧美日韩国产精品综合| 91精品国产高清一区二区三区 | 超碰在线超碰在线| 国产精品久久三区| 亚洲资源在线播放| 在线亚洲国产精品网| 777午夜精品电影免费看| 美女黄毛**国产精品啪啪| 亚洲欧美高清| 国产精品三级在线观看无码| 欧美日韩国产精品专区| 性xxxx视频播放免费| 18性欧美xxxⅹ性满足| 免费看久久久| 高清在线观看免费| 2021中文字幕一区亚洲| 国产成人无码av| 精品在线小视频| 东京一区二区| 视频一区视频二区视频三区视频四区国产 | 亚洲综合影院| 亚洲中文字幕无码av永久| 成人教育av在线| 美日韩一二三区| 亚洲欧美制服中文字幕| 亚洲欧美在线成人| 欧美日韩视频免费在线观看| 国产美女精品一区二区三区| 久久亚洲成人av| 精品爽片免费看久久| 欧美精选视频一区二区| 一区二区三视频| 国产成人在线免费观看| 91精品国产乱码久久久张津瑜| 日韩精品极品在线观看播放免费视频 | 日韩精品欧美| 色哟哟在线观看视频| 亚洲不卡av一区二区三区| 日韩国产福利| 国产精品一区二区三区免费视频| 中文字幕日韩一区二区不卡| 天天躁日日躁狠狠躁av麻豆男男 | 久久久久久久久久亚洲| 欧美绝顶高潮抽搐喷水合集| mm1313亚洲国产精品无码试看| 中文字幕一区视频| 丰满人妻一区二区三区免费视频| 2023亚洲男人天堂| 四虎成人精品永久免费av九九| 中文字幕第66页| 欧美日韩国产精品一区二区三区四区 | 成人美女视频在线看| 综合久久中文字幕| 欧美国产中文字幕| 亚洲系列另类av| 午夜免费视频网站| 日韩欧美成人网| 国产在线观看91| 欧美日韩一区在线观看视频| 麻豆精品视频在线观看视频| 亚欧洲精品在线视频| 中文字幕日韩精品在线| 国产精品国产| 九九热精品国产| 一本大道久久a久久精品综合| av免费在线免费| 日韩免费电影一区二区三区|