整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java 创建流

Java 创建流

将新方法添加到Java库以返回流。

我们可以通过以下方式创建流。

  • 从值创建流
  • 从空流创建流
  • 从函数创建流
  • 从数组创建流
  • 从集合创建流
  • 从文件创建流
  • 从其他来源创建流

在以下部分中,我们将学习如何创建流。

从值创建流

我们可以使用Stream接口的()从单个值和多个值创建顺序流。

<T> Stream<T> of(T t)
<T> Stream<T> of(T...values)

从方法签名,我们可以看到第一个of()方法从单个值创建流,而第二个of()方法从不同长度参数创建流

以下代码创建包含单个值的流。

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

以下代码创建具有四个字符串的流。

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

以下代码从对象数组创建流。

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> 创建流。

以下代码创建流构建器。

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值创建IntStream。

IntStream range(int start, int end)
IntStream rangeClosed(int start, int end).

它们创建一个包含开始和结束之间的有序整数的IntStream。

指定的结束在range()方法中是独占的,并且在rangeClosed()方法中是包含的。

以下代码使用这两种方法创建一个IntStream,它的整数为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的参数,并返回一个LongStream。

上面的代码生成以下结果。

空流

空流没有元素。

我们可以使用empty()静态方法从Stream接口以创建空的顺序流。

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()静态方法来创建一个空的基本类型流。

以下代码创建一个空的整数流。

IntStream numbers=IntStream.empty();

雨青工作站发文地址:js html input file 类型 实现图片上传-白雨青工作站

js html input file 类型 实现图片上传

这里只单独讲如何用JS 把选中的文件转成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>

引入转base64后前台显示JS文件

uploadImg.js

let picmax=20; //限制上传数量 
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("发布内容:", text)
	console.log("图片列表:", imglist)
}



直接看结果

什么会写这篇文章?

在我们平时的开发中,会遇到用户提的各种需求,其中有一些还是不得不实现的,常见的就有文档在线预览功能,这是一个用户提出来还不好反驳的功能需求,在用户看来,这是一个在正常不过的需求,因此今天就介绍三个文档在线预览或者编辑(本质上是两种)的解决方案,希望通过本文能帮助到大家解决这样类似的需求,而且是免费的。



常见的文档预览格式要求

一般情况下,用户所要求预览的文档莫过于Office系列的或者PDF或者图片,后两者其实很简单,一般不需要费多大力气就能完美解决,基本上可以说浏览器自身就已经满足这个需求了,但是看似普通的office文档想要在线预览,特别是可能还想编辑,这样的需求可能就不是那么容易就解决了,特别上网上有很多收费的解决方案,价格较高,而且可能我们并不需要那么强大的功能,因此就会去找一些替代方案来节省成本,下面我会依次介绍这三种方案。

微软免费提供在线版本office预览

这种方式相对于后面两种方案是最简单的,这种方案的想法是来源于网易邮箱的在线预览文档功能,微软提供了免费的预览服务:

https://view.officeapps.live.com/op/view.aspx?src=你的文档地址

这种方式的好处显而易见,你什么都不需要做,只需要提供文档的地址就行,当然这也是有前提的,貌似是你的文档地址必须要是域名形式而且不带端口号的,也就是说这种方案只能满足文档机密性较低,而且满足上面提到的条件才行。


截图预览:

文章第一张图就是Excel文档的预览效果截图


PPT在线预览效果:



Word在线预览效果:



从预览效果来看和在Office打开无二,是一个非常不错的选择,图片或者PDF就不要使用这个了,还是用浏览器自带的吧!

自部署Office Online Server

这种方案适合大多数情况,我本人也推荐使用这种方式,因为可控性比较高,实际上就是将第一种方式搬到自己本地。部署在自己的服务器上的,本文并不讨论具体如何安装,因为其安装相对复杂,对环境要求比较高,这就是它的缺点。微软自身提供了安装教程,网络上也有很多类似的相关介绍,其使用效果和之前的截图类似,不过如果是自己部署的话是可以实现编辑功能的。

  • get地址

直接搜索“msdn 我告诉你”,除非是有广告,不然应该第一个就是,然后到服务器菜单下

找到它,如下图



然后你就可以去找相关教程了,以下是微软官网的教程,大多数情况你可能还需要各种搜索

https://docs.microsoft.com/zh-cn/OfficeOnlineServer/office-online-server-overview


  • 虚拟机安装

如果你觉得上面的方法比较复杂,或者说想先自己尝试下,那么你也可以使用下面的方案,以下方案是在收集资料的时候发现的,笔者并未有相关的环境进行测试,感兴趣的网友可以移步到以下地址查看,同时感谢网络上热爱分享的同志们


https://www.jianshu.com/p/c67d103484a4


开源的文档在线预览方案 kkFileView

这是国人开源的项目,支持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上部署相对简单一些,最主要的还支持移动端预览!

总结

以上是我认为基本能够满足大多人需求的解决方案了,你可以针对自己的项目选择适合自己项目的方案,希望能够通过本文的介绍给大家带来一些思路,方案很多,要找到一个适合的才是最重要的!