將新方法添加到Java庫以返回流。
我們可以通過以下方式創(chuàng)建流。
在以下部分中,我們將學習如何創(chuàng)建流。
從值創(chuàng)建流
我們可以使用Stream接口的()從單個值和多個值創(chuàng)建順序流。
<T> Stream<T> of(T t) <T> Stream<T> of(T...values)
從方法簽名,我們可以看到第一個of()方法從單個值創(chuàng)建流,而第二個of()方法從不同長度參數(shù)創(chuàng)建流
以下代碼創(chuàng)建包含單個值的流。
import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream=Stream.of("www.w3cschool.cn"); stream.forEach(System.out::println); } }
上面的代碼生成以下結果。
例2
以下代碼創(chuàng)建具有四個字符串的流。
import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream=Stream.of("XML", "Java", "CSS", "SQL"); stream.forEach(System.out::println); } }
上面的代碼生成以下結果。
例3
以下代碼從對象數(shù)組創(chuàng)建流。
import java.util.stream.Stream; public class Main { public static void main(String[] args) { String[] names={ "XML", "Java", "SQL", "CSS" }; Stream<String> stream=Stream.of(names); stream.forEach(System.out::println); } }
上面的代碼生成以下結果。
流構建器
我們可以使用 Stream.Builder<T> 創(chuàng)建流。
以下代碼創(chuàng)建流構建器。
Stream.Builder<String> builder=Stream.builder();
import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream=Stream.<String>builder() .add("XML") .add("Java") .add("CSS") .add("SQL") .build(); stream.forEach(System.out::println); } }
上面的代碼生成以下結果。
IntStream范圍
我們可以使用IntStream接口中的以下兩種方法從一系列int值創(chuàng)建IntStream。
IntStream range(int start, int end) IntStream rangeClosed(int start, int end).
它們創(chuàng)建一個包含開始和結束之間的有序整數(shù)的IntStream。
指定的結束在range()方法中是獨占的,并且在rangeClosed()方法中是包含的。
以下代碼使用這兩種方法創(chuàng)建一個IntStream,它的整數(shù)為1,2,3,4和5作為其元素:
import java.util.stream.IntStream; public class Main { public static void main(String[] args) { IntStream oneToFive=IntStream.range(1, 6); //IntStream oneToFive=IntStream.rangeClosed(1, 5); oneToFive.forEach(System.out::println); } }
像IntStream接口一樣,LongStream類還包含range()和rangeClosed()方法,它們接受類型為long的參數(shù),并返回一個LongStream。
上面的代碼生成以下結果。
空流
空流沒有元素。
我們可以使用empty()靜態(tài)方法從Stream接口以創(chuàng)建空的順序流。
import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream=Stream.empty(); stream.forEach(System.out::println); } }
IntStream,LongStream和DoubleStream接口還包含一個empty()靜態(tài)方法來創(chuàng)建一個空的基本類型流。
以下代碼創(chuàng)建一個空的整數(shù)流。
IntStream numbers=IntStream.empty();
雨青工作站發(fā)文地址:js html input file 類型 實現(xiàn)圖片上傳-白雨青工作站
js html input file 類型 實現(xiàn)圖片上傳
這里只單獨講如何用JS 把選中的文件轉(zhuǎn)成base64 ,然后輸出到前臺顯示
直接上代碼:
AddArticle.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<title>寫文章-白雨青工作站</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="小說,我有一劍,Java,HTML,Java小工具,白雨青工作站,http://www.byqws.com:8080/byqws">
<meta name="description" content="小說,我有一劍,Java,HTML,Java小工具,白雨青工作站,http://www.byqws.com:8080/byqws/">
<!---->
<link rel="shortcut icon" href="img/byqws-apple-touch-icon-16X16.png" />
<link rel="apple-touch-icon" href="img/byqws-apple-touch-icon-57X57.png" />
<link rel="apple-touch-icon" sizes="72x72" href="img/byqws-apple-touch-icon-72X72.png" />
<link rel="apple-touch-icon" sizes="114x114" href="img/byqws-apple-touch-icon-144X144.png" />
<link rel="stylesheet" type="text/css" href="Background/css/addArticle.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<script type="text/javascript" src="js/jquery-1.4.min.js"></script>
<script src="Background/js/tinymce/tinymce.min.js" type="text/javascript" charset="utf-8"></script>
<script src="Background/js/tinymce/langs/zh-Hans.js" type="text/javascript" charset="utf-8"></script> <!--漢化-->
<script type="text/javascript" src="Background/js/AddArticle.js"></script>
<script type="text/javascript" src="Background/js/mytinymce.js"></script>
<script type="text/javascript" src="Background/js/uploadImg.js"></script>
</head>
<body>
<div class='main'>
<div class='title'>
<label >添加一篇文章</label>
</div>
<div class='FTitle_div'>
<input id="FTitle" class='FTitle' placeholder='請輸入標題'></input>
</div>
<div class='FAbstract_div'>
<input id="FAbstract" class='FAbstract' placeholder='請輸入摘要'></input>
</div>
<div class='content_div'>
<textarea id="content" class='content'></textarea>
</div>
<div class="FCover">封面圖片</div>
<div class="upload-piclist">
<div class="upload-file">
<input type="file" id="file" accept="image/*" multiple onchange="imgChange()"/>
</div>
</div>
<input id="submitbutton" class='submitbutton' type='button' value='提交'></input>
</div>
</body>
</html>
<script type="text/javascript" src="Background/js/uploadImg.js"></script>
引入轉(zhuǎn)base64后前臺顯示JS文件
uploadImg.js
let picmax=20; //限制上傳數(shù)量
function imgChange() {
let file=document.getElementById('file').files;
let imglist=document.querySelectorAll('.upload-Picitem');
let piclist=document.getElementsByClassName('upload-piclist')[0];
let filelist=file.length + imglist.length > picmax ? 9 - imglist.length : file.length + imglist.length;
if (file.length + imglist.length >=9) {
let uploadfile=document.getElementsByClassName('upload-file')[0]
uploadfile.style.display="none"
}
for (let i=0; i < filelist; i++) {
readerfile(file[i]).then(e=> {
let html=document.createElement('div');
html.className='upload-Picitem'
html.innerHTML='<img src=' + e + ' alt="pic">'
piclist.appendChild(html);
})
}
}
function readerfile(file) {
return new Promise((resolve, reject)=> {
let reader=new FileReader();
reader.addEventListener("load", function() {
resolve(reader.result);
}, false)
if (file) {
reader.readAsDataURL(file)
}
})
}
//提交
function submit() {
let imglist=[]
//let text=document.getElementsByClassName('upload-textarea')[0].value
let piclist=document.querySelectorAll('.upload-Picitem');
for (let i=0; i < piclist.length; i++) {
imglist.push(piclist[i].lastChild.src)
}
//console.log("發(fā)布內(nèi)容:", text)
console.log("圖片列表:", imglist)
}
直接看結果
在我們平時的開發(fā)中,會遇到用戶提的各種需求,其中有一些還是不得不實現(xiàn)的,常見的就有文檔在線預覽功能,這是一個用戶提出來還不好反駁的功能需求,在用戶看來,這是一個在正常不過的需求,因此今天就介紹三個文檔在線預覽或者編輯(本質(zhì)上是兩種)的解決方案,希望通過本文能幫助到大家解決這樣類似的需求,而且是免費的。
一般情況下,用戶所要求預覽的文檔莫過于Office系列的或者PDF或者圖片,后兩者其實很簡單,一般不需要費多大力氣就能完美解決,基本上可以說瀏覽器自身就已經(jīng)滿足這個需求了,但是看似普通的office文檔想要在線預覽,特別是可能還想編輯,這樣的需求可能就不是那么容易就解決了,特別上網(wǎng)上有很多收費的解決方案,價格較高,而且可能我們并不需要那么強大的功能,因此就會去找一些替代方案來節(jié)省成本,下面我會依次介紹這三種方案。
這種方式相對于后面兩種方案是最簡單的,這種方案的想法是來源于網(wǎng)易郵箱的在線預覽文檔功能,微軟提供了免費的預覽服務:
https://view.officeapps.live.com/op/view.aspx?src=你的文檔地址
這種方式的好處顯而易見,你什么都不需要做,只需要提供文檔的地址就行,當然這也是有前提的,貌似是你的文檔地址必須要是域名形式而且不帶端口號的,也就是說這種方案只能滿足文檔機密性較低,而且滿足上面提到的條件才行。
截圖預覽:
文章第一張圖就是Excel文檔的預覽效果截圖
PPT在線預覽效果:
Word在線預覽效果:
從預覽效果來看和在Office打開無二,是一個非常不錯的選擇,圖片或者PDF就不要使用這個了,還是用瀏覽器自帶的吧!
這種方案適合大多數(shù)情況,我本人也推薦使用這種方式,因為可控性比較高,實際上就是將第一種方式搬到自己本地。部署在自己的服務器上的,本文并不討論具體如何安裝,因為其安裝相對復雜,對環(huán)境要求比較高,這就是它的缺點。微軟自身提供了安裝教程,網(wǎng)絡上也有很多類似的相關介紹,其使用效果和之前的截圖類似,不過如果是自己部署的話是可以實現(xiàn)編輯功能的。
直接搜索“msdn 我告訴你”,除非是有廣告,不然應該第一個就是,然后到服務器菜單下
找到它,如下圖
然后你就可以去找相關教程了,以下是微軟官網(wǎng)的教程,大多數(shù)情況你可能還需要各種搜索
https://docs.microsoft.com/zh-cn/OfficeOnlineServer/office-online-server-overview
如果你覺得上面的方法比較復雜,或者說想先自己嘗試下,那么你也可以使用下面的方案,以下方案是在收集資料的時候發(fā)現(xiàn)的,筆者并未有相關的環(huán)境進行測試,感興趣的網(wǎng)友可以移步到以下地址查看,同時感謝網(wǎng)絡上熱愛分享的同志們
https://www.jianshu.com/p/c67d103484a4
這是國人開源的項目,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4、mp3以及眾多類文本如txt、html、xml、java、properties、sql、js、md、json、conf、ini、vue、php、py、bat、gitignore等文件在線預覽,可以說很全面了,而且部署相對簡單,具體如何部署可以到開源地址:
https://gitee.com/kekingcn/file-online-preview
效果預覽,分別是word、圖片和壓縮文件
從預覽效果上可能比不上Office Online,但是它支持的格式多,而且是開源的,主要使用spring boot,可以部署在windows、linux或者MacOS上,在windows上部署相對簡單一些,最主要的還支持移動端預覽!
以上是我認為基本能夠滿足大多人需求的解決方案了,你可以針對自己的項目選擇適合自己項目的方案,希望能夠通過本文的介紹給大家?guī)硪恍┧悸罚桨负芏啵业揭粋€適合的才是最重要的!
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。