精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

四虎在线视频免费观看| 久久精品三级视频| 成人免费观看在线观看| 成人黄色小视频在线观看| 国模叶桐国产精品一区| 欧美熟妇精品黑人巨大一二三区| 欧洲精品一区二区三区| 成人免费一区二区三区在线观看| av蓝导航精品导航| 在线观看日韩中文字幕| 久久密一区二区三区| 日韩三级高清在线| av片中文字幕| 污网站在线免费看| 久久久久国产一区二区三区四区| 91久久精品美女| 国产成人在线免费视频 | 麻豆av福利av久久av| 日本丰满少妇做爰爽爽| 综合天天久久| 国产亚洲欧美一区| 性活交片大全免费看| 先锋欧美三级| 亚洲va天堂va国产va久| 亚洲欧美日韩国产yyy| 欧美视频久久久| 久久精品免费看| 26uuu久久噜噜噜噜| 97成人资源站| 精品视频亚洲| 亚洲精品成人久久| a级大片免费看| 成人亚洲网站| 色综合久久久网| 男人天堂av片| jizz性欧美10| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美成人一二区| 欧美性猛交丰臀xxxxx网站| 无码人妻精品一区二区三区99v| 欧美日韩免费做爰大片| 高清在线成人网| 亚洲r级在线观看| 亚洲性生活大片| 日韩国产在线观看一区| 88国产精品欧美一区二区三区| 一级黄色录像视频| 97久久视频| 欧美一区二区在线免费观看| 五月婷婷丁香综合网| 在线免费av资源| 午夜伊人狠狠久久| 国产成人一区二区三区别| 国内精品久久久久久野外| 国产亚洲欧洲一区高清在线观看| 久久久久久久久一区| 午夜精品久久久久久久96蜜桃| 精品写真视频在线观看| 国产欧美精品久久久| 国产女主播喷水视频在线观看| 国产日韩1区| 久久久噜噜噜久久久| 欧美精品一区二区成人| 欧美三级小说| 国内成人精品一区| 国产手机在线视频| 亚洲免费网站| 国产成+人+综合+亚洲欧美丁香花| 精品国产午夜福利| 久久久久久婷| 国产精品免费在线免费| 免费在线不卡av| 久久99精品一区二区三区| 成人欧美一区二区三区在线湿哒哒| 在线观看黄色网| 国产在线精品免费av| 国产在线视频一区| 精品欧美在线观看| jlzzjlzz亚洲日本少妇| 玛丽玛丽电影原版免费观看1977 | 日日摸日日碰夜夜爽无码| a级片免费在线观看| 午夜成人免费视频| 国产av无码专区亚洲精品| 天天综合网站| 91麻豆精品国产91久久久久久| 日本少妇xxx| 精品少妇一区| 亚洲无亚洲人成网站77777| 亚洲一级片在线播放| **女人18毛片一区二区| 欧美日韩成人在线播放| 成人免费区一区二区三区| 日日噜噜夜夜狠狠视频欧美人 | 国产精品热久久| 高清国产一区二区| 欧美亚洲一级二级| 蜜桃视频网站在线观看| 亚洲一区二区av在线| aaa毛片在线观看| 成人在线日韩| 日韩av中文在线| 99re6热在线精品视频| 黄色欧美成人| 国产精品久久久久久久久久久不卡| 91中文字幕在线视频| 成人av综合在线| 亚洲午夜精品一区二区三区| 牛牛在线精品视频| 欧美亚洲国产一区二区三区| 久久精品aⅴ无码中文字字幕重口| 久久av电影| 欧美二区在线播放| 亚洲大尺度在线观看| 国产不卡免费视频| 亚洲欧美久久久久一区二区三区| 678在线观看视频| 欧美精品久久一区| 欧美色图亚洲激情| 在线中文字幕第一区| 日韩免费黄色av| 911福利视频| 狠狠一区二区三区| 日韩一区视频在线| 久久夜色精品国产噜噜亚洲av| 国产麻豆精品在线| 亚洲a∨一区二区三区| 国产在线88av| 日韩欧美国产三级电影视频| 538精品视频| 亚洲神马久久| 成人av蜜桃| 精品国产99久久久久久| 91福利国产成人精品照片| 日韩少妇一区二区| 欧美精品黄色| 成人精品视频在线| 成人网视频在线观看| 欧美午夜精品久久久久久浪潮 | 免费一区二区三区在线视频| 国产一区二区三区免费视频| 毛片视频网站在线观看| 成人的网站免费观看| 日本黄xxxxxxxxx100| 亚洲伦理久久| 最新中文字幕亚洲| 欧美日韩 一区二区三区| 91免费在线视频观看| 久久国产精品网| 99a精品视频在线观看| 欧美超级乱淫片喷水| 国产免费av电影| 中文字幕在线一区| 九九九九九国产| 99久久夜色精品国产亚洲1000部| 国产精品夜间视频香蕉| av天在线观看| 欧美久久久影院| 免费中文字幕日韩| 国产乱国产乱300精品| 自拍偷拍99| 国产日韩在线观看视频| 久久综合久久八八| av男人天堂av| 亚洲愉拍自拍另类高清精品| 国产精品嫩草69影院| 亚洲一级特黄| 美女主播视频一区| 日韩不卡视频在线观看| 日韩在线视频网站| www.色婷婷.com| 欧美日韩国产精品一区二区三区四区 | 免费拍拍拍网站| 色婷婷狠狠五月综合天色拍 | 中文字幕日本欧美| 97超碰人人模人人人爽人人爱| 亚洲视频你懂的| 国产成人av片| 欧美亚洲一区二区三区| 日韩三级电影网站| 精品久久久久久久久久岛国gif| 欧美高清视频免费观看| 飘雪影视在线观看免费观看| 在线观看av一区| 欧美成人国产精品高潮| 91一区二区三区在线观看| 最新中文字幕2018| 午夜久久一区| 九色视频成人porny| 日本免费一区二区六区| 国产午夜精品视频| aaa国产视频| 天天射综合影视| 国产jjizz一区二区三区视频| 亚洲精选在线| 日本不卡免费新一二三区| 日本久久二区| 国产综合在线看| 素人av在线| 精品国产乱码久久| 亚洲精品久久久久久久蜜桃| 综合av第一页| 18禁裸乳无遮挡啪啪无码免费| 久久精品国产亚洲高清剧情介绍 | 天堂成人在线| 欧美日韩久久久一区| 日本一区二区欧美| 欧美国产综合一区二区| 成人在线短视频| 国产精品久久777777毛茸茸 | 欧美午夜精品久久久久久蜜| 开心久久婷婷综合中文字幕| 欧美国产第二页| 久久精品蜜桃| 亚洲国产欧美一区| 在线免费观看av片| 亚洲高清一区二区三区| 国产sm调教视频| 91丨porny丨首页| 91插插插影院| 裸体素人女欧美日韩| 一区二区不卡在线观看| 亚洲理论电影片| 91色在线观看| 日本久久免费| 日韩视频欧美视频| 国产98在线| 亚洲成色777777女色窝| 一级黄色短视频| 亚洲伊人色欲综合网| www.97视频| 国产三级欧美三级| 中文字幕在线播放视频| 激情五月播播久久久精品| 国产裸体舞一区二区三区| 欧美三级第一页| 最近看过的日韩成人| 日韩免费一区| 国产精品手机在线| 国产一区2区在线观看| 国产精品久久999| 影视一区二区三区| 午夜精品久久久久久久久久久久久| 日本视频在线免费观看| 亚洲欧洲国产精品| 毛片免费在线观看| 亚洲国产天堂久久国产91| 精品人妻一区二区三区三区四区 | 成人性生活视频免费看| 欧美视频导航| 日韩人妻精品一区二区三区| 日韩理论电影院| 亚洲成人一区二区三区| 自拍偷拍欧美一区| 精品久久久久久亚洲| 麻豆一区在线| 国产精品伊人日日| 这里视频有精品| 肥熟一91porny丨九色丨| **日韩最新| 成人精品一区二区三区电影免费| 日本美女久久| 国产欧美日韩综合精品| 91成人短视频在线观看| 成人h视频在线| 婷婷激情成人| 国产欧美日韩精品专区| 精品国模一区二区三区欧美| 亚洲一区二区三区sesese| 人人玩人人添人人澡欧美| 99视频免费观看| 99国产精品免费网站| 国产精品v欧美精品v日韩精品| 99这里只有精品视频| 欧美精品一区二区视频| 欧美极品在线观看| 日韩一本精品| 综合天堂久久久久久久| 国产美女在线一区| 亚洲看片一区| 国产97色在线 | 日韩| 久久99深爱久久99精品| 在线观看免费不卡av| 国产在线精品一区二区夜色| 免费黄色三级网站| 2021国产精品久久精品| 国产中年熟女高潮大集合| 国产婷婷精品av在线| 久久国产精品国语对白| 亚洲国产日韩一级| 一区二区三区福利视频| 欧美午夜不卡在线观看免费| 国产欧美久久久精品免费| 日韩精品一区二| 日色在线视频| 久久久精品影院| 91九色国产在线播放| 国产精品99久久久久久久久久久久| 国模大尺度视频一区二区| 高清av免费一区中文字幕| 欧亚精品一区| 水蜜桃一区二区| 亚洲激情网站| 性欧美videossex精品| 国产69精品久久久久777| 成熟人妻av无码专区| 悠悠色在线精品| 久草视频一区二区| 欧美tickling网站挠脚心| 免费观看成年在线视频网站| 久久中文字幕一区| 国产一区二区精品在线| 99精品视频在线免费播放| 高清日韩一区| 国产一区不卡| 日本一区二区免费高清视频| 国产日韩欧美三区| 超碰人人草人人| 久久亚洲精品小早川怜子| 久久国产一级片| 欧美日韩一级视频| 无码精品一区二区三区在线 | 性高潮免费视频| 中文字幕欧美一区| 中文字幕视频网| 日韩一区二区三| 久久这里精品| 91精品国产91| 一区二区三区日本视频| 日韩高清国产精品| 亚洲区国产区| 亚洲少妇第一页| 久久嫩草精品久久久久| 久久激情免费视频| 欧美二区乱c少妇| 巨大荫蒂视频欧美大片| 热99在线视频| 精品一区二区男人吃奶| 丰满少妇大力进入| 国产一区二区不卡老阿姨| 欧美激情 一区| 91久久精品日日躁夜夜躁欧美| 外国精品视频在线观看 | 色97色成人| 亚洲性生活网站| 久久亚洲一区二区三区明星换脸| 国产一二三四在线| 日韩一级黄色片| 综合图区亚洲| 91丨九色丨国产在线| 亚洲网色网站| 五月天婷婷影视| 日韩一区在线免费观看| 国产男男gay体育生网站| 色视频www在线播放国产成人| 精品欧美一区二区三区在线观看| 日本在线视频不卡| 日韩极品在线观看| 五月婷婷欧美激情| 欧美久久久影院| 国产在线二区| 亚洲最大福利视频| 伊人精品成人久久综合软件| 精品人妻在线视频| 亚洲香蕉伊在人在线观| 午夜福利视频一区二区| 91精品国产91久久久久久吃药| 久久九九热re6这里有精品| 奇米影视亚洲色图| 不卡av在线网| 亚洲天堂视频网站| 最新69国产成人精品视频免费| 黄色精品视频网站| 一区二区三区四区五区视频 | 国产精品色婷婷视频| 日韩大片在线播放| 国产成年人视频网站| 洋洋av久久久久久久一区| 亚洲免费不卡视频| 亚洲3p在线观看| 日本a口亚洲| 小日子的在线观看免费第8集| 亚洲美女精品一区| 丝袜视频国产在线播放| 热久久这里只有精品| 日本一区二区免费高清| 无码国产精品一区二区高潮| 亚洲国产中文字幕在线视频综合 | 国产成人一级片| 伊人激情综合网| 国产精久久一区二区| 免费观看美女裸体网站| 久久久国产精品午夜一区ai换脸| 在线观看视频二区| 97国产在线视频| 成人在线免费小视频| 精品人妻一区二区三| 91精品办公室少妇高潮对白| 国内精品久久久久国产| 久久久久久久久久久久久久一区|